Skip to content

feat(router): add affinity and script rule management - #1553

Merged
robocanic merged 12 commits into
apache:developfrom
xiaobaicai66695:feat/affinity-script-config-center
Nov 2, 2026
Merged

robocanic merged 12 commits into
apache:developfrom
xiaobaicai66695:feat/affinity-script-config-center

Conversation

@xiaobaicai66695

@xiaobaicai66695 xiaobaicai66695 commented Sep 12, 2026 •

Copy link
Copy Markdown
Contributor

Scope

Consolidates the original config-center work in #1553 with the Console API work from #1554.

  • Adds Affinity and Script router-rule support for ZooKeeper and Nacos config centers.
  • Adds the protected Console CRUD, version, diff, and rollback APIs.
  • Preserves optional Affinity/Script fields across detail, edit, history, and rollback.
  • Preserves explicit false values for existing condition/tag router booleans.
  • For Nacos Script deletion, publishes a disabled transition before removing the dataId so existing Dubbo-Go consumers clear the active script.

ZooKeeper compatibility

Rules use the canonical grouped path /dubbo/config/dubbo/<name>. The legacy flat path /dubbo/config/<name> is intentionally neither read nor modified; existing flat entries remain untouched and must be migrated explicitly if needed.

Verification

  • go test ./pkg/core/resource/apis/mesh/v1alpha1 ./pkg/governor/zk ./pkg/governor/nacos2 ./pkg/discovery/zk ./pkg/console/router ./pkg/console/service
  • API-level Gin tests cover authenticated CRUD/search/version/diff/rollback and optional-field presence.

Supersedes #1554.

@sonarqubecloud

Copy link
Copy Markdown

Comment thread pkg/discovery/zk/factory.go Resolved
@xiaobaicai66695
xiaobaicai66695 force-pushed the feat/affinity-script-config-center branch from ea1c657 to 9b4062f Compare October 17, 2026 08:59

@robocanic robocanic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查意见

整体方向(让 ZK/Nacos 的 discovery 与 governor 支持 affinity / script 规则)没有问题,但发现以下需要处理的问题:

1. 回归:condition / tag 规则的布尔值保护被移除(高置信度)

  • pkg/governor/zk/governor.go:141-146、pkg/governor/nacos2/governor.go:181-186:新增的 marshalRule 对非 affinity/script 的 kind 直接走 yaml.Marshal(r.ResourceSpec()),不再调用 meshresource.MarshalRuleSpec。
  • 而 MarshalRuleSpec 正是 #1595(preserve condition and tag rule boolean values)为 ConditionRoute / TagRoute 引入的:protobuf 的 JSON tag 带 omitempty,enabled/force/runtime = false 会被省略,运行时对“缺省”和“显式 false”的处理不同。
  • 现在 CreateRule / UpdateRule 写 ZK / Nacos 时又会丢掉 enabled: false 等字段,等于把 #1595 的修复回滚了;同时 MarshalRuleSpec 在非测试代码中已没有调用方。
  • 建议:marshalRule 的 default 分支改为 meshresource.MarshalRuleSpec(r.ResourceSpec())(或让 EncodeRule 的 default 分支调用它),并把两个 governor 中重复的 marshalRule 合并到 meshresource 包中。

2. 缺失测试(与 PR 描述不一致)

  • PR 描述写明“add focused ZooKeeper factory and governor coverage”,并列出了 go test ./pkg/discovery/zk ./pkg/governor/zk;但最终 diff 中没有任何测试文件——2be080f8 把 pkg/discovery/zk/factory_test.go、pkg/governor/zk/governor_test.go 整个删掉了。我在 PR head 上执行 go test ./pkg/governor/... ./pkg/discovery/...,这些包均为 [no test files]。
  • 本 PR 新增的关键逻辑完全没有覆盖:zkConfigName 的路径解析、ensurePath、UpdateRule 在 ErrNoNode 时回退 Create、affinity/script 的 upsert/delete 分发、GetConfigAndUpdateStore 的新分支。上面第 1 点的回归如果有测试(condition/tag 的 enabled:false 写入内容断言)本可以被发现。
  • 建议至少补:zkConfigName 表驱动测试;marshalRule 对 condition/tag(enabled/force/runtime=false 仍存在)与 affinity/script 的输出断言。

