apollo分布式配置优先级学习

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

Apollo:1.6.0,springboot:spring-boot-2.1.6.RELEASE,spring-cloud:2.1.1.RELEASE

问题背景

qa环境:apollo修改分库分表配置未生效,排查原因是因为项目中application-qa.properties配置导致,小朋友你是不是有很多问号?

  1. 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’}

上面的配置常规情况下没问题,但是可能会遇到中文问题报错如下1

因此推荐下面这种配置方式

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配置的
2

问题排查

该问题出现其实是与我们当前项目环境相关,我们项目中使用自己封装的orm客户端。orm客户端的配置是如何读取配置?
orm客户端配置流程

  1. springboot自动配置启动时初始化配置OrmAutoConfigure
  2. 实现spring应用事件监听ApplicationListener,当收到配置发生变更事件(ConfigChangeEvent)时刷新配置

二者复用同一处代码如下

public InfraOrmConfig convert() {
   
   
    InfraOrmConfig infraORMConfig = new InfraOrmConfig();
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值