轉載於https://github.com/ctripcorp/apollo,by Ctrip, Inc.git
Apollo(阿波羅)是攜程框架部門研發的分佈式配置中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性,適用於微服務配置管理場景。github
服務端基於Spring Boot和Spring Cloud開發,打包後能夠直接運行,不須要額外安裝Tomcat等應用容器。數據庫
Java客戶端不依賴任何框架,可以運行於全部Java運行時環境,同時對Spring/Spring Boot環境也有額外支持。json
.Net客戶端不依賴任何框架,可以運行於全部.Net運行時環境。服務器
統一管理不一樣環境、不一樣集羣的配置markdown
配置修改實時生效(熱發佈)併發
版本發佈管理app
灰度發佈框架
權限管理、發佈審覈、操做審計分佈式
客戶端配置信息監控
提供Java和.Net原生客戶端
提供開放平臺API
部署簡單
Apollo還提供了打包腳本,一鍵就能夠生成全部須要的安裝包,而且支持自定義運行時參數
要使用Apollo,第一步須要建立項目。
點擊提交
建立成功後,會自動跳轉到項目首頁
項目管理員擁有如下權限:
建立項目時填寫的應用負責人默認會成爲項目的管理員之一,若是還須要其餘人也成爲項目管理員,能夠按照下面步驟操做:
點擊頁面左側的「管理項目」
搜索須要添加的成員並點擊添加
配置權限分爲編輯和發佈:
項目建立完,默認沒有分配配置的編輯和發佈權限,須要項目管理員進行受權。
點擊application這個namespace的受權按鈕
分配修改權限
分配發布權限
編輯配置須要擁有這個Namespace的編輯權限,若是發現沒有新增配置按鈕,能夠找項目管理員受權。
點擊新增配置
輸入配置項
點擊提交
Apollo除了支持表格模式,逐個添加、修改配置外,還提供文本模式批量添加、修改。 這個對於從已有的properties文件遷移尤爲有用。
切換到文本編輯模式
點擊右側的修改配置按鈕
輸入配置項,並點擊提交修改
配置只有在發佈後纔會真的被應用使用到,因此在編輯完配置後,須要發佈配置。
發佈配置須要擁有這個Namespace的發佈權限,若是發現沒有發佈按鈕,能夠找項目管理員受權。
點擊「發佈按鈕」
填寫發佈相關信息,點擊發布
配置發佈成功後,應用就能夠經過Apollo客戶端讀取到配置了。
Apollo目前提供Java客戶端,具體信息請點擊Java客戶端使用文檔:
若是應用使用了其它語言,也能夠經過直接訪問Http接口獲取配置,具體能夠參考其它語言客戶端接入指南
若是發現已發佈的配置有問題,能夠經過點擊『回滾』按鈕來將客戶端讀取到的配置回滾到上一個發佈版本。
這裏的回滾機制相似於發佈系統,發佈系統中的回滾操做是將部署到機器上的安裝包回滾到上一個部署的版本,但代碼倉庫中的代碼是不會回滾的,從而開發能夠在修復代碼後從新發布。
Apollo中的回滾也是相似的機制,點擊回滾後是將發佈到客戶端的配置回滾到上一個已發佈版本,也就是說客戶端讀取到的配置會恢復到上一個版本,但頁面上編輯狀態的配置是不會回滾的,從而開發能夠在修復配置後從新發布。
公共組件是指那些發佈給其它應用使用的客戶端代碼,好比CAT客戶端、Hermes Producer客戶端等。
雖然這類組件是由其餘團隊開發、維護,可是運行時是在業務實際應用內的,因此本質上能夠認爲是應用的一部分。
一般狀況下,這類組件所用到的配置由原始開發團隊維護,不過因爲實際應用的運行時、環境各不同,因此咱們也容許應用在實際使用時可以覆蓋公共組件的部分配置。
公共組件的接入步驟,和普通應用幾乎一致,惟一的區別是公共組件須要建立本身惟一的Namespace。
因此,首先執行普通應用接入文檔中的如下幾個步驟,而後再按照本章節後面的步驟操做。
建立Namespace須要項目管理員權限,若是發現沒有添加Namespace按鈕,能夠找項目管理員受權。
點擊頁面左側的添加Namespace
點擊「建立新的Namespace」
輸入公共組件的Namespace名稱,須要注意的是Namespace名稱全局惟一
點擊提交後,頁面會自動跳轉到關聯Namespace頁面
關聯成功後,頁面會自動跳轉到Namespace權限管理頁面
點擊「返回」回到項目頁面
編輯配置須要擁有這個Namespace的編輯權限,若是發現沒有新增配置按鈕,能夠找項目管理員受權。
點擊新增配置
輸入配置項
點擊提交
這部分和普通應用一致,具體步驟請參見1.3.2 經過文本模式編輯。
配置只有在發佈後纔會真的被應用使用到,因此在編輯完配置後,須要發佈配置。
發佈配置須要擁有這個Namespace的發佈權限,若是發現沒有發佈按鈕,能夠找項目管理員受權。
點擊「發佈按鈕」
填寫發佈相關信息,點擊發布
配置發佈成功後,應用就能夠經過Apollo客戶端讀取到配置了。
Apollo目前提供Java客戶端,具體信息請點擊Java客戶端使用文檔:
若是應用使用了其它語言,也能夠經過直接訪問Http接口獲取配置,具體能夠參考其它語言客戶端接入指南
對於公共組件的配置讀取,能夠參考上述文檔中的「獲取公共Namespace的配置」部分。
前面提到,一般狀況下,公共組件所用到的配置由原始開發團隊維護,不過因爲實際應用的運行時、環境各不同,因此咱們也容許應用在實際使用時可以覆蓋公共組件的部分配置。
這裏就講一下應用如何覆蓋公用組件的配置,簡單起見,假設apollo-portal應用使用了hermes producer客戶端,而且但願調整hermes的批量發送大小。
進入使用公共組件的應用項目首頁,點擊左側的添加Namespace按鈕
找到hermes producer的namespace,並選擇須要關聯到哪些環境和集羣
關聯成功後,頁面會自動跳轉到Namespace權限管理頁面
點擊「返回」回到項目頁面
點擊新增配置
輸入要覆蓋的配置項
點擊提交
配置只有在發佈後纔會真的被應用使用到,因此在編輯完配置後,須要發佈配置。
發佈配置須要擁有這個Namespace的發佈權限,若是發現沒有發佈按鈕,能夠找項目管理員受權。
點擊「發佈按鈕」
填寫發佈相關信息,點擊發布
配置發佈成功後,hermes producer客戶端在apollo-portal應用裏面運行時讀取到的sender.batchSize的值就是1000。
在有些特殊狀況下,應用有需求對不一樣的集羣作不一樣的配置,好比部署在A機房的應用鏈接的es服務器地址和部署在B機房的應用鏈接的es服務器地址不同。
在這種狀況下,能夠經過在Apollo建立不一樣的集羣來解決。
建立集羣須要項目管理員權限,若是發現沒有添加集羣按鈕,能夠找項目管理員受權。
點擊頁面左側的「添加集羣」按鈕
輸入集羣名稱,選擇環境並提交
切換到對應的集羣,修改配置併發布便可
經過上述配置,部署在SHAJQ機房的應用就會讀到SHAJQ集羣下的配置
若是應用還在其它機房部署了應用,那麼在上述的配置下,會讀到default集羣下的配置。
在一些狀況下,儘管應用自己不是公共組件,但仍是須要在多個AppId之間共用同一份配置,好比同一個產品的不一樣項目:XX-Web, XX-Service, XX-Job等。
這種狀況下若是但願實現多個AppId使用同一份配置的話,基本概念和公共組件的配置是一致的。
具體來講,就是在其中一個AppId下建立一個namespace,寫入公共的配置信息,而後在各個項目中讀取該namespace的配置便可。
若是某個AppId須要覆蓋公共的配置信息,那麼在該AppId下關聯公共的namespace並寫入須要覆蓋的配置便可。
具體步驟能夠參考公共組件接入指南。
經過灰度發佈功能,能夠實現:
下面將結合一個實際例子來描述如何使用灰度發佈功能。
100004458(apollo-demo)項目有兩個客戶端:
灰度目標:
首先點擊application namespace右上角的建立灰度
按鈕。
點擊肯定後,灰度版本就建立成功了,頁面會自動切換到灰度版本
Tab。
點擊主版本的配置
中,timeout配置最右側的對此配置灰度
按鈕
在彈出框中填入要灰度的值:3000,點擊提交。
切換到灰度規則
Tab,點擊新增規則
按鈕
在彈出框中灰度的IP
下拉框會默認展現當前使用配置的機器列表,選擇咱們要灰度的IP,點擊完成。
若是下拉框中沒找到須要的IP,說明機器還沒從Apollo取過配置,能夠點擊手動輸入IP來輸入,輸入完後點擊添加按鈕
注:對於公共Namespace的灰度規則,須要先指定要灰度的appId,而後再選擇IP。
配置規則已經生效,不過灰度配置尚未發佈。切換到配置
Tab。
再次檢查灰度的配置部分,若是沒有問題,點擊灰度發佈
。
在彈出框中能夠看到主版本的值是2000,灰度版本即將發佈的值是3000。填入其它信息後,點擊發布。
發佈後,切換到灰度實例列表
Tab,就能看到10.32.21.22已經使用了灰度發佈的值。
切換到主版本
的實例列表
,會看到主版本配置只有10.32.21.19在使用了。
後面能夠繼續配置的修改或規則的更改。配置的修改須要點擊灰度發佈後纔會生效,規則的修改在規則點擊完成後就會實時生效。
若是灰度的配置測試下來比較理想,符合預期,那麼就能夠操做全量發佈
。
全量發佈的效果是:
我選擇了不保留灰度版本,因此發佈完的效果就是主版本的配置更新、灰度版本刪除。點擊主版本的實例列表,能夠看到10.32.21.22和10.32.21.19都使用了主版本最新的配置。
若是灰度版本不理想或者不須要了,能夠點擊放棄灰度
。
點擊主版本的發佈歷史
按鈕,能夠看到當前namespace的主版本以及灰度版本的發佈歷史。