背景
系列目錄:【NET CORE微服務一條龍應用】開始篇與目錄
在分散式或者微服務系統裡,透過配置檔案來管理配置內容,是一件比較令人痛苦的事情,再謹慎也有濕鞋的時候,這就是在專案架構發展的過程中,配置中心存在的意義。
其實配置中心的元件已經有非常出名的案例,比如攜程的阿波羅配置中心(https://github.com/ctripcorp/apollo)
為什麼又造輪子,因為不想釋出專案的時候到處切管理平臺。
基本要求
作為一個通用的配置元件,需要支援如下功能:
1、客戶端定時掃清獲信最新配置資訊併進行熱更新
2、配置有更新服務端主動推送多載或更新命令至客戶端進行配置獲取
所以涉及相對應元件如下:
1、支援廣播的訊息通知元件,目前使用redis(StackExchange.Redis)、Zookeeper(Rabbit.Zookeeper)實現客戶端全域性監聽服務,服務端可以推送不同組建不同的命令
2、支援定時獲取最新配置,目前使用HostedService實現全域性統一啟動,客戶端實現全域性啟動介面,介面使用Timer進行定時獲取配置
3、支援net core原生IConfiguration介面獲取配置中心資料
服務端設計
管理服務端主要實現:
1、三表增刪改查
2、配置內容表,每次新增或者修改,當前配置資訊版本號為,所以配置最大版本號然後加一
3、應用表串列增加主動通知功能
配置查詢服務端
主要提供配置資訊的查詢介面
1、介面入參如下
2、查詢邏輯
2.1 入參基本驗證
2.2 AppId 金鑰進行簽名驗證
2.3 請求配置環境定位
2.4 查詢當前請求應用和共有配置應用
2.5 查詢大於當前查詢版本號的配置資訊並傳回
配置中心客戶端
客戶端主要實現原理和功能
1、配置資訊請求,當前Http請求,需根據配置資訊組合請求url,然後請求獲取配置,每次請求帶上當前配置最大版本號(在以後請求時只獲取有更新的配置)
2、配置資訊本地儲存(容災),第一次獲取成功後,把配置資訊進行版本檔案儲存,以後的請求中當有配置更新時再進行檔案儲存。
3、當配置請求失敗時進行本地檔案配置資訊的還原應用。
4、配置定時獲取
5、客戶端接收更新或者多載命令
6、原生IConfiguration配置查詢支援
部分功能介紹
客戶端引數
原生IConfiguration配置查詢
檢視AddJsonFile原始碼,可以發現實現自定義配置源,需要整合和實現ConfigurationProvider和IConfigurationSource兩個方法
程式碼如下
當有配置更新時,我們需要更新到ConfigurationProvider的Data中,所以我們需要實現自定義介面IDataChangeListener的OnDataChange方法,當客戶端請求發現有配置更新時,會呼叫介面的OnDataChange把最新的配置資訊傳遞進來。
啟用原生IConfiguration方法如下:
定時配置獲取
常規做法是寫一個hostedservice的方法,然後寫一個timer去定時獲取,由於其他的元件可能都需要有定時的情況,我們統一處理了一下定時的任務,每個元件實現IExecutionService介面,然後元件會在啟動的時候迴圈呼叫IExecutionService的StartAsync的方法,元件包Bucket.Config.HostedService,原理比較簡單,使用程式碼如下:
元件命令監聽
和上面原則一樣,也進行了統一的封裝,目前監聽主要實現了redis和zookeeper,下麵舉例redis
元件監聽需實現介面
命令序列化物體
在hostedservice啟動時實現
在介面IExtractCommand裡會根據各個監聽元件的ListenerName進行對應的呼叫
使用方法如下:
所以對應元件實現的命令監聽只要關心自身邏輯即可嗎,程式碼如下
配置中心使用配置如下
Appsettings.json相關配置資訊轉移至配置中心
由於配置中心客戶端實現了原生的IConfiguration,所以appsetting的相關配置我們完全可以移至配置中心中,由於appsetting使用的是json,所以在配置中心服務端配置資訊的Key需要轉換,舉例:
在配置中心key如下:
BucketListener:Redis:ConnectionString
BucketListener:Redis:ListenerKey
……
陣列使用如下:
DbConfig:0:Name
DbConfig:0:DbType
DbConfig:1:Name
DbConfig:1:DbType
總結
個人寫作水平有限,涉及的東西也很多,篇幅有限所以只做了大體介紹,忘諒解
本章涉及原始碼
https://github.com/q315523275/FamilyBucket/tree/master/src/Config 客戶端元件
https://github.com/q315523275/FamilyBucket/tree/master/%E5%9F%BA%E7%A1%80%E6%9C%8D%E5%8A%A1%E9%A1%B9%E7%9B%AE/Pinzhi.ConfigServer 配置查詢服務端
https://github.com/q315523275/FamilyBucket/tree/master/%E5%9F%BA%E7%A1%80%E6%9C%8D%E5%8A%A1%E9%A1%B9%E7%9B%AE/Pinzhi.Platform 綜合管理服務介面
相關文章:
原文地址:https://www.cnblogs.com/tianxiangzhe/p/10342428.html