Apollo配置中心如何實現配置熱發佈

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#40A9FF","name":"blue"}},{"type":"strong","attrs":{}}],"text":"真正的大師永遠懷着一顆學徒的心","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"引言","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"配置中心在微服務架構體系中是非常重要的基礎設施服務,承擔着分佈式配置集中管理、配置熱發佈以及審計等重要的職責。本文主要探討","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"Apollo","attrs":{}}],"attrs":{}},{"type":"text","text":"配置中心的配置熱發佈特性如何實現。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"配置熱發佈如何實現","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/15/157e76805344a47ea7c51f69885efe92.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1、配置發佈主流程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如上圖所示,配置發佈的主流程如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(1)用戶通過Portal向AdminService發佈配置信息;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(2)AdminService在配置發佈後會往ReleaseMessage表插入一條消息記錄;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(3)ConfigService中包含了一個定時線程,該定時線程每秒掃描一次ReleaseMessage表,檢查表中是否有新的消息記錄;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(4)如果存在配置更新,ConfigService就會通知所有的消息監聽器;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(5)通知Controller會根據發佈的配置信息通知對應的客戶端;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"客戶端與配置中心的大致交互如下所示:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/99/99f9c5842426a122298620be2b09881d.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏的配置更新推送其實並不是真正進行信息推送,而是通過長輪詢來實現配置的更新。實際上並不是配置的更新推送,而是配置更新通知的推送,客戶端拿到通知後需要進一步獲取具體的變化的配置信息。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2、長輪詢","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"(1)如果使用","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"Push","attrs":{}}],"attrs":{}},{"type":"text","text":"方式推送數據會有什麼問題?","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/96/9682a5478f2566520b584525f7be2c01.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"服務端需要與客戶端建立長連接,服務端有數據更新的時候可以進行數據推送,數據更新比較及時。但是服務端無法感知客戶端的處理能力,可能會造成數據積壓。另外集羣情況下部分節點不在線會通知失敗,等客戶端又在線後需要進行補償推送,節點還有可能存在擴容等各種情況。對於配置中心這種業務場景來說,通過Push方式實現數據推動顯得複雜了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"(2)如果使用","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"Pull","attrs":{}}],"attrs":{}},{"type":"text","text":"方式拉取數據會有什麼問題?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/3b/3bbe7afa2d04773de7952c4d97a6e61b.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Pull模式主要是通過客戶端主動向配置中心進行數據請求,拉取對應的配置信息。由於是客戶端主動拉取,因此不會出現數據堆積的問題。但是數據如何去拉,什麼時間去拉,拉的頻率如何控制,這些都是問題。如果頻率過高,而配置並未更新,那麼就會對服務端造成不必要的連接壓力。如果頻率過低,那麼配置更新就會存在延時的問題。因此同樣不適合配置中心的業務場景。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"(3)長輪詢","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"客戶端向配置中心進行請求,配置中心不會立即返回響應,而是會hold住這個請求直到指定時間超時後進行返回。如果沒有配置變更,則返回Http狀態碼304給客戶端。超時返回後,客戶端將再次發起請求。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果存在配置變更,將返回對應的namespace信息,客戶端根據namespace信息獲取對應的配置信息。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"另外爲了保證配置的有效性,客戶端也會定時請求配置信息,防止配置更新可能出現的異常情況,是一種數據保證的兜底fallback機制。另外當獲取到配置後,會同步到本地配置文件中 。這樣即便客戶端與配置中心無法通信,客戶端也可以從本地配置文件中獲取配置信息。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那麼問題來了,爲什麼不直接在長輪詢的響應中直接回復配置信息呢?主要是由於本身已經存在了定時拉取配置的步驟,那麼爲了保證單一原則以及代碼上的簡潔以及複用。所以通過這種獲取配置更新後再進行數據拉取的方式。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3、客戶端獲取配置信息","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們一起看下客戶端如何工作流程,如下圖:","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/a3/a32a7f9b7ee75b5bbeffc71605b756bb.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(1)ConfigServiceLocator:主要負責向Eruka註冊中心獲取ConfigService地址列表信息;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(2)RemoteConfigLongPollService:從ConfigServiceLocator獲取到地址列表信息後,通過長輪詢的方式獲取配置變更信息;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(3)RemoteConfigReposity:從ConfigService獲取變更的配置數據;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(4)LocalFileConfigReposity:把配置數據固化到本地,同時作爲本地配置數據的來源;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(5)DefaultConfig:主要和業務方進行交互,提供配置獲取方法,同時可以註冊配置變更事件。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"總結","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文主要探討了Apollo配置中心配置熱發佈的相關內容,分析了爲什麼長輪詢是比較適合配置中心的數據交互方式。在今後的架構設計中我們也可以以此來作爲參考。另外客戶端的設計中,也體現了了分層以及職責單一的代碼風格,我們自己在實際項目開發中也比較有借鑑的意義。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我是慕楓,感謝各位小夥伴點贊、收藏和評論,文章持續跟新,我們下期再見!","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"微信搜索:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"慕楓技術筆記","attrs":{}},{"type":"text","text":",優質文章持續更新,我們有學習打卡的羣可以拉你進,一起努力衝擊大廠,另外有很多學習以及面試的材料提供給大家。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/7f/7ff6f4cf7dc92ed189149727ace4dc43.gif","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章