Apollo配置中心介紹與使用指南

轉載於https://github.com/ctripcorp/apollo,by Ctrip, Inc.git

Apollo配置中心介紹

 

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

服務端基於Spring Boot和Spring Cloud開發,打包後能夠直接運行,不須要額外安裝Tomcat等應用容器。數據庫

Java客戶端不依賴任何框架,可以運行於全部Java運行時環境,同時對Spring/Spring Boot環境也有額外支持。json

.Net客戶端不依賴任何框架,可以運行於全部.Net運行時環境。服務器

 

1、特色

  • 統一管理不一樣環境、不一樣集羣的配置markdown

    • Apollo提供了一個統一界面集中式管理不一樣環境(environment)、不一樣集羣(cluster)、不一樣命名空間(namespace)的配置。
    • 同一份代碼部署在不一樣的集羣,能夠有不一樣的配置,好比zk的地址等
    • 經過命名空間(namespace)能夠很方便的支持多個不一樣應用共享同一份配置,同時還容許應用對共享的配置進行覆蓋
  • 配置修改實時生效(熱發佈)併發

    • 用戶在Apollo修改完配置併發布後,客戶端能實時(1秒)接收到最新的配置,並通知到應用程序。
  • 版本發佈管理app

    • 全部的配置發佈都有版本概念,從而能夠方便的支持配置的回滾。
  • 灰度發佈框架

    • 支持配置的灰度發佈,好比點了發佈後,只對部分應用實例生效,等觀察一段時間沒問題後再推給全部應用實例。
  • 權限管理、發佈審覈、操做審計分佈式

    • 應用和配置的管理都有完善的權限管理機制,對配置的管理還分爲了編輯和發佈兩個環節,從而減小人爲的錯誤。
    • 全部的操做都有審計日誌,能夠方便的追蹤問題。
  • 客戶端配置信息監控

    • 能夠方便的看到配置在被哪些實例使用
  • 提供Java和.Net原生客戶端

    • 提供了Java和.Net的原生客戶端,方便應用集成
    • 支持Spring Placeholder,Annotation和Spring Boot的ConfigurationProperties,方便應用使用(須要Spring 3.1.1+)
    • 同時提供了Http接口,非Java和.Net應用也能夠方便的使用
  • 提供開放平臺API

    • Apollo自身提供了比較完善的統一配置管理界面,支持多環境、多數據中心配置管理、權限、流程治理等特性。
    • 不過Apollo出於通用性考慮,對配置的修改不會作過多限制,只要符合基本的格式就可以保存。
    • 在咱們的調研中發現,對於有些使用方,它們的配置可能會有比較複雜的格式,如xml, json,須要對格式作校驗。
    • 還有一些使用方如DAL,不只有特定的格式,並且對輸入的值也須要進行校驗後方可保存,如檢查數據庫、用戶名和密碼是否匹配。
    • 對於這類應用,Apollo支持應用方經過開放接口在Apollo進行配置的修改和發佈,而且具有完善的受權和權限控制
  • 部署簡單

    • 配置中心做爲基礎服務,可用性要求很是高,這就要求Apollo對外部依賴儘量地少
    • 目前惟一的外部依賴是MySQL,因此部署很是簡單,只要安裝好Java和MySQL就可讓Apollo跑起來
    • Apollo還提供了打包腳本,一鍵就能夠生成全部須要的安裝包,而且支持自定義運行時參數

 

2、Apollo使用指南

名詞解釋

  • 普通應用
    • 普通應用指的是獨立運行的程序,如
      • Web應用程序
      • 帶有main函數的程序
  • 公共組件
    • 公共組件指的是發佈的類庫、客戶端程序,不會本身獨立運行,如
      • Java的jar包
      • .Net的dll文件

1、普通應用接入指南

1.1 建立項目

要使用Apollo,第一步須要建立項目。

  1. 打開apollo-portal主頁
  2. 點擊「建立項目」

create-app-entry

  1. 輸入項目信息
    • 部門:選擇應用所在的部門
    • 應用AppId:用來標識應用身份的惟一id,格式爲string,須要和客戶端app.properties中配置的app.id對應
    • 應用名稱:應用名,僅用於界面展現
    • 應用負責人:選擇的人默認會成爲該項目的管理員,具有項目權限管理、集羣建立、Namespace建立等權限

create-app

  1. 點擊提交

    建立成功後,會自動跳轉到項目首頁

app-created

1.2 項目權限分配

1.2.1 項目管理員權限

項目管理員擁有如下權限:

  1. 能夠管理項目的權限分配
  2. 能夠建立集羣
  3. 能夠建立Namespace

