Skip to content

[Admin Feature] Align router in Dubbo-Go on Dubbo-Java version and Dubbo-Admin #1523

Description

@robocanic

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

Why is this needed:

Activity

  1. xiaobaicai66695 commented on Aug 10, 2026

    @xiaobaicai66695
    Contributor

    ask for assign

  2. xiaobaicai66695 commented on Aug 13, 2026

    @xiaobaicai66695
    Contributor

    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
    • 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 与外部 YAML affinityAware 的双向转换。
    • 完整 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 的 []string conditions 处理,无法无损保存 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-router suffix。
    • 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-router
    application <provider-application>.affinity-router
    configVersion: 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-router upsert/delete。
    • Nacos 增加 *.affinity-router watcher,并补齐 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=dubbo
    
    configVersion: v3.0
    scope: application
    key: demo-provider
    enabled: true
    type: javascript
    script: |
      (function route(invokers, invocation, context) {
        return invokers;
      })()
    • 新增 ScriptRoute proto、生成代码、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-router upsert/delete。
    • Nacos 增加 *.script-router watcher,并补齐 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 能同步列表和详情。
  3. robocanic commented on Aug 13, 2026

    @robocanic
    ContributorAuthor

    已有的几个router在dubbogo侧是否work还需要进一步验证

  4. xiaobaicai66695 commented on Aug 13, 2026

    @xiaobaicai66695
    Contributor

    已有的几个router在dubbogo侧是否work还需要进一步验证

    收到,会做从admin到 go微服务实例的e2e验证

  5. xiaobaicai66695 commented on Aug 13, 2026

    @xiaobaicai66695
    Contributor

    在 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行左右)
    Image
    Image

    // 修正前
    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

  6. Alanxtl commented on Aug 15, 2026

    @Alanxtl
    Member

    @robocanic 才哥 先不要推进这项任务 这个工作我们已经作为dubbogo的ospp任务发布了

  7. robocanic commented on Aug 16, 2026

    @robocanic
    ContributorAuthor

    @xiaobaicai66695 你可以在ospp上申请这个任务,和 @Alanxtl 讨论下

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions