2. [Apollo]Apollo Config Center

Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

下面就如何使用Apollo配置中心进行步骤演练,分Springboot应用程序场景和普通Java应用程序场景进行说明。

2.1. Java单体应用

2.1.1. 定义AppId

接入Apollo的应用程序需要一个唯一的AppId,给应用程序定义AppId的办法有几种,以下摘取两种:

1、System Property

-Dapp.id=YOUR-APP-ID

2、app.properties

确保classpath:/META-INF/app.properties文件存在,并且其中内容形如:

app.id=YOUR-APP-ID

2.1.2. 配置Apollo Meta Server

Apollo支持应用在不同的环境有不同的配置,所以需要在运行提供给Apollo客户端当前环境的Apollo Meta Server信息。默认情况下,meta server和config service是部署在同一个JVM进程,所以meta server的地址就是config service的地址。

Meta Server的地址端口默认为8080,可以使用Ip也可以使用域名指定其地址。

指定其地址有以下几种方式:

  • 可以通过Java的System Property apollo.meta来指定

    -Dapollo.meta=http://config-service-url
    
  • 在运行jar时指定

    -Dapollo.meta=http://config-service-url
    
  • 也可以通过程序指定,如

    System.setProperty("apollo.meta", "http://config-service-url");
    

2.1.3. 本地缓存

Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。

本地缓存路径默认位于以下路径,所以请确保/opt/data目录存在,且应用有读写权限。

默认地址为:

/opt/data/{appId}/config-cache

当然,该地址也可以自己指定

在jar包启动之前通过启动脚本指定该位置:

-Dapollo.cache-dir=/opt/data/some-cache-dir

2.1.4. 本地开发

1、引入maven坐标

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>1.7.0</version>
</dependency>

2、在项目的resources目录下创建META-INF文件夹,并在文件夹下放入名为app.properties文件,内容指定Appid

app.id=SampleApp

如果通过别的方式指定该ID,则忽略此种方式

3、获取默认namespace的配置

此种方式,每次调用时都会从配置中心取到最新的值。

Config config = ConfigService.getAppConfig(); 
String someKey = "default";
String someDefaultValue = "defaultValue";
String value = config.getProperty(someKey, someDefaultValue);

4、获取指定namespace下的配置

实际应用时,有不同的namespace,根据应用的不同从指定的namespace下去获取组新的配置,此种方式每次获取都是最新的配置

String somePublicNamespace = "aNamespace";
Config config = ConfigService.getConfig(somePublicNamespace); 
String someKey = "targetKey";
String someDefaultValue = "targetValue";
String value = config.getProperty(someKey, someDefaultValue);

5、如果想要实时获取配置的更新通知,可以使用如下:

比如MySQL的连接信息变更了,需要实时同步建立新的连接

Config config = ConfigService.getAppConfig(); 
config.addChangeListener(new ConfigChangeListener() {
    @Override
    public void onChange(ConfigChangeEvent changeEvent) {
        System.out.println("Changes for namespace " + changeEvent.getNamespace());
        for (String key : changeEvent.changedKeys()) {
            ConfigChange change = changeEvent.getChange(key);
            System.out.println(String.format("Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));
        }
    }
});

2.2. Springboot应用场景