1. 程式人生 > >學習使用Apollo配置中心

學習使用Apollo配置中心

reg att event 2.3 key osi -a chang 註冊

Apollo(阿波羅)是攜程框架部門研發的配置管理平臺,能夠集中化管理應用不同環境、不同集群的配置,配置修改後能夠實時推送到應用端。

Apollo官網地址

如何安裝服務端可以按照上面官網的步驟。

這裏主要說明一下應用如何接入apollo。

應用接入apollo步驟:

1、Appid

確保classpath:/META-INF/app.properties文件存在,並且其中內容形如:app.id=YOUR-APP-ID

技術分享圖片

服務端的appid

技術分享圖片

2、Environment

應用在不同的環境可以有不同的配置, Environment可以通過以下3種方式的任意一個配置:

  • 2.1 通過Java的System Property env來指定環境
    -Denv=YOUR-ENVIRONMENT
  • 2.2 通過操作系統的System Environment env來指定環境
  • 2.3 通過配置文件來指定env=YOUR-ENVIRONMENT
    對於Mac/Linux,文件位置為/opt/settings/server.properties
    對於Windows,文件位置為C:\opt\settings\server.properties
    目前,env支持以下幾個值(大小寫不敏感):
    DEV, FAT, UAT, PRO

服務端的environment

技術分享圖片

3、本地緩存

Apollo客戶端會把從服務端獲取到的配置在本地文件系統緩存一份,當去服務器讀取配置失敗時,會使用本地緩存的。

Mac/Linux: /opt/data/{appId}/config-cache

Windows: C:\opt\data{appId}\config-cache

確保目錄存在,且應用有讀寫權限。

4、添加依賴

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

<repository>
    <id>internal.repo</id>
    <url>https://raw.github.com/ctripcorp/apollo/mvn-repo/</url>
</repository>

5、指定服務端

通過Java的System Property env來指定

-Ddev_meta=http://192.168.30.27:8018

6、讀取配置

通過namespace讀取配置,如果不指定則默認拿application

  • 6.1 api方式

通過api方式獲取的配置,修改時不用重啟項目,直接生效。

Config config = ConfigService.getAppConfig(); //ConfigService.getConfig(Namespace);
String key = "key"; //key
String defaultValue = "defaultValue"; //默認值,讀取不到配置就會使用默認值,建議都加上默認值
String value = config.getProperty(key, defaultValue);

監聽配置修改事件

Config config = ConfigService.getAppConfig(); //config instance is singleton for each namespace and is never null
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()));
        }
    }
});
  • 6.2 結合Spring方式

6.2.1 基於XML的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:apollo="http://www.ctrip.com/schema/apollo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.ctrip.com/schema/apollo http://www.ctrip.com/schema/apollo.xsd">
    <!-- 這個是最簡單的配置形式,一般應用用這種形式就可以了,用來指示Apollo註入application namespace的配置到Spring環境中 -->
    <apollo:config/>
    <!-- 這個是稍微復雜一些的配置形式,指示Apollo註入FX.apollo和FX.soa namespace的配置到Spring環境中 -->
    <apollo:config namespaces="FX.apollo,FX.soa"/>
    <bean class="com.ctrip.framework.apollo.spring.TestXmlBean">
        <property name="timeout" value="${timeout:100}"/>
        <property name="batch" value="${batch:200}"/>
    </bean>
</beans>

6.2.2 基於Java的配置

使用@Value(${key:defaultValue})

public class TestJavaConfigBean {
  @Value("${timeout:100}")
  private int timeout;
  private int batch;
 
  @Value("${batch:200}")
  public void setBatch(int batch) {
    this.batch = batch;
  }
 
  public int getTimeout() {
    return timeout;
  }
 
  public int getBatch() {
    return batch;
  }
}

@ApolloConfig用來自動註入Config對象
@ApolloConfigChangeListener用來自動註冊ConfigChangeListener

public class TestApolloAnnotationBean {
  @ApolloConfig("application")
  private Config anotherConfig; //inject config for namespace application
 
  //config change listener for namespace application
  @ApolloConfigChangeListener("application")
  private void anotherOnChange(ConfigChangeEvent changeEvent) {
    //do something
  }
 
}

服務端的namespace:

技術分享圖片

學習使用Apollo配置中心