Dubbo 路由
Dubbo 提供了丰富的流量管控策略:
服务发现保证调用方看到最新的提供方实例地址,服务发现机制依赖注册中心 (Zookeeper、Nacos、Istio 等)实现。在消费端,Dubbo 提供了多种负载均衡策略,如随机负载均衡策略、一致性哈希负载、基于权重的轮询、最小活跃度优先、P2C 等。
Dubbo 的流量管控规则可以基于应用、服务、方法、参数等粒度精准的控制流量走向,根据请求的目标服务、方法以及请求体中的其他附加参数进行匹配,符合匹配条件的流量会进一步的按照特定规则转发到一个地址子集。流量管控规则有以下几种:
说明
由于体验 dubbo admin,当前对不具备生产使用的能力。线上误操作容易错。本章节对其成熟稳定的功能进行测试。
标签路由:静态打标的方式
自定义路由:日常我们所需的就近路由。
静态标签路由
provider 配置标签,只能有一个。默认场景下会自动找到按标签匹配。
原理逻辑在TagStateRouter,如果未找到默认会找不携带 tag 的 provider.
dubbo: provider: tag: tag-1
复制代码
consumer 配置
dubbo: consumer: tag: tag-1
复制代码
实际作为消费者有时候需要强制路由到对应 tag。可以添加dubbo.tag.force: true的 parameters 参数。
按 dubbo parameters 参数设计,可以放到 application ,consumer,reference 节点。
dubbo: application: name: ${spring.application.name} # wait ms shut-wait: 30000 registry: address: nacos://localhost:8848 parameters: # 纯消费者时候可以注册上去 register-consumer-url: true consumer: # ms timeout: 2000 retries: 0 # 优先级比parameters高,但实际使用通常针对单个provider设置 tag: tag-1 reference: com.seezoon.protocol.user.server.domain.UserService: # 直连使用url #url: tri://192.168.1.28:9000 parameters: dubbo.tag: tagxxx dubbo.force.tag: true
复制代码
consumer 也可以通过编程方式设置 tag
// 优先级高RpcContext.getContext().setAttachment(Constants.TAG_KEY,"tag1");RpcContext.getContext().setAttachment(Constants.FORCE_USE_TAG,"true");
复制代码
自定义路由
和插件扩展原理一样创建文件 META-INF/dubbo/org.apache.dubbo.rpc.cluster.router.state.StateRouterFactory 放入文本文件
meta=com.seezoon.user.infrastructure.router.MetaStateRouterFactory
复制代码
主要是继承CacheableStateRouterFactory
/** * 元数据路由 */@Activatepublic class MetaStateRouterFactory extends CacheableStateRouterFactory {
@Override protected <T> StateRouter<T> createRouter(Class<T> interfaceClass, URL url) { return new MetaStateRouter(url); }}
复制代码
主要继承AbstractStateRouter
public class MetaStateRouter<T> extends AbstractStateRouter<T> {
public MetaStateRouter(URL url) { super(url); }
@Override protected BitList<Invoker<T>> doRoute(BitList<Invoker<T>> invokers, URL url, Invocation invocation, boolean needToPrintMessage, Holder<RouterSnapshotNode<T>> routerSnapshotNodeHolder, Holder<String> messageHolder) throws RpcException { // 模拟要匹配consumer idc 参数 invokers.removeIf( v -> Objects.equals(url.getParameter("idc"), v.getUrl().getParameter("idc"))); return invokers; }
@Override public void stop() { super.stop(); }
@Override public boolean isRuntime() { return false; }
@Override public boolean isForce() { return true; }}
复制代码
评论