Apollo:1.6.0,springboot:spring-boot-2.1.6.RELEASE,spring-cloud:2.1.1.RELEASE
问题背景
qa环境:apollo修改分库分表配置未生效,排查原因是因为项目中application-qa.properties配置导致,小朋友你是不是有很多问号?
- apollo的配置优先级低于application的配置?
apollo配置简介
list类型配置
apollo/properties配置
my.list.key=1,2,3
spring读取配置
@Value("${my.list.key:0}"
private List<Integer> myListKey
map类型配置
apollo/properties配置
my.map.key={key:‘value’}
上面的配置常规情况下没问题,但是可能会遇到中文问题报错如下
因此推荐下面这种配置方式
my.map={“中文key”: “value”, }
spring读取配置
@Value("#{${my.map:null}}")
private Map<String, String> myMap;
@Value("#{${my.map:{\"05\":\"myValue\"}}}")
private Map<String, String> myMap;
优先级学习
很简单,写一个简单的测试用例注入Environment对象排查,或者在项目启动时增加注入等方式,进行断点排查
@RunWith(SpringRunner.class)
@SpringBootTest
public class UnitTest {
@Resource
private Environment environment;
@Test
public void test() {
System.out.println("test");
}
}
断点发现apollo配置的优先级时高于application配置的

问题排查
该问题出现其实是与我们当前项目环境相关,我们项目中使用自己封装的orm客户端。orm客户端的配置是如何读取配置?
orm客户端配置流程
- springboot自动配置启动时初始化配置OrmAutoConfigure
- 实现spring应用事件监听ApplicationListener,当收到配置发生变更事件(ConfigChangeEvent)时刷新配置
二者复用同一处代码如下
public InfraOrmConfig convert() {
InfraOrmConfig infraORMConfig = new InfraOrmConfig();

本文探讨了Apollo 1.6.0在Spring Boot 2.1.6.RELEASE和Spring Cloud 2.1.1.RELEASE环境中,配置更改未生效的问题。作者揭示了配置优先级的底层逻辑,尤其是Apollo与application配置的对比,并深入解析了orm客户端配置的读取过程。最后,总结了配置加载时机和优先级变化的原因,以及如何优化上下文初始化的处理。
最低0.47元/天 解锁文章
1869

被折叠的 条评论
为什么被折叠?



