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
/**
* 元数据路由
*/
@Activate
public 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;
}
}
复制代码
评论