手打不易,如果转摘,请注明出处!
注明原文:https://zhangxiaofan.blog.csdn.net/article/details/130302692
目录
前言
Apollo配置加载顺序
步骤
第一步:Apollo创建properties
第二步:添加namespaces(第一步创建的)
第三步:添加本地配置(用于覆盖Apollo配置)
第四步:启动程序,校验正确性
源码分析
前言
我们在开发过程中,dev、st、uat、prd等都有各自的配置中心;
一般本地开发我们用的是dev或者alpha配置中心,有的时候,方便本地开发和调试,需要修改某个配置,不可能每次都去修改Apollo配置中心。这样做的话不但会影响团队的其他人员,而且会导致配置中心的版本记录冗余。
那么我们有什么好的方法,可以本地local覆盖Apollo配置呢?答案是有的,只需要2个步骤就行了。
Apollo配置加载顺序
这里先大致介绍下Apollo的配置加载顺序。
1.按照 apollo.bootstrap.namespaces 顺序依次读取,本地同名 properties 会作为补充
2.同样的配置,按出现顺序优先——“谁先出现谁有效”
例如:
apollo.bootstrap.namespaces = application1,application2
那么会先加载 application1, 然后 application2。本地同名配置会作为补充,具体是指放到 src/main/resources/META-INF/config 下的同名配置 application1.properties 和 application2.properties
步骤
第一步:Apollo创建properties
在Apollo配置中心,新建一个私有private配置,我们暂定名字为: local.properties,这个配置不需要任何值,就是一个空文件。
注意:为了不影响团队其他成员的开发,尽量不要创建公用public配置。
第二步:添加namespaces(第一步创建的)
修改本地配置 application.properties 文件,添加刚才创建的 local(namespace),为了保证本地的配置不被其他namesace覆盖,要放到第一个(保证没有被其他配置覆盖)
apollo.bootstrap.namespaces = local,application
第三步:添加本地配置(用于覆盖Apollo配置)
在路径 src/main/resources/META-INF/config 下新建 local.properties (与Apollo创建的名字保持一致),然后添加你想要覆盖远程的配置,例如:
server.servlet.context-path = /test
第四步:启动程序,校验正确性
启动程序即可,你会发现,server.servlet.context-path 的值是本地配置“/test”了
源码分析
Apollo包下的一个类 com.ctrip.framework.apollo.internals.DefaultConfig
loadFromResource()代码如下,看到路径必须是:META-INF/config/%s.properties
这个代码的意思就是说:配置中心会将本地文件作为补充,以 local.properties 为例。
项目配置中 apollo.bootstrap.namespaces 添加了 local 后,会先读取 Apollo 配置中心的 local.properties ,然后再读取 本地 local.properties 中的配置作为补充,补充就是说如果Apollo配置中心没有,那么本地的 local.properties 就会添加到应用中。这就是为什么我们要创建一个空配置的原因。