路由规则
Dubbo中的路由规则是微服务架构中实现流量控制和分发的重要机制,它决定了客户端请求将被路由到哪些目标服务提供者实例。
路由规则的核心概念
路由规则本质上是一组条件判断逻辑,包含以下关键要素:
- 匹配条件:定义哪些服务调用需要应用该路由规则
- 过滤条件:指定目标服务提供者需要满足的条件
- 优先级:决定规则的执行顺序
- 路由策略:决定符合条件的服务提供者如何被选择
常用路由规则类型
1. 标签路由
根据服务提供者的标签进行路由分发,常用于灰度发布。
tagRouter=consumerTag=test => providerTag=test
2. 条件路由
基于方法名、参数等条件进行路由:
conditionRouter=method=findUser => host=192.168.1.*
3. 脚本路由
使用脚本语言定义复杂路由逻辑:
scriptRouter=JavaScript (host.contains("192.168.1")) => host.contains("192.168.1")
路由规则的执行流程
- 规则解析:Dubbo启动时加载并解析路由规则配置
- 规则匹配:根据调用信息匹配适用的路由规则
- 提供者过滤:根据规则条件过滤可用的服务提供者列表
- 负载均衡:在过滤后的提供者列表中应用负载均衡策略
- 请求发送:将请求发送到选定的服务提供者实例
典型应用场景
- 灰度发布:通过标签路由将部分用户流量引导到新版本服务
- 机房路由:根据调用方位置将请求路由到同机房的服务提供者
- 流量隔离:隔离测试流量和正式流量
- 故障隔离:自动将故障实例从路由列表中剔除
- 多版本管理:同时维护多个服务版本,按需路由请求
快速入门
// 自己定义规则
String rule = "consumer.host != 127.0.0.1";
String encodedRule = URLEncoder.encode(rule, "UTF-8");
String routerUrl = String.format(
"condition://localhost/%s?category=routers&router=condition&rule=%s",
serviceInterface, encodedRule
);
URL conditionUrl = URL.valueOf(routerUrl);
registry.register(conditionUrl);
系统结合与灰度发布机制详解
上线系统的作用与必要性
当公司业务发展到中等规模以上(通常超过50台服务器或日活用户超过百万级别),建立专业的上线系统就变得尤为重要。
优雅下线解决方案
public void shutdown() {
// 1. 从路由规则移除本机
registry.unregister(serviceName, currentIP);
// 2. 等待现有请求完成(默认30秒)
Thread.sleep(30000);
// 3. 强制关闭剩余长连接
forceShutdown();
}
上线过程中的最佳实践
- 冷启动保护:服务启动后延迟注册
# 等待30秒后再注册服务
dubbo.service.delay=30000
-
渐进式流量接入:初始阶段通过标签路由分配5%流量
-
预热期配置:
<dubbo:reference>
<dubbo:parameter key="warmup" value="60000"/>
<dubbo:parameter key="weight" value="50"/>
</dubbo:reference>
表示新节点在60秒内从50%权重逐步提升至100%。