Repository navigation
[Admin Feature] Align router in Dubbo-Go on Dubbo-Java version and Dubbo-Admin #1523
Description
Activity
ask for assign
Router 规则下发链路实施计划
1. 目标
以
develop为实现基线,打通 Router 规则的完整下发与生效链路:Admin 前端 -> Console API 校验与建模 -> ResourceManager / RuleGovernor -> Zookeeper / Nacos 配置中心 -> dubbo-go DynamicConfiguration -> RouterChain 生效同时补齐 Admin 对配置中心规则的回读:
Zookeeper / Nacos -> Admin config watcher -> ResourceStore -> Admin 列表 / 详情本期优先保证规则能够正确创建、更新、删除并真实影响 dubbo-go 路由结果。可靠性和完整治理拆到后续维护阶段。Java 侧只作为协议参考,不属于修改范围。
2. develop 基线下的核心缺口
2.1 已有 Router 链路仍需修正
- Condition 的 Service Argument Route 在规则不存在时仍走 Update,需要改为 Create/Update upsert,并处理已有规则
Spec == nil。 - Condition 前端生成的规则名需要统一:
- service:
<interface>:<version>:<group>.condition-router - application:
<application>.condition-router
- service:
- Tag 只支持 application 粒度,表单和 YAML 页面均应生成
<provider-application>.tag-router,不能混入 service/config version 信息。
2.2 配置中心公共链路不完整
- ZK 规则目前未按标准 group 写入,应统一为
/dubbo/config/dubbo/<rule-key>,并支持自动创建父节点以及 Update 时节点不存在的场景。 - ZK RuleGovernor 和 config watcher 应使用
Address.ConfigCenter;registry、mapping、metadata 等 watcher 仍使用各自原有地址。未配置 ConfigCenter 时沿用现有回退到 Registry 的行为。 - ZK watcher 需要同时识别标准规则节点和必要的 legacy 节点,但必须过滤
/dubbo/config、/dubbo/config/dubbo等根节点。 - 新规则写入不得顺带删除外部 legacy 配置;legacy 迁移和清理另行处理。
- ZK/Nacos Governor 目前直接序列化内部 proto,无法保证每类 Router 的外部 YAML 契约,需要增加按
ResourceKind分派的 codec。
2.3 Affinity 缺少完整 Admin 链路
develop已有 Affinity proto/resource 和少量 console service,但仍缺:AffinityRouteKind接入RuleResourceKinds。- 内部
affinity与外部 YAMLaffinityAware的双向转换。 - 完整 Console API、ZK subscriber、Nacos watcher/Governor 转换。
- 前端 CRUD 入口。
- 从 Admin 发布到 dubbo-go RouterChain 生效的真实 E2E。
2.4 Condition v3.1 缺少无损管理链路
dubbo-go 已有 Condition v3.1 的部分解析和路由能力,Admin 也定义了部分
ConditionRule/From/To辅助结构,但当前主资源、通用响应和配置转换仍主要按 v3.0 的[]stringconditions 处理,无法无损保存 v3.1 的结构化from/to/weight。需要补齐:
- 能同时表达 v3.0 字符串 conditions 和 v3.1 结构化 conditions 的版本化模型。
- v3.1 YAML 的双向无损 codec,回读和再次下发不得降级成 v3.0 字符串。
- Console API 和前端对 v3.1 的创建、编辑、详情展示与版本判别。
- ZK/Nacos 下发和回读对 v3.1 结构的完整保留。
- 从 Admin 发布到 dubbo-go v3.1 Condition Router 生效的 E2E。
2.5 Script 缺少完整 Admin 链路
dubbo-go 已实现 Script Router,但 Admin 尚无对应资源和管理能力,需要新增:
- Script proto/resource、ResourceKind 和
.script-routersuffix。 - Script 外部 YAML codec。
- Console API、ZK/Nacos 发布与回读。
- 前端脚本编辑和 CRUD 入口。
- 从 Admin 发布到 dubbo-go 编译、执行和删除失效的 E2E。
Script 本期遵循 dubbo-go 当前能力边界:只作用于 consumer、只支持 application 粒度、规则名为
<provider-application>.script-router,脚本类型只允许已注册的javascript。3. 核心实施计划
阶段一:修正公共下发基础和已有规则
- 修复 Service Argument Route 的 Create/Update upsert,并增加首次创建、已有规则更新和 nil Spec 测试。
- 统一 Condition service/application 规则名,补齐前端表单测试。
- 统一 Tag application 规则名,修复表单和 YAML 页面并补齐测试。
- 增加配置 group 常量
dubbo,ZK 统一写入/dubbo/config/dubbo/<rule-key>。 - ZK Create 自动创建缺失父节点;Update 在标准节点不存在时完成创建。
- RuleGovernor 和 config watcher 改用
Address.ConfigCenter,并验证 Registry 与 ConfigCenter 分离场景。 - 过滤 ZK 配置根节点,保留必要的 legacy 只读兼容,但不自动删除 legacy 数据。
- 建立公共规则编码入口,使 ZK/Nacos 使用同一份外部 YAML。
阶段二:补齐 Affinity
外部契约:
scope rule key service <interface>:<version>:<group>.affinity-routerapplication <provider-application>.affinity-routerconfigVersion: v3.1 scope: service key: org.apache.demo.DemoService:1.0.0:demo enabled: true runtime: true affinityAware: key: region ratio: 80
- 将
AffinityRouteKind加入 Governor 支持集合。 - 实现 Affinity encode/decode,确保外部字段为
affinityAware,并增加 round-trip 测试。 - 校验 scope、key、规则名、affinity key 以及
[0, 100]的 ratio。 - 补齐 search/detail/create/update/delete 的 model、handler、service 和
/api/v1路由。 - ZK subscriber 增加
.affinity-routerupsert/delete。 - Nacos 增加
*.affinity-routerwatcher,并补齐 Governor 回读转换。 - 增加 Affinity 最小前端 CRUD,支持 service/application 两种 scope。
阶段三:补齐 Condition v3.1 无损链路
v3.1 外部结构示例:
configVersion: v3.1 scope: service key: org.apache.demo.DemoService:1.0.0:demo enabled: true force: false runtime: true conditions: - from: match: env=gray to: - match: env=gray weight: 100 - match: env!=gray weight: 0
- 设计版本化 Condition 内部模型:v3.0 保留
[]string,v3.1 保留结构化from/to/weight,两者不能相互覆盖或静默降级。 - 实现按
configVersion分派的 Condition encode/decode,并增加 v3.0、v3.1 和跨版本 round-trip 测试。 - 补齐 v3.1 的 scope、key、规则名、from/to、match 和 weight 校验;非法结构必须在写入配置中心前失败。
- 调整 Condition Console API 的请求、响应和详情逻辑,使 v3.1 结构能够完整创建、更新和查询。
- 调整 ZK subscriber、Nacos watcher 和 Governor 回读转换,保证外部 v3.1 YAML 进入 Store 后仍保持原结构。
- 前端按
configVersion切换 v3.0/v3.1 编辑方式;至少支持 v3.1 YAML 创建、编辑和详情展示,不得把结构化 conditions 转成字符串。 - 保持 Condition v3.0 现有 API 和配置兼容,并增加回归测试。
阶段四:新增 Script Router Admin 链路
外部契约:
规则名:<provider-application>.script-router ZK:/dubbo/config/dubbo/<provider-application>.script-router Nacos:DataId=<provider-application>.script-router, Group=dubboconfigVersion: v3.0 scope: application key: demo-provider enabled: true type: javascript script: | (function route(invokers, invocation, context) { return invokers; })()
- 新增
ScriptRouteproto、生成代码、Resource/ResourceList 和ScriptRouteKind。 - 增加
.script-router常量并接入 suffix set 和 Governor 支持集合。 - 实现 Script encode/decode 和 round-trip 测试。
- 后端强制 application scope、
javascript类型、非空脚本和脚本大小上限;Admin 不执行脚本。 - 补齐 search/detail/create/update/delete 的 model、handler、service 和
/api/v1路由。 - ZK subscriber 增加
.script-routerupsert/delete。 - Nacos 增加
*.script-routerwatcher,并补齐 Governor 回读转换。 - 增加 Script 最小前端 CRUD 和多行脚本编辑器。
阶段五:端到端验收
- Condition 和 Tag 各执行一次 create/update/delete,确认规则名、ZK/Nacos 位置和回读正确。
- Condition v3.1 分别验证 service/application 规则,确认多条 from/to、多个 destination 和 weight 在 Admin、配置中心及回读过程中无损,并真实改变路由结果。
- Affinity 分别验证 service/application key,create/update 后路由结果改变,delete 后恢复。
- Script 验证
<provider-application>.script-router被 consumer 监听,create/update 后新脚本生效,delete 后脚本失效。 - Zookeeper 和 Nacos 均验证 Admin 请求、配置中心真实内容、dubbo-go 配置事件和最终 invoker 结果。
- 外部直接修改或删除配置后,Admin watcher 能同步列表和详情。
- Condition 的 Service Argument Route 在规则不存在时仍走 Update,需要改为 Create/Update upsert,并处理已有规则
已有的几个router在dubbogo侧是否work还需要进一步验证
已有的几个router在dubbogo侧是否work还需要进一步验证
收到,会做从admin到 go微服务实例的e2e验证
在 E2E 验证中,Condition Router v3.1 规则能够正常下发并生效;将同一配置中心节点切换为语义等价的 v3.0 规则后,consumer 仍在两个 provider 之间随机调用。
经确认,Admin → ZooKeeper → dubbo-go 配置监听链路正常。问题出在 dubbo-go 的 v3.0 解析函数 generateConditionsRoute:enabled 与 force 的赋值顺序颠倒。
(问题代码出现在cluster/router/condition/dynamic_router.go296行左右)


// 修正前
force, enable := *routerConfig.Enabled, *routerConfig.Force// 修正后
force, enable := *routerConfig.Force, *routerConfig.Enabled
因此,配置中的:
enabled: true
force: false
修正前会被解释为 enable=false, force=true,导致 DynamicRouter 跳过 v3.0 条件路由,直接使用原始 invoker 列表。
修正后重新验证,v3.0 规则能够正常执行,同时验证了从 v3.1 热切换至 v3.0 后规则可正常生效。
Related issue: apache/dubbo-go#3656@robocanic 才哥 先不要推进这项任务 这个工作我们已经作为dubbogo的ospp任务发布了
@xiaobaicai66695 你可以在ospp上申请这个任务,和 @Alanxtl 讨论下


What would you like to be added:
将dubbo-go中的router能力对齐dubbo-java,打通admin的下发规则链路
Why is this needed: