apollo-java
apollo-java copied to clipboard
apollo-client支持多appid拉取配置的功能
-
背景 现在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<String>> 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中被管理。改造较大。