2026-08-04
今日主题
- Dubbo Router 链式排序与组合语义
- Dubbo TagRouter 设计模型
新增认知
Dubbo Router 链式排序与组合语义
-
级联过滤而非并列筛选:RouterChain.route() 把上一个 Router 过滤后的 invokers 直接作为下一个 Router 的输入,
是链式收窄,不是各 Router 独立筛选后取交集。前提是只要项目里挂了多个自定义 Router(如 tag 路由 + 小得物环境路由),
前面 Router 淘汰掉的实例,后面 Router 永远看不到、也捞不回来。 -
priority 数值越小越先执行:
Router 接口的 compareTo 用 Integer.compare(getPriority(), o.getPriority()),
RouterChain 排序时直接 Collections.sort 做自然排序,结果是 priority 数值小的排在前面、先执行。
这跟直觉里权重越高越优先是反的,看到某个 Router 的 priority 数值,要按数值小=先跑去理解它在链路里的位置。 -
小得物环境灰度寄生在 tag 分组内部:本项目里 TagRouter priority=100,XdwEnvRouter priority=200,
数值更大排后面,所以小得物环境路由只能在 tag 路由已经筛出的子集里做二次过滤,不是独立于 tag 路由的第二套全局灰度体系。边界条件:
某个 tag 分组下如果既没有目标小得物环境的实例,也没有未打任何环境标记的基准实例兜底,这个分组会直接查不到可用实例(No Provider),
即使其他 tag 分组或全局确实存在匹配的小得物实例。
Dubbo TagRouter 设计模型
-
双机制叠加是复杂度来源:
TagRouter 同时支持静态 tag(实例 URL 自带的标签参数)和动态 tag(配置中心下发、按 IP:Port 地址分组的规则),
外加一个 force 兜底开关,三个维度组合才显得绕;单独看每个维度逻辑都很直白:请求 tag 对上实例 tag 就路由过去。 -
动态地址分组优先于静态标签:动态 tag 规则的价值是让运维通过配置中心把具体机器地址临时划进某个 tag 分组,不需要重新发布服务改标签;
匹配顺序上动态地址分组优先,分组里找不到才退回看实例自带的静态 tag。 -
force 开关决定兜底还是报错:找不到匹配 tag 的实例时,force=false(默认)自动降级到没打 tag 的基准实例,保证请求不失败;
force=true 则直接报错不兜底。这是灰度失败可用基准实例顶上和强制隔离宁可失败两种业务诉求的开关。