-
-
Notifications
You must be signed in to change notification settings - Fork 84
Description
-
背景
现在java apollo client 不支持多appid拉取配置数据.
在一个应用中确实存在需要拉取不同应用appid下配置数据。来减少配置的重复配置。
比如在一个整合层应用,需要用到多个appid下的多种业务配置,开关进行复用。 -
实现后的特征
(1)@JsonApolloValue,@ApolloConfigChangeListener 增加appid+name的属性,@value保持原有使用.
如果不同appid/不同namespace 出现相同key,以加载config顺序最优先的值为准
(3)bootstrap 暂不支持 多appid的拉取
(4) @EnableApolloConfig 增加一个属性 mutipleConfig 可以放多个 @MutipleConfig ,属性有appId,多个namespace,以及对应的secret.
使用者可以在注解@MutipleConfig上填写 SpringEl表达式,读取配置文件中的secret -
实现方案
类需要增加appid
(1) AbstractConfigFile,AbstractConfig 需要增加 appId 属性,其子类构造方法,都需要增加appId的传入。
(2) RepositoryChangeListener, onRepositoryChange 方法增加appId的传入。
(3)变更类 ConfigChange、ConfigChangeEvent、ConfigFileChangeEvent 增加appId属性获取配置
(4)ConfigService 增加 getConfig(String appId,String namespace),保留 getConfig(String namespace) 读取原有app.id中的配置
(5) 增加一个@ApolloValue和对应的ApolloValueAnnotationProcessor (直接使用@JsonApolloValue 其实可以不加)初始化Config
(6)DefaultApolloConfigRegistrarHelper增加解析@EnableApolloConfig中的@MutipleConfig, 组合appId+namespace,再传入PropertySourcesProcessor.addNamespaces(Map<String,List> namespaceMap), key为appid,value为 对应appId的namespace。
再传入PropertySourcesProcessor中initializePropertySources 可以根据appid+namespace 创建config
(7) RemoteConfigRepository、LocalFileConfigRepository、RemoteConfigLongPollService 创建时传入appid+namespace,根据传入的appid+namespace 拉取配置
(8)Config 的创建,DefaultConfigManager、ConfigFactory增加appId创建,这点关联(7)
(9) 进行初始化时,若@EnableApolloConfig没有配置appid,默认读取app.id的,包括bootstrap 初始化时 进行的Config拉取。多appid 和secret的配置
(10) 配置文件中增加 多appid。拆解后,放入一个环境变量中进行管理。配置刷新
(11) AutoUpdateConfigChangeListener 无改变。在考虑是否处理不同namespace下同key覆盖的情况,若兼容该情况,则现有的值不能放入properties中被管理。改造较大。