Apollo(阿波羅)攜程開源配置管理中心

1、背景

最近公司訂單中心重構,利用spring boot集成apollo配置中心,所以學習一下apollo配置中心java

由於現在程序功能愈來愈複雜,程序的配置日益增多:各類功能的開關、參數配置、服務器地址、數據庫連接等 
對於配置的指望值愈來愈高:配置修改後實時生效、灰度發佈、分環境、分集羣管理配置、完善的權限、審覈機制等。git

因此傳統的配置文件愈來愈沒法知足開發人員的需求。因此就有了apollogithub

2、Apollo簡介

Apollo(阿波羅)是攜程框架部門研發的開源配置管理中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性。spring

Apollo支持4個維度管理Key-Value格式的配置:數據庫

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

3、配置基本概念

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

按照咱們的理解,配置有如下幾個屬性: 
一、配置是獨立於程序的只讀變量 
#配置首先獨立於程序的,同一份程序在不一樣的配置下會有不通的行爲。 
#其次,配置對於程序是隻讀,程序經過讀取配置來改變本身的行爲,可是程序不該該去改變配置。 
#常見的配置有:DB Connection Str、Thread Pool Size、Buffer Size、Request Timeout、Feature Switch、Server Urls等 
二、配置伴隨應用的整個生命週期 
#配置貫穿於應用的整個生命週期,應用啓動時經過讀取配置來初始化,在運行時根據配置調行爲。 
三、配置可有多種加載方式 
#配置也有不少種加載方式,常見的有程序內部hard code,配置文件,在環境變量,啓動參數,基於數據庫等 
四、配置須要治理 
#權限控制: 
因爲配置能改變的程序的行爲,不正確的配置甚至能引發災難,因此對配置的修改必須有比較完善的權限控制 
#不一樣的環境、集羣配置管理 
同一份程序在不一樣的環境(開發、測試、生產)、不一樣的集羣(如不一樣的數據中心)常常須要不一樣的【配置,因此須要有完善的環境、集羣配置管理 
五、框架類組件配置管理 
# 還有一類比較特殊的配置 - 框架類組件配置,好比CAT客戶端的配置。 
# 雖然這類框架類組件是由其餘團隊開發、維護,可是運行時是在業務實際應用內的,因此本質上能夠認爲框架類組件也是應用的一部分 
# 這類組件對應的配置也須要有比較完善的管理方式。併發

4、 特性

一、統一管理不一樣環境、不一樣集羣的配置 
**#**Apollo提供了一個統一界面集中式管理不一樣環境(environment)、不一樣集羣(cluster)、不一樣命名空間(namespace)的配置。 
#同一份代碼部署在不一樣的集羣,能夠有不一樣的配置,好比zk的地址等 
#經過命名空間(namespace)能夠很方便的支持多個不一樣應用共享同一份配置,同時還容許應用對共享的配置進行覆蓋 
二、配置修改實時生效(熱發佈) 
#用戶在Apollo修改完配置併發布後,客戶端能實時(1秒)接收到最新的配置,並通知到應用程序 
三、版本發佈管理 
#全部的配置發佈都有版本概念,從而能夠方便地支持配置的回滾 
四、灰度發佈 
#支持配置的灰度發佈,好比點了發佈後,只對部分應用實例生效,等觀察一段時間沒問題後再推給全部應用實例 
五、權限管理、發佈審覈、操做審計 
#應用和配置的管理都有完善的權限管理機制,對配置的管理還分爲了編輯和發佈兩個環節,從而減小人爲的錯誤。 
#全部的操做都有審計日誌,能夠方便的追蹤問題 
六、客戶端配置信息監控 
#能夠在界面上方便地看到配置在被哪些實例使用 
七、提供Java和.Net原生客戶端 
#提供了Java和.Net的原生客戶端,方便應用集成 
#支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便應用使用(須要Spring 3.1.1+) 
#同時提供了Http接口,非Java和.Net應用也能夠方便的使用 
八、提供開放平臺API 
**#**Apollo自身提供了比較完善的統一配置管理界面,支持多環境、多數據中心配置管理、權限、流程治理等特性。 
#不過Apollo出於通用性考慮,對配置的修改不會作過多限制,只要符合基本的格式就可以保存 
#在咱們的調研中發現,對於有些使用方,它們的配置可能會有比較複雜的格式,並且對輸入的值也須要進行校驗後方可保存,如檢查數據庫、用戶名和密碼是否匹配 
#對於這類應用,Apollo支持應用方經過開放接口在Apollo進行配置的修改和發佈,而且具有完善的受權和權限控制 
九、部署簡單 
#配置中心做爲基礎服務,可用性要求很是高,這就要求Apollo對外部依賴儘量地少 
#目前惟一的外部依賴是MySQL,因此部署很是簡單,只要安裝好Java和MySQL就可讓Apollo跑起來 
**#**Apollo還提供了打包腳本,一鍵就能夠生成全部須要的安裝包,而且支持自定義運行時參數app

5、基礎模型

以下便是Apollo的基礎模型: 
一、用戶在配置中心對配置進行修改併發布 
二、配置中心通知Apollo客戶端有配置更新 
三、Apollo客戶端從配置中心拉取最新的配置、更新本地配置並通知到應用 
這裏寫圖片描述框架

6、界面概覽

這裏寫圖片描述
上圖是Apollo配置中心中一個項目的配置首頁

在頁面左上方的環境列表模塊展現了全部的環境和集羣,用戶能夠隨時切換。 
頁面中央展現了兩個namespace(application和FX.apollo)的配置信息,默認按照表格模式展現、編輯。用戶也能夠切換到文本模式,以文件形式查看、編輯。 
頁面上能夠方便地進行發佈、回滾、灰度、受權、查看更改歷史和發佈歷史等操做

7、添加/修改配置項

用戶能夠經過配置中心界面方便的添加/修改配置項: 
這裏寫圖片描述

輸入配置信息: 
這裏寫圖片描述

8、發佈配置

經過配置中心發佈配置: 
這裏寫圖片描述
填寫發佈信息: 
這裏寫圖片描述

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

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

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

10、客戶端監聽配置變化(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())); } } });

11、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(); } } }
相關文章
相關標籤/搜索