apollo
apollo copied to clipboard
是否支持配置发布时候属性嵌套
先发布property1=aaa 再发布类似:property2=${property1}bbb
阿波罗内部存储: property1=aaa property2=aaabbb
而不需要spring嵌套解析,当然某些场景下spring也能提供类似功能: @Value("${property1}bbb") 问题是这种方式一方面是灵活性不够比如无法支持整体替换property2,第二是实际上分散了property2的值, 将property2的配置分散在apollo和本地代码不利维护
Spring 其实也可以实现的,比如在 Apollo 中配置
property1=aaa
property2=${property1}bbb
在代码中可以按下面这么写,不过这个配置方式的一个问题是当 property1 变化后,property2 不会自动更新,需要重启才能更新
@Value("${property2}")
private String property2;
如果在代码中能体现嵌套关系的话,就可以实现自动更新,不过存在一定的配置耦合
@Value("${property1}bbb")
private String property2;
我看了下源码,不能更新的原因我理解应该是对于property2的value在property1修改前后都为${property1}bbb没有感应到变化所以未作为MODIFIED加入到changes中去通知ConfigChangeListener。 目前我想到了几种解决方案: 1 Release表存储时候新增列存储替换后值,后面查询都使用该列。优缺点:改动相对较大,不过修改比较彻底方便维护。 2 configService返回前替换property2中的${property1}, 优缺点:改动相对较小不过每次都要替换性能影响,并且修改不彻底会造成一定的理解上的困难。 3客户端收到通知,获取最新的列表后遍历commonKeys如果有property1内嵌,加入changes。优缺点:改动较小,但是需要每种客户端都要修改
在服务端替换应该是不可行的,主要原因是引入哪些 namespace 以及它们之间的顺序是在客户端指定的,比如上例中 property1 和property2 可以是在不同 namespace 里面,所以这个替换目前看只能在客户端实现