mochengqian opened a new issue, #3302:
URL: https://github.com/apache/dubbo-go/issues/3302

   ### ✅ 验证清单
   
   - [x] 🔍 我已经搜索过 [现有 
Issues](https://github.com/apache/dubbo-go/issues),确信这不是重复问题
   
   ### 🚀 Go 版本
   
   go1.26.1 darwin/arm64
   
   ### 📦 Dubbo-go 版本
   
   dubbo.apache.org/dubbo-go/[email protected]
   
   ### 🖥️ 服务端配置
   
   Dubbo-go v3.3.2-20260419  测试中启动 3 个 provider: - port=20000, environment=dev 
- port=20001, environment=pre - port=20002, environment=prod  服务通过 Nacos 
注册,使用独立 namespace/group。
   
   ### 💻 客户端配置
   
   Dubbo-go v3.3.2-20260419  Consumer 使用 Nacos service discovery 
registry,连接同一个独立 namespace/group。 测试时会 dump consumer 侧 raw invoker URL / routed 
invoker list,并动态下发 condition router 规则。
   
   ### 🌐 协议配置
   
   Triple
   
   ### 📋 注册中心配置
   
   Nacos v2.5.2 ;地址:127.0.0.1:8848 ;模式:standalone ;测试使用唯一 
namespace/group,测试前后清理 configs / instances / mappings。
   
   ### 💾 操作系统
   
   🍎 macOS
   
   ### 📝 Bug 描述
   
   使用 `dubbo.apache.org/dubbo-go/[email protected]` 验证 dubbo-go-samples 的 
Nacos 动态路由场景时,发现 Nacos 服务端可以查询到多个 provider 实例,但 consumer 侧目录 / invoker list 
只暴露其中一个 provider。
   
   因此,当 condition/script/tag 等动态路由规则切换到其他 provider 时,consumer 侧会把 invoker 
过滤为空,最终报 `No provider available`。
   
   同时,provider 使用 `dubbo.WithEnvironment(...)` 设置的 environment 没有进入原始 Nacos 
instance metadata / consumer invoker URL,导致按 environment 做动态路由时缺少可路由属性。
   
   影响范围:
   - `router/condition`
   - `router/script`
   - `router/tag`
   - Nacos service discovery + dynamic router 多 provider 场景
   
   
   ### 🔄 重现步骤
   
   1. 启动 Nacos v2.5.2。
   2. 创建唯一 namespace/group,例如:
      - namespace: `samples-test-debug-<timestamp>`
      - group: `SAMPLES_TEST_DEBUG_<timestamp>`
   3. 启动 3 个 provider,注册到同一个 service:
      - `20000`, environment=`dev`
      - `20001`, environment=`pre`
      - `20002`, environment=`prod`
   4. 通过 Nacos instance API 确认 3 个 provider 都已注册且 healthy。
   5. 启动 consumer,并 dump consumer 侧 raw invoker URL / routed invoker list。
   6. 依次下发动态路由规则:
      - 路由到 `port = 20000`
      - 路由到 `port = 20001`
      - 路由到 `port = 20002`
      - 路由到空结果
      - 恢复到 `port = 20000`
   7. 再验证按 environment 路由:
      - `environment = dev`
      - `environment = pre`
      - `environment = prod`
   8. 观察 consumer 的 raw invoker list、routed invoker list 和 RPC 调用结果。
   
   
   ### ✅ 预期行为
   
   1. Nacos 中同一 service 下有 3 个 healthy provider 时,consumer 侧目录应该能看到全部 3 个 
invoker。
   2. 动态路由从 `20000 -> 20001 -> 20002 -> empty -> restore` 来回切换时,非空目标都应稳定命中对应 
provider。
   3. `dubbo.WithEnvironment(...)` 如果被设计为服务实例环境属性,应进入注册中心 metadata / consumer 
invoker URL,并可用于 condition/script/tag 等路由判断。
   4. 如果某条路由规则确实打空 provider,也应返回清晰的路由未命中错误,而不是因为 consumer directory 缺少 provider 
导致误判。
   
   
   ### ❌ 实际行为
   
   Nacos instance 侧可以看到 3 个 provider:
   
   nacos_instances_count=3
   ports=20000,20001,20002
   
   但 consumer 侧 raw invoker list 只看到一个 provider:
   raw_invokers_count=1
   raw_invoker_ports=20000
   
   baseline 和路由到 port = 20000 可以成功:
   phase=baseline ok=13 err=0 resp_ports=20000:13 raw_ports_seen=20000:13 
routed_ports_seen=20000:13
   phase=port_20000 ok=10 err=0 resp_ports=20000:10 raw_ports_seen=20000:10 
routed_ports_seen=20000:10
   
   路由到 port = 20001 或 port = 20002 时失败:
   phase=port_20001 ok=0 err=10 raw_ports_seen=20000:10 routed_ports_seen=-
   phase=port_20002 ok=0 err=10 raw_ports_seen=20000:10 routed_ports_seen=-
   
   错误信息:
   Failed to invoke the method Greet.
   No provider available for the service ...
   raw=[...:20000 ...]
   routed=[]
   
   按 environment 路由也只能命中 consumer 已经看到的那个 provider:
   phase=env_dev ok=10 err=0 resp_ports=20000:10 resp_envs=dev:10
   phase=env_pre ok=0 err=10 raw_ports_seen=20000:10 routed_ports_seen=-
   phase=env_prod ok=0 err=10 raw_ports_seen=20000:10 routed_ports_seen=-
   
   Nacos 服务端实际仍然有 3 个 healthy providers:
   ports=20000,20001,20002
   environments=dev,pre,prod
   healthy=true
   
   
   ### 💡 可能的解决方案
   
   建议检查 Nacos registry directory / service instance 到 invoker URL 的转换链路:
   
   1. 增加 Nacos 多 provider 集成测试:
      - 同一 service 注册 3 个 provider;
      - consumer directory 能看到 3 个 invoker;
      - provider kill/restart 后 invoker list 正确更新;
      - condition/script/tag router 可以在多个 provider 间切换。
   
   2. 检查 service instance metadata 到 consumer invoker URL 的映射逻辑,确认为什么 consumer 
侧只保留了一个 provider。
   
   3. 明确 `dubbo.WithEnvironment(...)` 的正式语义:
      - 如果 environment 是可路由属性,应写入 service instance metadata 并映射到 consumer 
invoker URL;
      - 如果 environment 不应作为路由属性,需要在 API 文档和 samples 中说明。
   
   4. 为 router/condition、router/script、router/tag samples 增加唯一 namespace/group 
和清理逻辑,避免历史 Nacos 数据污染测试结果。
   
   5. 增加调试日志或测试辅助输出,方便对比:
      - Nacos instance list;
      - service instance metadata;
      - consumer raw invoker list;
      - router filter 前后 invoker list。
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to