路由规则

Dubbo中的路由规则是微服务架构中实现流量控制和分发的重要机制,它决定了客户端请求将被路由到哪些目标服务提供者实例。

路由规则的核心概念

路由规则本质上是一组条件判断逻辑,包含以下关键要素:

  1. 匹配条件:定义哪些服务调用需要应用该路由规则
  2. 过滤条件:指定目标服务提供者需要满足的条件
  3. 优先级:决定规则的执行顺序
  4. 路由策略:决定符合条件的服务提供者如何被选择

常用路由规则类型

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")

路由规则的执行流程

  1. 规则解析:Dubbo启动时加载并解析路由规则配置
  2. 规则匹配:根据调用信息匹配适用的路由规则
  3. 提供者过滤:根据规则条件过滤可用的服务提供者列表
  4. 负载均衡:在过滤后的提供者列表中应用负载均衡策略
  5. 请求发送:将请求发送到选定的服务提供者实例

典型应用场景

  1. 灰度发布:通过标签路由将部分用户流量引导到新版本服务
  2. 机房路由:根据调用方位置将请求路由到同机房的服务提供者
  3. 流量隔离:隔离测试流量和正式流量
  4. 故障隔离:自动将故障实例从路由列表中剔除
  5. 多版本管理:同时维护多个服务版本,按需路由请求

快速入门

// 自己定义规则
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();
}

上线过程中的最佳实践

  1. 冷启动保护:服务启动后延迟注册
# 等待30秒后再注册服务
dubbo.service.delay=30000
  1. 渐进式流量接入:初始阶段通过标签路由分配5%流量

  2. 预热期配置

<dubbo:reference>
  <dubbo:parameter key="warmup" value="60000"/>
  <dubbo:parameter key="weight" value="50"/>
</dubbo:reference>

表示新节点在60秒内从50%权重逐步提升至100%。