建立項目時填寫的應用負責人默認會成爲項目的管理員之一,若是還須要其餘人也成爲項目管理員,能夠按照下面步驟操做:

  1. 點擊頁面左側的「管理項目」

    • app-permission-entry
  2. 搜索須要添加的成員並點擊添加

    • app-permission-search-user
    • app-permission-user-added

1.2.1 配置編輯、發佈權限

配置權限分爲編輯和發佈:

  • 編輯權限容許用戶在Apollo界面上建立、修改、刪除配置
    • 配置修改後只在Apollo界面上變化,不會影響到應用實際使用的配置
  • 發佈權限容許用戶在Apollo界面上發佈、回滾配置
    • 配置只有在發佈、回滾動做後纔會被應用實際使用到
    • Apollo在用戶操做發佈、回滾動做後實時通知到應用,並使最新配置生效

項目建立完,默認沒有分配配置的編輯和發佈權限,須要項目管理員進行受權。

  1. 點擊application這個namespace的受權按鈕

    • namespace-permission-entry
  2. 分配修改權限

    • namespace-permission-edit
  3. 分配發布權限

    • namespace-publish-permission

1.3 添加配置項

編輯配置須要擁有這個Namespace的編輯權限,若是發現沒有新增配置按鈕,能夠找項目管理員受權。

1.3.1 經過表格模式添加配置

  1. 點擊新增配置

    • create-item-entry
  2. 輸入配置項

    • create-item-detail
  3. 點擊提交

    • item-created

1.3.2 經過文本模式編輯

Apollo除了支持表格模式,逐個添加、修改配置外,還提供文本模式批量添加、修改。 這個對於從已有的properties文件遷移尤爲有用。

  1. 切換到文本編輯模式 text-mode-config-overview

  2. 點擊右側的修改配置按鈕 text-mode-config-entry

  3. 輸入配置項,並點擊提交修改 text-mode-config-submit

1.4 發佈配置

配置只有在發佈後纔會真的被應用使用到,因此在編輯完配置後,須要發佈配置。

發佈配置須要擁有這個Namespace的發佈權限,若是發現沒有發佈按鈕,能夠找項目管理員受權。

  1. 點擊「發佈按鈕」 publish-entry

  2. 填寫發佈相關信息,點擊發布 publish-detail

1.5 應用讀取配置

配置發佈成功後,應用就能夠經過Apollo客戶端讀取到配置了。

Apollo目前提供Java客戶端,具體信息請點擊Java客戶端使用文檔

若是應用使用了其它語言,也能夠經過直接訪問Http接口獲取配置,具體能夠參考其它語言客戶端接入指南

1.6 回滾已發佈配置

若是發現已發佈的配置有問題,能夠經過點擊『回滾』按鈕來將客戶端讀取到的配置回滾到上一個發佈版本。

這裏的回滾機制相似於發佈系統,發佈系統中的回滾操做是將部署到機器上的安裝包回滾到上一個部署的版本,但代碼倉庫中的代碼是不會回滾的,從而開發能夠在修復代碼後從新發布。

Apollo中的回滾也是相似的機制,點擊回滾後是將發佈到客戶端的配置回滾到上一個已發佈版本,也就是說客戶端讀取到的配置會恢復到上一個版本,但頁面上編輯狀態的配置是不會回滾的,從而開發能夠在修復配置後從新發布。

2、公共組件接入指南

2.1 公共組件和普通應用的區別

公共組件是指那些發佈給其它應用使用的客戶端代碼,好比CAT客戶端、Hermes Producer客戶端等。

雖然這類組件是由其餘團隊開發、維護,可是運行時是在業務實際應用內的,因此本質上能夠認爲是應用的一部分。

一般狀況下,這類組件所用到的配置由原始開發團隊維護,不過因爲實際應用的運行時、環境各不同,因此咱們也容許應用在實際使用時可以覆蓋公共組件的部分配置。

2.2 公共組件接入步驟

公共組件的接入步驟,和普通應用幾乎一致,惟一的區別是公共組件須要建立本身惟一的Namespace。

因此,首先執行普通應用接入文檔中的如下幾個步驟,而後再按照本章節後面的步驟操做。

  1. 建立項目
  2. 項目管理員權限

2.2.1 建立Namespace

建立Namespace須要項目管理員權限,若是發現沒有添加Namespace按鈕,能夠找項目管理員受權。

  1. 點擊頁面左側的添加Namespace

    • create-namespace
  2. 點擊「建立新的Namespace」

    • create-namespace-select-type
  3. 輸入公共組件的Namespace名稱,須要注意的是Namespace名稱全局惟一

    • Apollo會默認把部門代號添加在最前面
    • create-namespace-detail
  4. 點擊提交後,頁面會自動跳轉到關聯Namespace頁面

    • 首先,選中全部須要有這個Namespace的環境和集羣,通常建議全選
    • 其次,選中剛剛建立的namespace
    • 最後,點擊提交
    • link-namespace-detail
  5. 關聯成功後,頁面會自動跳轉到Namespace權限管理頁面

    1. 分配修改權限
      • namespace-permission-edit
    2. 分配發布權限
      • namespace-publish-permission
  6. 點擊「返回」回到項目頁面

