apollo配置中心(Apollo配置中心如何做到更新生效)

apollo配置中心(Apollo配置中心如何做到更新生效)svg xmlns http www w3 org 2000 svg style display none svg

大家好,我是讯享网,很高兴认识大家。



 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <center> 

讯享网

Apollo配置自动更新机制及拓展

一、背景

​ 在日常工作中,我们代码里经常会用到以下两种方式读取Apollo配置:

​ (1)使用@Value注解,,在使用配置的bean里面定义带@Value的属性,将Apollo配置读取到基础类型对象;

讯享网

​ (2)使用@ConfigurationProperties将指定前缀的一批Apollo配置读取成pojo的bean,如以下代码,该类的作用就是读取前缀为supreme.service的配置,使用时只需要注入ServiceProperties的bean即可。

 

​ 对比以上两种方式,明显第二种更好。因为可以将配置归类管理,在需要读取多个配置时代码也更加简洁。在工作中对于很多的配置项需要支持自动更新。接下来,我们来弄清楚以上两种读取配置的方式是否都支持Apollo配置的自动更新。

二、Apollo配置自动更新的机制

​ 在使用Apollo时会依赖apollo-client的jar包,该jar实现了只需要配置apollo地址和命名空间以及工程的appId就能读取Apollo配置。通过这个apollo-client来解答如下两个问题

讯享网

(1)Apollo能自动更新哪些配置

​ 查看其源码,找到关键类ApolloProcessor,该类继承了BeanPostProcessor,可以在bean初始前和初始化之后进行一些操作。

 

​ 查看ApolloProcessor子类SpringValueProcessor,ApolloProcessor还有一个ApolloProcessor子类,因为工作中使用较少,并且与@ConfigurationProperties的功能有点类似,本次不做讨论。

讯享网

(2)Apollo怎么自动更新配置的

在这里插入图片描述
讯享网

​ 每一个namespace都会对应一个DefaultConfig对象,对象会有一个List m_listeners属性,就是在配置修改后触发的监听事件完成配置的自动更新。ConfigChangeListener是一个接口,在apollo-client里只有一个实现类。

​ 配置更新改变类型有以下三种:

​ (1)新增;

​ (2)编辑;

​ (3)删除。

 

结合以上两点可以明确的知道,如果不做其他的配置,Apollo仅仅可以自动更新Bean里加了@Value注解的属性和方法的配置。使用@ConfigurationProperties读取配置的方式是不能自动更新的。

​ 但是ConfigChangeListener接口还有lamda表达式的实现类,也是ApolloProcessor的子类。

讯享网

三、支持@ConfigurationProperties类配置的自动更新

​ 通过注解标记@ConfigurationProperties类,在Spring Application的启动事件中将@ConfigurationProperties类的前缀以及bean维护在内存里,然后根据监听事件获取到更新的配置截取前缀再通过反射完成@ConfigurationProperties类配置的自动更新。

​ 使用方法如下:

​ (1)在@ConfigurationProperties的类上加上@AutoUpdate注解,即可完成自动更新,同时可以指定propertyChangeType更新会被新增、编辑、删除的哪几种方式触发。如以下代码,如果配置是修改或者删除,则不会触发自动更新。适用于可以修改源码的@ConfigurationProperties类。

 

​ (2)在启动类上加上@EnableApolloAutoUpdateProperties注解,并指定要自动更新的类以及配置修改类型。适用于不能修改源码、jar包内部的@ConfigurationProperties类。如以下代码,指定LeeProperties.clas并且配置修改类型为新增就会触发自动更新。

讯享网

​ 整体功能实现流程图如下:

在这里插入图片描述

​ 配置截取前缀后可以分为以下四种类型并且匹配相应的Updater:

​ (1)简单&单个,使用SingleSimpleTypePropertyUpdater;

​ (2)简单&多个,使用ListSimpleTypePropertyUpdater ;

​ (3)对象&单个,使用SingleObjectTypePropertyUpdater ;

​ (4)对象&多个,使用ListObjectTypePropertyUpdater。

propertyName属性名 index 下标 subPropertyName子属性类型SingleSimpleTypePropertyUpdater不空空空简单&单个SingleObjectTypePropertyUpdater不空空不空对象&单个ListSimpleTypePropertyUpdater不空不空空简单&多个ListObjectTypePropertyUpdater不空不空不空对象&多个
 

在这里插入图片描述

​ ApolloPropertiesListener:负责维护需要自动更新的@ConfigurationProperties的实例以及接收配置变更的监听事件

​ Updater/DefaultUpdater :负责把配置变动的对象ConfigChange里实际变更的配置去掉前缀并以”.”分隔

​ PropertiesUpdater/及其子类:负责把Updater分隔好的配置转换成Property对象[①propertyName;②index; ③subPropertyName],并且调用match方法判断是否可以更新配置,如果可以更新,则进行更新

​ ListPropertyUpdater:负责多个结构的配置更新

​ SinglePropertyUpdater:负责单个结构的配置更新

​ SingleSimpleTypePropertyUpdater:负责单个结构简单属性的配置更新

​ SingleObjectTypePropertyUpdater:负责单个结构对象属性的配置更新

​ ListSimpleTypePropertyUpdater:负责多个结构简单属性的配置更新

​ ListObjectTypePropertyUpdater:负责多个结构对象属性的配置更新

​ 源码:https://gitee.com/pwenlee/apollo-properties-auto-update-spring-boot-starter.git

四、总结

​ 默认情况下Apollo仅仅支持@Value注解的自动更新。

​ 可以在bean的类方法上加@ApolloConfigChangeListener,就能触发到Apollo的监听事件,方法体内针对性的去找到相应的bean再调用setter方法就能完成其他配置的自动更新。

​ 当前组件已经传到maven仓库,微服务需要引入组件再在@ConfigurationProperties类上面加上@AutoUpdate注解就能实现该类的自动更新,在配置文件为.properties和.yml的情况下验证通过。

小讯
上一篇 2025-06-06 07:21
下一篇 2025-04-16 20:39

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/157792.html