现状:
dubbo 2.7.9 及之前,在使用dubbo-spring-boot 组件时会将spring environment配置属性注入到dubbo environment propertiesConfiguration 中。如果不使用dubbo-spring-boot 组件,则不会注入spring配置属性。这种不一致的行为给dubbo 属性配置覆盖带来了困难。
优化目标:
1、如果应用使用了Spring框架,不管是否使用dubbo-spring-boot,dubbo environment 配置都会引入spring environment的property sources。目的是打通配置,然后在AbstractConfig.refresh() 的属性覆盖处理时可以使用到spring的配置属性。
配置优先级查找顺序为(前面的比后面的优先级高): system props > java environment > config-center app config > config-center global config > spring environment > dubbo.properties in classpath
Dubbo 3 属性配置说明
2、统一梳理配置属性,并移除configCenterFirst / include-spring-env 这两个参数。 注: include-spring-env 参数保持不变,用于从Spring Environment中提取dubbo.properties等配置的内容,并将内容解析为properties,作为Dubbo 外部配置。
3、支持service/reference 方法属性配置覆盖,包括API/xml/注解三种不同的场景都支持 Dubbo 2.7.8 在properties文件中指定service的registry不生效
似乎存在属性配置矛盾: 强制覆盖 or 默认配置 不清晰? 1、Dubbo 2.7 > 用户文档 > 用法示例 > 启动时检查 [1] https://dubbo.apache.org/zh/docs/v2.7/user/examples/preflight-check/
dubbo.reference.check=false,强制改变所有 reference 的 check 值,就算配置中有声明,也会被覆盖。
dubbo.consumer.check=false,是设置 check 的缺省值,如果配置中有显式的声明,如:<dubbo:reference check="true"/>,不会受影响。
2、Dubbo 2.7 > 用户文档 > 配置 > 属性配置 [2] https://dubbo.apache.org/zh/docs/v2.7/user/configuration/properties/
优先级从高到低:
JVM -D 参数:当你部署或者启动应用时,它可以轻易地重写配置,比如,改变 dubbo 协议端口; XML:XML 中的当前配置会重写 dubbo.properties 中的; Properties:默认配置,仅仅作用于以上两者没有配置时。
3、Dubbo 2.7 > 用户文档 > 配置 > 配置加载流程 [3] https://dubbo.apache.org/zh/docs/v2.7/user/configuration/configuration-load-process/
矛盾点:
1、在 启动时检查 [1] 文档中,dubbo.reference.check=false 强制覆盖所有reference的属性,则 dubbo.registry.check dubbo.registry.address dubbo.protocol.port 这种格式的配置也是强制覆盖
2、在 属性配置 [2] 文档中,XML的bean定义会覆盖dubbo.properties的属性,以dubbo.protocol.port举例,与前面的强制覆盖行为矛盾。
例子1:
1、Spring XML 定义
<dubbo:registry address="zookeeper://localhost:2181" /> <dubbo:reference interface="a.b.DemoService" check="true" />
2、dubbo.properties
dubbo.registry.address=zookeeper://192.168.1.10:2181 dubbo.registry.check=false dubbo.reference.check=false
疑问:
1、dubbo.reference.check配置是否覆盖XML定义的Reference check属性? 2、dubbo.registry.address 是否可以覆盖? 3、dubbo.registry.check 是否有效?
3、Spring application.properties
dubbo.registry.address=zookeeper://192.168.1.10:2181 dubbo.registry.check=false dubbo.reference.check=false
疑问:同上
4、System properties
-Ddubbo.registry.address=zookeeper://192.168.1.10:2181 -Ddubbo.registry.check=false -Ddubbo.reference.check=false
疑问:同上
原提问者GitHub用户kylixs
我的一点观点
1,优化目标1非常赞同,不管是否使用了dubbo-spring-boot,dubbo environment的行为应该是一致的。1的优先级也赞同。
2,语法上,不应该存在dubbo.reference.check=false,因为这也不符合XML配置时的语义传统(dubbo.consumer)。
3,关于properties与xml的覆盖关系,个人认为properties应该覆盖xml,对企业应用来说,propertis的key=value形式的文本才适合线上参数化管理,xml因为还记录依赖关系,过于复杂容易出错。
4,而dubbo.registry.check和reference.check关系上,是不是应该坚持“个性>共性”的原则,个性参数覆盖共性参数。
原回答者GitHub用户zhangyz-hd
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。