技术分享|集成开放平台使用Consul Watch机制实现配置热更新
源寶導讀:在微服務架構體系中,由于微服務眾多,服務之間又有互相調用關系,因此,一個通用的分布式配置管理是必不可少的。本文將介紹如何使用Consul Watch機制實現配置集中管理與熱更新。
前言
隨著程序功能的日益復雜,程序的配置日益增多:各種功能的開關、參數的配置、服務器的地址等等,對程序配置的期望值也越來越高:配置修改后實時生效,分環境、分集群管理配置,代碼安全、審核機制。在這樣的大環境下,傳統的通過配置文件、數據庫等方式已經越來越無法滿足開發人員對配置管理的需求。所以,配置中心應運而生。
在微服務架構體系中,由于微服務眾多,服務之間又有互相調用關系,因此,一個通用的分布式配置管理是必不可少的。一般來說,配置管理需要解決配置集中管理、在系統運行期間可實現動態配置、配置修改后支持自動刷新等問題。
一、Consul在集成開放平臺的使用場景
天際集成開放平臺深度集成Consul,實現微服務架構中的以下場景:
1 .服務注冊:Consul提供了通過DNS或者HTTP接口的方式將我們的服務信息注冊給Consul
2 .服務發現:Consul提供了通過DNS或者HTTP接口的方式查詢發現注冊的服務。這樣外部可以很容易的發現它所依賴的服務
3.服務負載均衡:Consul的服務注冊是集群式的。我們可用通過負載均衡算法從Consul注冊的服務列表中負載出一個可以被訪問的服務
4 .Key/Value配置中心:應用程序可以根據自己的需要使用Consul提供的Key/Value存儲。Consul提供了簡單易用的HTTP接口,結合其他工具可以實現動態配置、功能標記、領袖選舉等等功能
5 .健康檢查:Consul的Client可以提供任意數量的健康檢查,可以與給定的服務相關聯(HTTP服務是否返回200)。系統可以使用這些信息來監視集群的健康狀況,服務發現組件可以使用這些信息將流量從不健康的主機路由出去
二、Consul K/V查詢與Blocking Query
2.1 Consul提供的Watch類型
1.?Key – 監視指定K/V鍵值對
2. Keyprefix – 監視指定的Keyprefix
3. Services – 監視服務列表
4.nodes – 監控節點列表
5. service – 監視服務實例
6. checks- 監視健康檢查的值
2.2 Consul K/V 查詢
2.2.1 K/V查詢
通過Consul提供的K/V HTTP API。我們可以很容易的對Consul的K/V進行寫入,修改,查詢操作。
通過Consul管理控制臺,我們新建一個Key為Config的配置項并設置值為?{"title":"測試標題","MaxTaskCount":3}。
調用Consul K/V查詢API?http://127.0.0.1:8500/v1/kv/{key}可以查詢key下Value的值,此處,我們需要查詢是Key是Config。所以,完整的Uri是http://127.0.0.1:8500/v1/kv/Config。
查詢結果?
{"LockIndex": 0,"Key": "Config","Flags": 0,"Value": "ewoidGl0bGUiOiLmtYvor5XmoIfpopgiLAoiTWF4VGFza0NvdW50IjozCn0=","CreateIndex": 7319758,"ModifyIndex": 7319803}通過查詢結果可以獲取Config的Value信息,HTTP API查詢的Value一般是字節的Base64表現形式。當然,在實際的編碼過程中,我們不會直接使用HTTP API調用。而是通過Consul Client SDK進行調用。
C#使用Consul Client SDK查詢K/V?
var uri = new UriBuilder("http", "127.0.0.1", 8500); IConsulClient client = new ConsulClient(config => config.Address = uri.Uri); var response =await client.KV.Get("Config"); var value = string.Empty;if (response?.StatusCode == System.Net.HttpStatusCode.OK){value = Encoding.UTF8.GetString(response.Response?.Value); }上述查詢代碼可以獲取Config的真實配置值?{"title":"測試標題","MaxTaskCount":3}。
2.2.2?Keyprefix查詢
2.2.1章節中介紹了如何進行Consul的K/V查詢。而在實際的使用過程中,不僅僅會進行的K/V查詢。還會使用Keyprefix方式來查詢某個prefix下的所有K/V信息。
在Consul管理控制臺,新建Key Students,在Students Key下新建多個K/V,如下圖所示:
設置查詢的prefix為Students,查詢結果應該為Students下配置的所有的K/V數據列表。
C#使用Consu Client Sdk執行Keyprefix查詢?
var uri = new UriBuilder("http", "127.0.0.1", 8500);IConsulClient client = new ConsulClient(config => config.Address = uri.Uri);var response =await client.KV.List("Students");var kvList = new List<string>();if (response?.StatusCode == System.Net.HttpStatusCode.OK){foreach (var kVPair in response.Response){if (kVPair.Value != null){var value = Encoding.UTF8.GetString(kVPair.Value);kvList.Add(value);}}}var outPutString = JsonSerializer.Serialize(kvList);查詢結果?
[{"name":"Nick","address":"test address","age":18},{"name":"Tom","address":"test address","age":18} ]2.3 Consul Blocking Query
上述2.1、2.2章節介紹了Consul的K/V查詢的兩種方式。要實現配置實時更新通知Consul K/V查詢只是第一步,而下面要介紹的就是關鍵的第二步,Consul的Blocking Query。
Blocking Query官方定義:
Many endpoints in Consul support a feature known as "blocking queries". A blocking query is used to wait for a potential change using long polling. Not all endpoints support blocking, but each endpoint uniquely documents its support for blocking queries in the documentation.
Endpoints that support blocking queries return an HTTP header named?X-Consul-Index. This is a unique identifier representing the current state of the requested resource.
On subsequent requests for this resource, the client can set the?index?query string parameter to the value of?X-Consul-Index, indicating that the client wishes to wait for any changes subsequent to that index.
When this is provided, the HTTP request will "hang" until a change in the system occurs, or the maximum timeout is reached. A critical note is that the return of a blocking request is?no guarantee?of a change. It is possible that the timeout was reached or that there was an idempotent write that does not affect the result of the query.
In addition to?index, endpoints that support blocking will also honor a?wait?parameter specifying a maximum duration for the blocking request. This is limited to 10 minutes. If not set, the wait time defaults to 5 minutes. This value can be specified in the form of "10s" or "5m" (i.e., 10 seconds or 5 minutes, respectively). A small random amount of additional wait time is added to the supplied maximum?wait?time to spread out the wake up time of any concurrent requests. This adds up to?wait / 16?additional time to the maximum duration.
簡單來說就是當客戶端請求Consul獲取K/V時,需要攜帶一個版本號信息,Consul會比較這個客戶端版本號是否和Consul服務端的版本號一致,如果一致,則Consul會阻塞這個請求,直到Consul中的K/V發生變化,或者到達阻塞時間上限;如果版本號不一致,則立即返回。這個阻塞時間默認是5分鐘,支持自定義。
利用阻塞查詢的機制,我們可以發起一個“掛起”的查詢。這個查詢直到K/V的值發生變更才會返回,這樣,查詢發起方既能收到K/V值發生變更的通知,又能接收變更后的最新值。
Consul Blocking Query查詢?
Task.Factory.StartNew(async () => {ulong waitIndex = 0;var uri = new UriBuilder("http", "10.20.21.13", 8500);IConsulClient client = new ConsulClient(config => config.Address = uri.Uri);while (true){var response = await client.KV.Get("Config", new QueryOptions { WaitIndex = waitIndex });if (response.StatusCode == System.Net.HttpStatusCode.OK){if (response.Response?.Value != null){var value = Encoding.UTF8.GetString(response.Response?.Value);waitIndex = response.Response.ModifyIndex;}}}});上述代碼的Blocking Query經歷下面步驟:
1 .聲明客戶端查詢版本號,默認值0
2 .執行初始查詢,獲取K/V值
3 .將查詢結果中Consul服務端該K/V的最新版本號賦值給客戶端查詢版本號
4 .使用最新的客戶端版本號進行阻塞查詢
5 .最新客戶端發起的查詢將會"掛起",直到Config中Value值發生變更,查詢才會返回
上述操作是在一個后臺循環線程中運行的,所以,在”掛起“的查詢返回時即完成一次K/V更改通知。隨后進入下一次查詢”掛起操作“,直到又一次發生變更。這樣,程序在運行期間便能一直保持對某個Key的Blocking Query達到配置更改通知的目的。
三、集成開放平臺使用Consul?Blocking Query實現實時生效配置中心
第2節描述了如何使用Consul的Blocking Query實現配置實時更改通知。在集成開放平臺中,不同微服務的配置會放置在Consul的不同路徑下?,F在各服務配置之間的隔離,每個服務在啟動時會對需要在運行期間熱更新的配置發起Blocking Query,當配置管理模塊更改了服務監控的配置時,服務“掛起”的配置查詢就會收到更新通知。
四、后續思考
整體來說,集成開放平臺利用Consul實現的配置實時通知還屬于使用階段。而配置行為,配置管理,配置Consul更改通知等等并未獨立為單獨的配置服務與配置管理模塊。配置相關的代碼還是分散在各服務中。在之后的架構演變中,可以考慮將配置單獨出一個配置服務與管理。而各微服務使用的只應該是配置服務對應的SDK。這樣整體架構就指責清晰,領域獨立了。
----- END ------
作者簡介
劉同學:?研發工程師,目前負責集成開放平臺相關工作。
也許您還想看:
Jekins持續集成在ERP研發中的應用實踐
基于PaaS平臺的多應用自集成方案之公共數據集成
更多明源云·天際開放平臺場景案例與開發小知識,可以關注明源云天際開發者社區公眾號:
【DevOps】獲取流水線部署信息,查看部署快人一步
【建模】ERP日志分表,提升海量日志存取性能
總結
以上是生活随笔為你收集整理的技术分享|集成开放平台使用Consul Watch机制实现配置热更新的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何学人工智能的思考
- 下一篇: 基于虹软人脸识别,实现RTMP直播推流追