2.2.2 添加配置項

編輯配置須要擁有這個Namespace的編輯權限,若是發現沒有新增配置按鈕,能夠找項目管理員受權。

2.2.2.1 經過表格模式添加配置

  1. 點擊新增配置 public-namespace-edit-item-entry

  2. 輸入配置項 public-namespace-edit-item

  3. 點擊提交 public-namespace-item-created

2.2.2.3 經過文本模式編輯

這部分和普通應用一致,具體步驟請參見1.3.2 經過文本模式編輯

2.2.3 發佈配置

配置只有在發佈後纔會真的被應用使用到,因此在編輯完配置後,須要發佈配置。

發佈配置須要擁有這個Namespace的發佈權限,若是發現沒有發佈按鈕,能夠找項目管理員受權。

  1. 點擊「發佈按鈕」 public-namespace-publish-items-entry

  2. 填寫發佈相關信息,點擊發布 public-namespace-publish-items

2.2.4 應用讀取配置

配置發佈成功後,應用就能夠經過Apollo客戶端讀取到配置了。

Apollo目前提供Java客戶端,具體信息請點擊Java客戶端使用文檔

若是應用使用了其它語言,也能夠經過直接訪問Http接口獲取配置,具體能夠參考其它語言客戶端接入指南

對於公共組件的配置讀取,能夠參考上述文檔中的「獲取公共Namespace的配置」部分。

2.3 應用覆蓋公用組件配置步驟

前面提到,一般狀況下,公共組件所用到的配置由原始開發團隊維護,不過因爲實際應用的運行時、環境各不同,因此咱們也容許應用在實際使用時可以覆蓋公共組件的部分配置。

這裏就講一下應用如何覆蓋公用組件的配置,簡單起見,假設apollo-portal應用使用了hermes producer客戶端,而且但願調整hermes的批量發送大小。

2.3.1 關聯公共組件Namespace

  1. 進入使用公共組件的應用項目首頁,點擊左側的添加Namespace按鈕

    • 因此,在這個例子中,咱們須要進入apollo-portal的首頁。
    • (添加Namespace須要項目管理員權限,若是發現沒有添加Namespace按鈕,能夠找項目管理員受權)
    • link-public-namespace-entry
  2. 找到hermes producer的namespace,並選擇須要關聯到哪些環境和集羣 link-public-namespace

  3. 關聯成功後,頁面會自動跳轉到Namespace權限管理頁面

    1. 分配修改權限 namespace-permission-edit
    2. 分配發布權限 namespace-publish-permission
  4. 點擊「返回」回到項目頁面

2.3.2 覆蓋公用組件配置

  1. 點擊新增配置 override-public-namespace-entry

  2. 輸入要覆蓋的配置項 override-public-namespace-item

  3. 點擊提交 override-public-namespace-item-done

2.3.3 發佈配置

配置只有在發佈後纔會真的被應用使用到,因此在編輯完配置後,須要發佈配置。

發佈配置須要擁有這個Namespace的發佈權限,若是發現沒有發佈按鈕,能夠找項目管理員受權。

  1. 點擊「發佈按鈕」 override-public-namespace-item-publish-entry

  2. 填寫發佈相關信息,點擊發布 override-public-namespace-item-publish

  3. 配置發佈成功後,hermes producer客戶端在apollo-portal應用裏面運行時讀取到的sender.batchSize的值就是1000。

3、集羣獨立配置說明

在有些特殊狀況下,應用有需求對不一樣的集羣作不一樣的配置,好比部署在A機房的應用鏈接的es服務器地址和部署在B機房的應用鏈接的es服務器地址不同。

在這種狀況下,能夠經過在Apollo建立不一樣的集羣來解決。

3.1 建立集羣

建立集羣須要項目管理員權限,若是發現沒有添加集羣按鈕,能夠找項目管理員受權。

  1. 點擊頁面左側的「添加集羣」按鈕

    • create-cluster
  2. 輸入集羣名稱,選擇環境並提交

    • create-cluster-detail
  3. 切換到對應的集羣,修改配置併發布便可

    • config-in-cluster-created
  4. 經過上述配置,部署在SHAJQ機房的應用就會讀到SHAJQ集羣下的配置

  5. 若是應用還在其它機房部署了應用,那麼在上述的配置下,會讀到default集羣下的配置。

