1. 程式人生 > >造輪子-AgileConfig基於.NetCore的一個輕量級配置中心

造輪子-AgileConfig基於.NetCore的一個輕量級配置中心

微服務確實是行業的一個趨勢,我自己也在把一些專案往微服務架構遷移。玩微服務架構配置中心是一個繞不過去的東西,有很多大牌的可以選,比如spring-cloud-config,apoll,disconf等等。而我為什麼還要造一個輪子呢?一來這些都不是.net實現的,我就想試試用.net core實現一個,而且他們也對.net不太友好,也只有apoll提供了官方的.net客戶端。二來這些元件都太重量級了,比如apoll,光跑起來就要部署多個節點(admin,portal,meta sevice)還要依賴eureka。很多舊的專案往微服務遷移的時候並不是一下次全部調整完成的,可能是一步步來的,比如先把所有的服務都容器化,並沒有使用微服務全家桶。而且有的專案也不需要微服務全家桶,畢竟微服務不是銀彈,很多專案單體結構就足夠了,有些專案傳統的SOA架構也可以了。(嘮叨一句,那種毫無流量毫無併發的專案,幾人幾天就搞完的強上微服務真的好嗎?)但是這些專案也可能是分散式的,容器化部署的,那麼這些專案我覺得也是需要配置中心的,因為在分散式、容器化環境下更改配置實在是太麻煩了。可以說配置中心並不是微服務獨有的。基於以上原因我提煉了一些配置中心必備的功能,做的儘量簡單(陋),開發了AgileConfig,為.net core的生態盡一份綿薄之力。 > **Github求star:** [AgileConfig](https://github.com/kklldog/AgileConfig) # AgileConfig 這是一個基於.net core開發的輕量級配置中心。 1. 部署簡單,最少只需要一個數據節點,支援docker部署 2. 支援多節點分散式部署來保證高可用 3. 配置支援按應用隔離,應用內配置支援分組隔離 4. 使用長連線技術,配置資訊實時推送至客戶端 5. 支援IConfiguration,IOptions模式讀取配置,原程式幾乎可以不用改造 6. 配置修改支援版本記錄,隨時回滾配置 7. 如果所有節點都故障,客戶端支援從本地快取讀取配置 ## 架構 ![](https://s1.ax1x.com/2020/06/29/NRz1gO.png) AgileConfig的架構比較簡單,主要是分3塊: ### 客戶端 客戶端程式是使用netstandard2.0開發的一個類庫,方便.net core程式接入,nuget搜agileconfig.client就可以安裝。可以在啟動客戶端的時候配置多個節點的地址,客戶端會隨機挑選一個進行連線,連線成功後會維持一個websocket長連線。如果連線的節點發生故障導致連線中斷,客戶端會繼續隨機一個節點進行連線,直到連線成功。 ### 節點、管理程式 節點是使用asp.net core開發的一個服務。為了部署簡單,直接把管理程式跟節點服務合二為一了。任何一個節點都可以在啟動的時候配置環境變數開啟管理程式功能。 ### 資料庫 使用資料庫來儲存資料,目前支援Sqlserver, Mysql, Sqlite 三種資料庫。因為服務端使用EF Core框架訪問資料,原則上只要EF Core支援的資料庫,節點就可以很方便的支援它。 ## 部署服務端 ## 初始化資料庫 使用者只需要手工建一個空庫,所有的表在第一次啟動的時候都會自動生成。目前支援sqlserver,mysql,sqlite三種資料庫。 ## 使用服務端 ### 執行服務端 ``` sudo docker run --name agile_config -e adminConsole=true -e db:provider=sqlite -e db:conn="Data Source=agile_config.db" -p 5000:5000 kklldog/agile_config:latest ``` 通過docker建立一個agile_config例項,其中有3個環境變數需要配置: 1. adminConsole 配置程式是否為管理控制檯。如果為true則啟用控制檯功能,訪問該例項會出現管理介面。 2. db:provider 配置程式的資料庫型別。目前程式支援:sqlite,mysql,sqlserver 三種資料庫。 3. db:conn 配置資料庫連線串 ![](https://s1.ax1x.com/2020/06/09/t4rDfA.png) ### 初始化管理員密碼 第一次遠行程式需要初始化管理員密碼 ![](https://s1.ax1x.com/2020/06/09/t4DgIJ.png) ### 節點 AgileConfig支援多節點部署,所有的節點都是平行的。為了簡化部署,AgileConfig並沒有單獨的控制檯程式,請直接使用任意一個節點作為控制檯。當環境變數adminConsole=true時,該節點同時兼備資料節點跟控制檯功能。為了控制檯能夠管理節點,所以需要在控制檯配置節點的資訊。 > 注意:即使是作為控制檯的資料節點同樣需要新增到管理程式,以便管理它。 ![](https://s1.ax1x.com/2020/06/09/t4DxQP.png) ### 應用 AgileConfig支援多應用程式接入。需要為每個應用程式配置名稱、ID、祕鑰等資訊。 ![](https://s1.ax1x.com/2020/06/09/t4rSL8.png) ### 配置項 配置完應用資訊後可以為每個應用配置配置項。配置項支援分組。新新增的配置並不會被客戶端感知到,需要手工點選“上線”才會推送給客戶端。已上線的配置如果發生修改、刪除、回滾操作,會實時推送給客戶端。版本歷史記錄了配置的歷史資訊,可以回滾至任意版本。 ![](https://s1.ax1x.com/2020/06/09/t4rFij.png) ### 客戶端 控制檯可以檢視已連線的客戶端。 ![](https://s1.ax1x.com/2020/06/09/t4rmLT.png) ### 系統日誌 系統日誌記錄了AgileConfig生產中的一些關鍵資訊。 ![](https://s1.ax1x.com/2020/06/09/t4rYy6.png) ## 使用客戶端 ### 安裝客戶端 ``` Install-Package AgileConfig.Client ``` ### 初始化客戶端 以asp.net core mvc專案為例: 修改appsettings.json ``` { "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*", //agile_config "AgileConfig": { "appId": "app", "secret": "xxx", "nodes": "http://localhost:5000,http://localhost:5001"//多個節點使用逗號分隔 } } ``` 修改program: ``` public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, config) => { //讀取本地配置 var localconfig = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json").Build(); //從本地配置裡讀取AgileConfig的相關資訊 var appId = localconfig["AgileConfig:appId"]; var secret = localconfig["AgileConfig:secret"]; var nodes = localconfig["AgileConfig:nodes"]; //new一個client例項 var configClient = new ConfigClient(appId, secret, nodes); //使用AddAgileConfig配置一個新的IConfigurationSource config.AddAgileConfig(configClient); //找一個變數掛載client例項,以便其他地方可以直接使用例項訪問配置 ConfigClient = configClient; //註冊配置項修改事件 configClient.ConfigChanged += ConfigClient_ConfigChanged; }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup