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: