apache / dubbo

The java implementation of Apache Dubbo. An RPC and microservice framework.
https://dubbo.apache.org/
Apache License 2.0
40.5k stars 26.43k forks source link

[3.0] Meaningless/Confusing "key" in dynamic config's yaml #8370

Open zhangyz-hd opened 3 years ago

zhangyz-hd commented 3 years ago

Environment

Steps to reproduce this issue

服务提供者端,传统服务发现模式,配置中心使用zookeeper或者apollo,注册2个服务

<dubbo:registry address="zookeeper://127.0.0.1:2181"/>

<dubbo:config-center address="zookeeper://127.0.0.1:2182"/>

消费者启动后,会在配置中心监节点级别的动态配置和服务级别的动态配置,以zookeeper为例,会监听:

  1. 节点级,path=/dubbo/config/dubbo/demo-provider.configurators
  2. 服务级,path=/dubbo/config/dubbo/org.apache.dubbo.demo.DemoService:1.2.3:G1.configurators
  3. 服务级,path=/dubbo/config/dubbo/org.apache.dubbo.demo.GreetingService:4.5.6:G2.configurators

场景1,节点级配置

/dubbo/config/dubbo/demo-provider.configurators写入DemoService的动态配置

configVersion: v2.7
scope: service
key: G1/org.apache.dubbo.demo.DemoService:1.2.3
configs:
- addresses: ['0.0.0.0:20880']
  side: provider
  parameters:
    weight: 222

根据提供者reExport日志,发现DemoService和GreetingService都按weight=222进行了重新注册。

场景2,服务级配置

/dubbo/config/dubbo/org.apache.dubbo.demo.DemoService:1.2.3:G1.configurators写入DemoService的动态配置

configVersion: v2.7
scope: service
key: AAAAA  <--瞎写就行
configs:
- addresses: ['0.0.0.0:20880']
  side: provider
  parameters:
    weight: 333

根据提供者reExport日志,发现DemoService按weight=333进行了重新注册。

总结

  1. 可以发现yaml中的key没有实际存在的意义,因为key中的服务信息,在DynamicConfiguration实现,以及ConfigChangeListener中都有,在AbstractConfiguratorListener#genConfiguratorsFromRawRule传入即可。此处key属性可取消。
  2. 作为scope: service的配置,写入节点级配置路径也能生效,此处最好能控制监听逻辑。节点级只响应scope:application的yaml,服务级只响应scope:service的yaml,或者也可取消scope属性。
zonghaishang commented 3 years ago

可以发现yaml中的key没有实际存在的意义,因为key中的服务信息,在DynamicConfiguration实现,以及ConfigChangeListener中都有,在AbstractConfiguratorListener#genConfiguratorsFromRawRule传入即可。此处key属性可取消。

key是必要的,需要构建完整的override规则。因为配置规则value是个完整yaml, scope=application,应用名字取自key。 scope=service,接口取自key。 因此多个配置,需要增加解析override url做一下key的过滤,目前没有过滤逻辑的。

作为scope: service的配置,写入节点级配置路径也能生效,此处最好能控制监听逻辑。节点级只响应scope:application的yaml,服务级只响应scope:service的yaml,或者也可取消scope属性。

类似前面的回复,同样缺少一层规则是否match过滤。

zonghaishang commented 3 years ago

场景1,节点级配置

向/dubbo/config/dubbo/demo-provider.configurators写入DemoService的动态配置, 正确用法不应该指定service, 应该采用下列用法:

configVersion: v2.7
scope: application
key: appname
configs:
- addresses: ['0.0.0.0:20880']
  side: provider
  parameters:
    weight: 222