Skip to content

apollo-client支持多appid拉取配置的功能 #66

@TerryLam2010

Description

@TerryLam2010
  1. 背景
    现在java apollo client 不支持多appid拉取配置数据.
    在一个应用中确实存在需要拉取不同应用appid下配置数据。来减少配置的重复配置。
    比如在一个整合层应用,需要用到多个appid下的多种业务配置,开关进行复用。

  2. 实现后的特征
    (1)@JsonApolloValue,@ApolloConfigChangeListener 增加appid+name的属性,@value保持原有使用.
    如果不同appid/不同namespace 出现相同key,以加载config顺序最优先的值为准
    (3)bootstrap 暂不支持 多appid的拉取
    (4) @EnableApolloConfig 增加一个属性 mutipleConfig 可以放多个 @MutipleConfig ,属性有appId,多个namespace,以及对应的secret.
    使用者可以在注解@MutipleConfig上填写 SpringEl表达式,读取配置文件中的secret

  3. 实现方案
    类需要增加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中被管理。改造较大。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions