1. 程式人生 > >Apollo配置中心介紹

Apollo配置中心介紹

一、背景

最近公司訂單中心重構,利用spring boot整合apollo配置中心,因此學習一下apollo配置中心

因為如今程式功能越來越複雜,程式的配置日益增多:各種功能的開關、引數配置、伺服器地址、資料庫連結等
對於配置的期望值越來越高:配置修改後實時生效、灰度釋出、分環境、分叢集管理配置、完善的許可權、稽核機制等。

所以傳統的配置檔案越來越無法滿足開發人員的需求。所以就有了apollo

二、Apollo簡介

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

Apollo支援4個維度管理Key-Value格式的配置:

application (應用)
environment (環境)
cluster (叢集)
namespace (名稱空間)
同時,Apollo基於開源模式開發,開源地址:https://github.com/ctripcorp/apollo

三、配置基本概念

既然Apollo定位於配置中心,那麼在這裡有必要先簡單介紹一下什麼是配置。

按照我們的理解,配置有以下幾個屬性:
1、配置是獨立於程式的只讀變數
#配置首先獨立於程式的,同一份程式在不同的配置下會有不通的行為。
#其次,配置對於程式是隻讀,程式通過讀取配置來改變自己的行為,但是程式不應該去改變配置。
#

常見的配置有:DB Connection Str、Thread Pool Size、Buffer Size、Request Timeout、Feature Switch、Server Urls等
2、配置伴隨應用的整個生命週期
#配置貫穿於應用的整個生命週期,應用啟動時通過讀取配置來初始化,在執行時根據配置調行為。
3、配置可有多種載入方式
#配置也有很多種載入方式,常見的有程式內部hard code,配置檔案,在環境變數,啟動引數,基於資料庫等
4、配置需要治理
#許可權控制:
由於配置能改變的程式的行為,不正確的配置甚至能引起災難,所以對配置的修改必須有比較完善的許可權控制
#
不同的環境、叢集配置管理
同一份程式在不同的環境(開發、測試、生產)、不同的叢集(如不同的資料中心)經常需要不同的【配置,所以需要有完善的環境、叢集配置管理
5、框架類元件配置管理
# 還有一類比較特殊的配置 - 框架類元件配置,比如CAT客戶端的配置。
# 雖然這類框架類元件是由其他團隊開發、維護,但是執行時是在業務實際應用內的,所以本質上可以認為框架類元件也是應用的一部分
# 這類元件對應的配置也需要有比較完善的管理方式。

四、 特性

1、統一管理不同環境、不同叢集的配置
**#**Apollo提供了一個統一介面集中式管理不同環境(environment)、不同叢集(cluster)、不同名稱空間(namespace)的配置。
#同一份程式碼部署在不同的叢集,可以有不同的配置,比如zk的地址等
#通過名稱空間(namespace)可以很方便的支援多個不同應用共享同一份配置,同時還允許應用對共享的配置進行覆蓋
2、配置修改實時生效(熱釋出)
#使用者在Apollo修改完配置併發布後,客戶端能實時(1秒)接收到最新的配置,並通知到應用程式
3、版本釋出管理
#所有的配置釋出都有版本概念,從而可以方便地支援配置的回滾
4、灰度釋出
#支援配置的灰度釋出,比如點了釋出後,只對部分應用例項生效,等觀察一段時間沒問題後再推給所有應用例項
5、許可權管理、釋出稽核、操作審計
#應用和配置的管理都有完善的許可權管理機制,對配置的管理還分為了編輯和釋出兩個環節,從而減少人為的錯誤。
#所有的操作都有審計日誌,可以方便的追蹤問題
6、客戶端配置資訊監控
#可以在介面上方便地看到配置在被哪些例項使用
7、提供Java和.Net原生客戶端
#提供了Java和.Net的原生客戶端,方便應用整合
#支援Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便應用使用(需要Spring 3.1.1+)
#同時提供了Http介面,非Java和.Net應用也可以方便的使用
8、提供開放平臺API
**#**Apollo自身提供了比較完善的統一配置管理介面,支援多環境、多資料中心配置管理、許可權、流程治理等特性。
#不過Apollo出於通用性考慮,對配置的修改不會做過多限制,只要符合基本的格式就能夠儲存
#在我們的調研中發現,對於有些使用方,它們的配置可能會有比較複雜的格式,而且對輸入的值也需要進行校驗後方可儲存,如檢查資料庫、使用者名稱和密碼是否匹配
#對於這類應用,Apollo支援應用方通過開放介面在Apollo進行配置的修改和釋出,並且具備完善的授權和許可權控制
9、部署簡單
#配置中心作為基礎服務,可用性要求非常高,這就要求Apollo對外部依賴儘可能地少
#目前唯一的外部依賴是MySQL,所以部署非常簡單,只要安裝好Java和MySQL就可以讓Apollo跑起來
**#**Apollo還提供了打包指令碼,一鍵就可以生成所有需要的安裝包,並且支援自定義執行時引數

五、基礎模型

如下即是Apollo的基礎模型:
1、使用者在配置中心對配置進行修改併發布
2、配置中心通知Apollo客戶端有配置更新
3、Apollo客戶端從配置中心拉取最新的配置、更新本地配置並通知到應用
這裡寫圖片描述

六、介面概覽

這裡寫圖片描述
上圖是Apollo配置中心中一個專案的配置首頁

在頁面左上方的環境列表模組展示了所有的環境和叢集,使用者可以隨時切換。
頁面中央展示了兩個namespace(application和FX.apollo)的配置資訊,預設按照表格模式展示、編輯。使用者也可以切換到文字模式,以檔案形式檢視、編輯。
頁面上可以方便地進行釋出、回滾、灰度、授權、檢視更改歷史和釋出歷史等操作

七、新增/修改配置項

使用者可以通過配置中心介面方便的新增/修改配置項:
這裡寫圖片描述

輸入配置資訊:
這裡寫圖片描述

八、釋出配置

通過配置中心釋出配置:
這裡寫圖片描述
填寫釋出資訊:
這裡寫圖片描述

九、客戶端獲取配置(Java API樣例)

配置釋出後,就能在客戶端獲取到了,以Java API方式為例,獲取配置的示例程式碼如下。更多客戶端使用說明請參見Java客戶端使用指南

Config config = ConfigService.getAppConfig();
Integer defaultRequestTimeout = 200;
Integer requestTimeout = 
         config.getIntProperty("request.timeout",defaultRequestTimeout);

十、客戶端監聽配置變化(Java API樣例)

通過上述獲取配置程式碼,應用就能實時獲取到最新的配置了。

不過在某些場景下,應用還需要在配置變化時獲得通知,比如資料庫連線的切換等,所以Apollo還提供了監聽配置變化的功能,Java示例如下:

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()));
        }
    }
});

十一、Spring整合樣例

Apollo和Spring也可以很方便地整合,只需要標註@EnableApolloConfig後就可以通過@Value獲取配置資訊:

@Configuration
@EnableApolloConfig
public class AppConfig {}
@Component
public class SomeBean {
    @Value("${request.timeout:200}")
    private int timeout;

    @ApolloConfigChangeListener
    private void someChangeHandler(ConfigChangeEvent changeEvent) {
        if (changeEvent.isChanged("request.timeout")) {
            refreshTimeout();
        }
    }
}