4、多個AppId使用同一份配置

在一些狀況下,儘管應用自己不是公共組件,但仍是須要在多個AppId之間共用同一份配置,好比同一個產品的不一樣項目:XX-Web, XX-Service, XX-Job等。

這種狀況下若是但願實現多個AppId使用同一份配置的話,基本概念和公共組件的配置是一致的。

具體來講,就是在其中一個AppId下建立一個namespace,寫入公共的配置信息,而後在各個項目中讀取該namespace的配置便可。

若是某個AppId須要覆蓋公共的配置信息,那麼在該AppId下關聯公共的namespace並寫入須要覆蓋的配置便可。

具體步驟能夠參考公共組件接入指南

5、灰度發佈使用指南

經過灰度發佈功能,能夠實現:

  1. 對於一些對程序有比較大影響的配置,能夠先在一個或者多個實例生效,觀察一段時間沒問題後再全量發佈配置。
  2. 對於一些須要調優的配置參數,能夠經過灰度發佈功能來實現A/B測試。能夠在不一樣的機器上應用不一樣的配置,不斷調整、測評一段時間後找出較優的配置再全量發佈配置。

下面將結合一個實際例子來描述如何使用灰度發佈功能。

5.1 場景介紹

100004458(apollo-demo)項目有兩個客戶端:

  1. 10.32.21.19
  2. 10.32.21.22

initial-instance-list

灰度目標:

  • 當前有一個配置timeout=2000,咱們但願對10.32.21.22灰度發佈timeout=3000,對10.32.21.19仍然是timeout=2000。

initial-config

5.2 建立灰度

首先點擊application namespace右上角的建立灰度按鈕。

create-gray-release

點擊肯定後,灰度版本就建立成功了,頁面會自動切換到灰度版本Tab。

initial-gray-release-tab

5.3 灰度配置

點擊主版本的配置中,timeout配置最右側的對此配置灰度按鈕

initial-gray-release-tab

在彈出框中填入要灰度的值:3000,點擊提交。

submit-gray-release-config

gray-release-config-submitted

5.4 配置灰度規則

切換到灰度規則Tab,點擊新增規則按鈕

new-gray-release-rule

在彈出框中灰度的IP下拉框會默認展現當前使用配置的機器列表,選擇咱們要灰度的IP,點擊完成。

select-gray-release-ip

gray-release-ip-selected

gray-release-rule-saved

若是下拉框中沒找到須要的IP,說明機器還沒從Apollo取過配置,能夠點擊手動輸入IP來輸入,輸入完後點擊添加按鈕

manual-input-gray-release-ip

manual-input-gray-release-ip-2

注:對於公共Namespace的灰度規則,須要先指定要灰度的appId,而後再選擇IP。

5.5 灰度發佈

配置規則已經生效,不過灰度配置尚未發佈。切換到配置Tab。

再次檢查灰度的配置部分,若是沒有問題,點擊灰度發佈

prepare-to-do-gray-release

在彈出框中能夠看到主版本的值是2000,灰度版本即將發佈的值是3000。填入其它信息後,點擊發布。

gray-release-confirm-dialog

發佈後,切換到灰度實例列表Tab,就能看到10.32.21.22已經使用了灰度發佈的值。

gray-release-instance-list

切換到主版本實例列表,會看到主版本配置只有10.32.21.19在使用了。

master-branch-instance-list

後面能夠繼續配置的修改或規則的更改。配置的修改須要點擊灰度發佈後纔會生效,規則的修改在規則點擊完成後就會實時生效。

5.6 全量發佈

若是灰度的配置測試下來比較理想,符合預期,那麼就能夠操做全量發佈

全量發佈的效果是:

  1. 灰度版本的配置會合並回主版本,在這個例子中,就是主版本的timeout會被更新成3000
  2. 主版本的配置會自動進行一次發佈
  3. 在全量發佈頁面,能夠選擇是否保留當前灰度版本,默認爲不保留。

prepare-to-full-release

full-release-confirm-dialog

full-release-confirm-dialog-2

我選擇了不保留灰度版本,因此發佈完的效果就是主版本的配置更新、灰度版本刪除。點擊主版本的實例列表,能夠看到10.32.21.22和10.32.21.19都使用了主版本最新的配置。

master-branch-instance-list-after-full-release

5.7 放棄灰度

若是灰度版本不理想或者不須要了,能夠點擊放棄灰度

abandon-gray-release

5.8 發佈歷史

點擊主版本的發佈歷史按鈕,能夠看到當前namespace的主版本以及灰度版本的發佈歷史。

view-release-history

view-release-history-detail

相關文章
相關標籤/搜索