內容來源:2017 年 7 月 22 日,攜程框架研發部技術專家宋順在「攜程技術沙龍 | 海量互聯網基礎架構」進行《攜程開源配置中心Apollo的設計與實現》演講分享。IT 大咖說(微信id:itdakashuo)做爲獨家視頻合做方,經主辦方和講者審閱受權發佈。
java
閱讀字數:2580 | 7分鐘閱讀git
隨着程序功能的日益複雜,程序的配置日益增多:各類功能的開關、參數的配置、服務器的地址。對程序配置的指望值也愈來愈高:配置修改後實時生效,分環境、分集羣管理配置,完善的權限、審覈機制。在這樣的大環境下,傳統的經過配置文件、數據庫等方式已經愈來愈沒法知足開發人員對配置管理的需求。Apollo配置中心應運而生!github
Apollo是攜程框架配置部門開源的統一應用配置中心,支持從4個維度管理配置,分別是Appllication(應用)、environment(環境)、Cluster(集羣)、namespace(命名空間)。數據庫
配置是獨立於程序的只讀變量,程序能夠經過讀取配置來改變自身的行爲,可是不該該去改變配置。配置伴隨着應用的整個生命週期,啓動時讀取配置,運行時根據配置調整行爲。配置還能夠有多種加載方式,好比程序內部hard code、配置文件、環境變量,啓動參數、基於數據庫等。緩存
因爲配置是能夠改變程序的行爲的,錯誤的配置就會致使程序的故障,因此對配置的修改和發佈都須要一套完善的權限管理,另外配置在不一樣的環境和集羣是存在差異的,這就須要有良好的管理。服務器
Apollo是一個有治理能力的配置管理平臺,它提供了統一管理不一樣環境、不一樣集羣的配置,而且配置的修改是實時生效的。每一次配置的修改發佈都會造成新的版本,可以方便配置出錯時進行回滾。微信
Apollo支持灰度發佈,對某些重要功能能夠事先在多個機器上試運行,沒有問題後再發布。它還提供了權限管理、發佈審覈、操做審計的功能,而且可以對客戶端配置信息進行監控。順帶一提Apollo有着java和.net的原生客戶端,對Spring也有很好的支持。架構
上圖是Apollo的配置中心界面,左上方是一個環境列表,列出了當前應用的全部環境,下方是一些項目信息。右側的兩部分能夠簡單的認爲是兩個文件,其中Application每一個應用都具有,默認的配置管理經過表格形勢展示,能夠看到這其中還有更改歷史、修改人之類的信息以及一些功能按鈕。app
Apollo中添加修改配置項能夠經過新建或修改配置的按鈕直接操做。須要注意的是修改的配置不會即時生效,而是須要點擊發布後才能生效。框架
能夠看到首先咱們要獲取config對象,而後調用getIntProperty方法並傳入key和默認值,經過這種方式能夠獲取到程序的最新值。
而經過上面的代碼可讓開發人員實時的獲取到配置的變化,Apollo提供了事件觸發機制,只須要添加一個addChangeListener就好了,每次配置變化的時候會調用onChange方法,而且傳入對應配置變化的事件,這個事件包含配置項的改變。
對於Spring集成的簡單用法只須要在AppConfig類上添加EnableApolloConfig。實際的配置中咱們仍是建議使用下方的方式,它一樣支持配置變化事件。
以前提到過Apollo支持4個維度,在應用維度中,處於運行時狀態下,Apollo能夠經過惟一標識的appId來識別應用。環境維度中,咱們認爲環境信息與代碼無關,只跟當前代碼部署機體有關,因此默認這類信息存放在機器上。
第三個維度是集羣,它至關於一個應用下不一樣實例的分組,集羣既能夠是物理性的也能夠是邏輯性的。對於不一樣的集羣能夠有不同的配置,咱們默認數據中心做爲集羣。
最後的維度namespace(命名空間)是比較抽象的概念,簡單理解就是一個應用下不一樣配置的分組,應用默認有本身的配置namespace-application,也可使用公共組件的配置。
圖中最下方的Config Serivce主要提供配置的讀取、推送等功能,服務對象是客戶端。Admin Service則是提供對配置的修改、發佈、審計這些功能,服務對象是Apollo服務界面。這兩個服務都是多實例無狀態部署。
再往上層的Mate Server主要是用來封裝Eureka服務搭建的接口。在實際的調用中,客戶端首先會從Mate Server獲取所關心的服務的地址列表,以後直接經過IP和端口訪問對應接口。
爲了實際部署時候的方便,Mate Server、Eureka、Config Service都被部署到一個節點上。
Eureka提供了完整的服務註冊和發佈的實現,而且還能與Spring Cloud無縫集成,經過這樣的集成就能夠將原本依賴外部的Eureka變成了內部實現。同時由於Eureka是開源的,因此可以比較快的去發現問題,瞭解實現原理。
客戶端的運行時和應用是在同一個容器中,應用在啓動時客戶端會作初始化向配置中心拉取配置,獲取到的配置在應用的內存和本地文件分別緩存一份。同時客戶端和服務端會保持長鏈接,以保證能實時的感知到配置的變化。
客戶端發起長鏈接,服務端默認保持30秒鏈接,這期間配置發生變化就返回,若一直沒有發生改變服務端就斷開鏈接,客戶端自動重連。爲了保證服務端的長連能力,咱們使用了異步servlet,實現了Spring DeferredResult。
Github地址:https://github.com/ctripcorp/apollo
服務端基於Spring Cloud和Spring Boot開發