3. 兼容性:所有 ZK 规则的存储路径由 /dubbo/config/<name> 改为 /dubbo/config/dubbo/<name>

  • pkg/discovery/zk/factory.go:149-157、pkg/governor/zk/governor.go:148-154:路径变更对既有的 configurators / condition-router / tag-router 也生效,不只是新增的两种规则。zkConfigName 只接受 4 段分组路径,升级后之前写在扁平路径 /dubbo/config/<name> 下的规则不会再被发现,在控制台 Update 也会在新路径创建一个新节点,旧的扁平节点会残留在 ZK 中且不再被管理。
  • 按 Dubbo 3 的分组路径是合理的,但这是对现有用户的行为变更,建议在 PR 描述里明确说明(或提供兼容读取 / 迁移说明),并补上对应测试。

@xiaobaicai66695 xiaobaicai66695 changed the title feat(router): support affinity and script config centers feat(router): add affinity and script rule management Oct 19, 2026
@AsperforMias

AsperforMias commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

之前好像把 #1595 的部分内容覆盖了,我起个zk看下现在的情况

@AsperforMias AsperforMias left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

本地用 ZooKeeper 3.9.6 走了真实 RuleGovernor.CreateRule / UpdateRule 再读回节点:condition/tag 的显式 enabled/force/runtime: false 会保留;affinity/script 显式 false 同样保留。#1595 指出的 yaml.Marshal / omitempty 回归路径不在当前 governor 写入链上。

缺省(省略)affinity/script enabled 会被规范化成 true 再发布——这是有意行为,不等于冲掉显式 false。CI 也全绿。

@AlexStocks AlexStocks left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

结论:整体质量高,有一处语义变更需要确认后再合入

25 个文件,changed_files=25 与 Diff 一致。新增 affinity / script 两类路由规则的 Console API、编解码、版本历史与回滚,并补齐 ZooKeeper / Nacos 的 governor 与 discovery 支持。

做得好的地方

  • RuleResourceKinds 同步加入了 AffinityRouteKind / ScriptRouteKind,ZK 订阅者的 upsert / delete 与 extractRuleEventContext 都补齐了,链路完整。
  • createRule / updateRule 在加锁前统一调用 ValidateRule,避免把非法规则写进历史版本。
  • validRouterRuleName 返回 400,与既有的 condition_rule.go 约定一致,没有另造一套。
  • RouterRuleSearchResp 特意不回传脚本文本,只在详情接口返回,减少了列表接口的数据暴露面。

P2 · enabled 的默认值从「省略」翻转为 true

DecodeRule 现在对 Affinity 和 Script 都先执行 res.Spec.Enabled = true,只有 YAML 显式给出 enabled 时才覆盖;EncodeRule 也改成始终写出 Enabled。注释给出的理由是「consumer 对省略值处理不安全」,对 ScriptRouter 来说这个理由成立。

但对 Affinity 而言,这会把历史上省略 enabled 的存量配置从「运行时按 false 处理」变成「下次写入后变成 true」。也就是说,管理员只是在 Console 里打开并保存一次规则,就可能把一条原本未启用的规则真正启用。这是可观察的行为变化,建议确认:

  1. dubbo-go 的 AffinityRouter 对缺省 enabled 的实际处理确实是 false 吗?
  2. 如果是,是否需要在迁移时保留「来源是省略」的信息,而不是统一归一化为 true?

如果这是有意为之(比如线上从未依赖省略语义),请在 PR 描述里明确写出,避免升级方误判。

P3 · 两个 Search 的错误处理不一致

SearchAffinityRules 在 PageListByIndexes 失败时包装成 bizerror.InternalError 并记录日志;SearchScriptRules 直接 return nil, err。两者行为应该一致,否则同一类后端错误在两个接口上会呈现不同的业务码。

P3 · GetScriptRule 缺少日志

GetAffinityRule 在出错时会 logger.Warnf,GetScriptRule 直接返回。不影响正确性,但排障时两条路径的可观测性不一致。

@sonarqubecloud

Copy link
Copy Markdown

@robocanic
robocanic merged commit b575e11 into apache:develop Nov 2, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants