1. 程式人生 > >分散式配置中心apollo

分散式配置中心apollo

  隨著java技術的發展,分散式,叢集一步步的走過來,java的配置是越來越繁瑣了,而且多個節點的話也需要每個節點單獨配置,java生態環境中各個大佬也在不斷的優化解決這些問題,首先是由springboot開始興起的“約定優於配置”這一概念,簡化了大量配置,使得開發變得更有效率,只需配置與一般做法不同的即可,然後就是隨著目前主流的開發流程分開發,測試,預釋出,生產,幾步,我們開發的專案需要走完這幾個環境才能正式的上線給使用者使用,這其中每個環境的配置都不一樣,並且每個專案還有多個節點(且數目不定,隨時可能新增),這給我們隊配置的維護帶來了很大的不變,基於此,近年來,有了分散式配置中心這一概念的產生,springcloud自帶的spring config ,百度的disconf,阿里的Diamond,今天我們介紹的是攜程的apollo,它也是基於springcloud的註冊中心eureka 

一、簡介

  Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置管理場景。

官方github:https://github.com/ctripcorp/apollo

作者對Apollo對介紹:https://github.com/ctripcorp/apollo/wiki/Apollo配置中心介紹

apollo其實是很多獨特的優勢的,比如配置修改實時生效,灰度釋出 ,釋出與回滾等。

二、服務端的部署

服務端的程式碼只需從git上下載下來,按官方文件初始化資料庫,更改配置即可,本篇主要闡述客戶端的操作

三、java客戶端的配置(集成於springcloud)

使用配置中心配置資訊
maven引入上面步驟編譯打包成功的apollo-core和apollo-client包:

<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-core</artifactId>
<version>0.11.0-SNAPSHOT</version>
</dependency>
<dependency>
<
groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>0.11.0-SNAPSHOT</version> </dependency>

 然後配置appid和apollo中心的地址(使用springcloud時配置為eureka的地址待研究)這裡有兩種方法可以配置,

第一在properties配置檔案中直接新增配置

//該項木的標識,即註冊到apollo配置中心上的名字
app.id=demo
//環境資訊,apollo服務端預設有dev,fat,pro等,也可在服務端自定義
env=DEV
//服務端地址
dev.meta=http://192.168.0.1:8018

第二,可以通過jvm引數來完成配置,新增如下jvm引數

-Denv=YOUR-ENVIRONMENT  -Ddev_meta=http://192.168.0.1:8018

測試
新增一個測試的類DemoConfiguration,主要是添加註解@EnableApolloConfig,啟用apollo的配置,當然配置中心要有下面配置的配置資訊:

@Configuration
@EnableApolloConfig
public class DemoConfiguration {
@Value("${demo}")
private String demo;
}

 

四、apollo的本地快取
在客戶端連不上服務端時,他會使用上一次從服務端獲得的配置,該配置放於

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

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

五、監聽修改配置

apollo的配置更新是實時推送的,但是我們採用配置有時是會初始化一些東西的,此時需要監聽配置的變化來實時的做一些切換或重新載入的策略,apollo也為我們提供了這樣的介面

Config config = ConfigService.getAppConfig();
config.addChangeListener(new ConfigChangeListener() {
    @Override
    public void onChange(ConfigChangeEvent changeEvent) {
        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()));
        }
    }
});