1. 簡介 為什麼需要分散式配置中心 分散式配置中心是為瞭解決在分散式系統中進行配置管理的需求而引入的。在傳統的單體應用中,通常使用配置文件集中管理系統的配置信息。然而,在分散式系統中,由於系統規模變大、節點眾多,並且可能部署在不同的伺服器上,傳統的配置文件方式會面臨一些挑戰。 首先,配置文件的修改 ...
為什麼需要分散式配置中心
分散式配置中心是為瞭解決在分散式系統中進行配置管理的需求而引入的。在傳統的單體應用中,通常使用配置文件集中管理系統的配置信息。然而,在分散式系統中,由於系統規模變大、節點眾多,並且可能部署在不同的伺服器上,傳統的配置文件方式會面臨一些挑戰。
首先,配置文件的修改和發佈需要手動操作,如果系統規模龐大則變得非常繁瑣和容易出錯。其次,配置文件不易實現動態更新,如果需要修改某項配置,需要重新部署整個應用。而對於分散式系統來說,這樣的操作會帶來不可忽視的停機時間和影響。
因此,引入分散式配置中心可以解決這些問題。分散式配置中心提供了一個集中式的管理界面,可以方便地進行配置修改和發佈。同時,它支持實時動態更新配置,可以使得配置的修改立即生效,無需重啟應用或重新部署。此外,分散式配置中心還提供了配置的版本管理、許可權控制、配置項的灰度發佈等功能,能夠更好地滿足分散式系統的配置管理需求。
什麼是分散式配置中心
分散式配置中心是一種用於管理和集中存儲分散式系統配置信息的工具或服務。它提供了一個集中化的平臺,方便開發人員對系統配置進行統一管理和調整,以滿足不同環境下的需求。
.Net 分散式配置中心通常具有以下特點:
-
集中管理:分散式配置中心將系統中各個組件或節點的配置信息集中存儲在一個地方,方便開發人員進行查看、修改和更新。
-
實時更新:分散式配置中心支持動態更新配置信息,當配置項發生改變時,可以實時通知系統中的節點或組件,使得配置的修改能夠立即生效,無需重啟應用。
-
版本控制:配置中心通常支持配置版本管理,可以記錄每次配置的修改歷史,並支持回滾到之前的版本。
-
許可權控制:為了保證配置的安全性,分散式配置中心提供了許可權管理機制,可以限制不同角色或用戶對配置的訪問和修改許可權。
-
灰度發佈:部分分散式配置中心還支持配置的灰度發佈,即將配置變更只應用於部分節點或用戶,以便逐步驗證和測試新的配置。
-
支持IConfiguration,IOptions模式讀取配置,原程式幾乎可以不用改造
通過使用分散式配置中心,團隊可以更加高效地管理和維護分散式系統的配置,降低系統配置管理的複雜度,提高系統的可維護性和靈活性。
2. Nacos 配置中心
文檔地址:
安裝
略
如何使用
-
nuget 安裝:
-
nacos-sdk-csharp
-
nacos-sdk-csharp.AspNetCore
-
nacos-sdk-csharp.Extensions.Configuration
-
-
appsetting.json 配置:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*", // 配置中心 "NacosConfig": { "Listeners": [ // 配置文件,至少要有一個 { "Optional": true, // 是否可選,true:可以不創建,但控制台會給出警告,false:必須要有 "DataId": "app1-dev.json", // 配置文件 "Group": "DEFAULT_GROUP" } ], "Namespace": "netcore",// 此處不要寫public,必須設置一個你自己的命名空間 "ServerAddresses": [ "http://localhost:8848/" ], // 伺服器地址 "UserName": "nacos", // nacos 登錄賬號 "Password": "nacos", // nacos 登錄密碼 "ConfigUseRpc": false, // 配置中心是否使用Rpc協議通信 "NamingUseRpc": false // 註冊中心是否使用RPC協議通信 } }
-
Program.cs 中添加服務
var builder = WebApplication.CreateBuilder(args); // ... builder.Host.UseNacosConfig("NacosConfig"); // NacosConfig 是appsetting.json 配置中心節點的名稱
-
創建配置文件
-
如何使用
private readonly IConfiguration _configuration; public UserController(IConfiguration configuration) { _configuration = configuration; } [HttpGet] public IActionResult GetUserList() { var s = _configuration["JwtTokenOption:TokenExpireTime"]; return Ok(s); }
配置公共部分
如果是做微服務項目,其實每個項目的配置有很多東西都是共用的,例如:jwt 配置,日誌配置等等。
修改NacosConfig節點配置
"NacosConfig": { "Listeners": [ { "Optional": true, "DataId": "app1-dev.json", "Group": "DEFAULT_GROUP" }, // 公共配置 { "Optional": true, "DataId": "app-common.json", "Group": "DEFAULT_GROUP" } ], "Namespace": "NetCloud", "serverAddresses": [ "http://101.43.242.9:8848" ], "UserName": "nacos", "Password": "nacos", "ConfigUseRpc": false, "NamingUseRpc": false }
使用方式
同上。
直接使用IConfiguration 介面註入獲取配置即可
Nacos 多環境問題
當我們所有的環境都共用一套配置中心的時候,最讓我們苦惱的問題應該是要怎麼樣去隔離這些不同的環境!
手段有如下幾種:
-
通過Namespace來區別
例如:可以建立三個命名命名空間分別代表
開發(dev),測試(test),生產(production)
-
通過Group來區別
預設的分組是
DEFAULT_GROUP
, 也可創建不同的分組代表不同的環境:開發(DEV_GROUP),測試(TEST_GROUP),生產(PRODUCTION_GROUP)
-
通過DataID來區別
DataID 顧名思義,就是數據文件ID,就是用於存放配置內容的配置文件名,可以創建不同的文件名來區分不同的環境。例如:
開發(app-dev.json),測試(app-test.json),生產(app-production.json)
在Nacos中,推薦的做法是用NameSpace來區分。
使用步驟
-
首先要為每個環境建一個命名空間,用作區分的標識。
可以考慮用應用名.環境名
的形式,只要統一就好。
-
為了演示,往每個命名空間都加一個test的配置,對應的值是環境名。
-
下麵要做的就是在不同環境的配置文件中指定對應的命名空間,這裡要用那個命名空間ID。
3. Appolo
官方文檔:
官方 GitHub:
官方 Gitee:
Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同集群的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置管理場景。
安裝步驟
1. 下載安裝包(官方提供的)
-
下載
apollo-quick-start.zip
:此壓縮包由官方提供的下載鏈接
-
準備一臺
linux centos 7
伺服器,安裝open-jdk 1.8,mysql
-
將下載好的
apollo
上傳至linux
伺服器,解壓。# 解壓 unzip apollo-quick-start.zip
-
執行
apollo
解壓後下的sql
文件夾下的兩個mysql文件ApolloConfigDb.sql 與 ApolloPortalDb.sql
導入成功後,可以通過執行以下sql語句來驗證:
select `NamespaceId`, `Key`, `Value`, `Comment` from ApolloConfigDB.Item;
NamespaceId Key Value Comment 1 timeout 100 sample timeout配置 select `Id`, `AppId`, `Name` from ApolloPortalDB.App;
Id AppId Name 1 SampleApp Sample App
2、配置資料庫連接信息
Apollo服務端需要知道如何連接到你前面創建的資料庫,所以需要編輯
註意:填入的用戶需要具備對ApolloPortalDB和ApolloConfigDB數據的讀寫許可權。
#apollo config db info apollo_config_db_url="jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai" apollo_config_db_username=用戶名 apollo_config_db_password=密碼(如果沒有密碼,留空即可) # apollo portal db info apollo_portal_db_url="jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai" apollo_portal_db_username=用戶名 apollo_portal_db_password=密碼(如果沒有密碼,留空即可)點擊複製錯誤複製成功
註意:不要修改demo.sh的其它部分
3. 安裝open-jdk 1.8
-
線上安裝
open-jdk1.8
yum install -y java-1.8.0-openjdk-devel.x86_64
-
配置環境變數
1. vi /etc/profile 2. 在末尾行添加 #set java environment JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.11.0.9-1.el7_9.x86_64 CLASSPATH=.:$JAVA_HOME/lib.tools.jar PATH=$JAVA_HOME/bin:$PATH export JAVA_HOME CLASSPATH PATH 3. 使更改的配置立即生效 source /etc/profile
-
測試是否安裝成功:
java -version
4. 啟動運行:
1. 解壓apollo-quick-start.zip unzip apollo-quick-start.zip 2. 啟動 ./demo.sh start 成功提示如下: ==== starting service ==== Service logging file is ./service/apollo-service.log Started [10768] Waiting for config service startup....... Config service started. You may visit http://localhost:8080 for service status now! Waiting for admin service startup.... Admin service started ==== starting portal ==== Portal logging file is ./portal/apollo-portal.log Started [10846] Waiting for portal startup...... Portal started. You can visit http://localhost:8070 now!
啟動成功之後出提示兩個運行地址:
-
http://虛擬機ip:8080
這個是註冊中心地址(eureka) -
http://虛擬機ip:8070
這個是apollo
配置中心配置中心登錄賬號與密碼預設為:賬號:
apollo
, 密碼:admin
-
添加應用
-
部門:選擇你的部門
-
appID
(特別重要):一般與微服務名一致 -
應用名稱: (建議格式
xx-yy-zz
例:apollo-server
) ,也可以使用中心進行命名 -
應用負責人:選擇任意一個負責人
-
項目管理員:選擇任意一個項目管理員
-
-
管理秘鑰(可選)
-
添加命名空間
預設的
application
命名空間是針對於以.properties
尾碼名結尾的配置文件,這種尾碼名一般是Java項目中所使用的配置文件。我們需要添加咱們 .Net 中常用的Json配置文件。
-
新建配置(發佈生效)
5. 卸載Apollo
-
查看apollo 進程列表,找到對應的PID
ps -ef | grep apollo
-
殺死進程
kill 進程ID
創建客戶端
dotnet-git : https://github.com/ctripcorp/apollo.net/tree/dotnet-core
-
安裝nuget包
Com.Ctrip.Framework.Apollo.Configuration
-
添加服務
builder.Host.ConfigureAppConfiguration((context, build) => { build.AddApollo(context.Configuration.GetSection("apollo")) // 註意:使用json配置時,需要指定命名空間類型為Json類型,見下方AddNamespace代碼 // 如果有多個命名空間,可以AddNamespace 多次 .AddNamespace("app", Com.Ctrip.Framework.Apollo.Enums.ConfigFileFormat.Json) .AddDefault(); });
-
配置appsetting.json
"apollo": { "AppId": "NetCloud.Apollo", "MetaServer": "http://127.0.0.1:8080", "ConfigServer": [ "http://127.0.0.1:8080" ], "Env": "DEV", // "Secret": "764c744d92a14bc8b65c4d86f324ac15", // 有則配置 }
-
使用
[ApiController] [Route("[controller]/[action]")] public class HomeController:ControllerBase { private readonly IConfiguration _configuration; public HomeController(IConfiguration configuration) { _configuration = configuration; } [HttpGet] public IActionResult Test1() { // 讀取apollo配置中心 var connectionString = _configuration.GetConnectionString("MySql"); return Ok(connectionString); } }
註意事項
-
IOptions 不能夠實時獲取到最新
-
IConfiguration/IOptionsMonitor 可以實時獲取最新配置
4. Consul 配置中心
前面介紹到了Consul 具有Key/Value 功能,意思就是用於做分散式配置中心。
4.1 安裝
省略
4.2 創建配置中心步驟
1. 單服務情況下
一般創建一個 appsettings.json
配置文件即可
2. 多服務情況下
利用文件夾分層的方式,在Consul客戶端上一個項目對應一個文件夾,然後在各自文件夾下放各自的appsettings.json, 如:ConfigCenterTest/appsettings.json、GoodsService/appsettings.json,然後在Program載入配置文件的時候,動態獲取項目名稱,進行路徑的組裝即可。
(1)創建文件夾
(2) 這個是保存好的文件夾
(3) 編寫配置文件
4.3 接入.Net 6
-
安裝包:
Winton.Extensions.Configuration.Consul
-
在Program 中加入如下代碼:
builder.WebHost.ConfigureAppConfiguration((context, config) => { var env = context.HostingEnvironment; context.Configuration = config.Build(); string consul_url = context.Configuration["Consul_Url"]; // 單服務文件命名 string configFileName = "appsettings.json"; // 多服務情況下,建議 服務名/文件名命名 ,例如 OrderService/appsettings.json // string configFileName = $"{env.ApplicationName}/appsettings.{env.EnvironmentName}.json"; config.AddConsul(configFileName, options => { options.Optional = true; options.ReloadOnChange = true; options.OnLoadException = exceptionContext => { exceptionContext.Ignore = true; }; options.ConsulConfigurationOptions = cco => { cco.Address = new Uri(consul_url); }; }); context.Configuration = config.Build(); });
其中,
context.Configuration["Consul_Url"]
需要在項目中配置。
5. SummberBoot 集成配置中心
github 文檔:
SummerBoot 是將SpringBoot的先進理念與C#的簡潔優雅合二為一,聲明式編程,專註於”做什麼”而不是”如何去做”。在更高層面寫代碼,更關心的是目標,而不是底層演算法實現的過程,SummerBoot,致力於打造一個人性化框架,讓.net開發變得更簡單優雅。
SummberBoot 目前支持的配置中心只有Nacos。
如何使用
-
刪除原有的Nacos配置(如果有則清除掉)
-
安裝nuget 包:
SummerBoot 2.0.2
-
appsetting.json 添加如下配置
"nacos": { //--------使用nacos則serviceAddress和namespaceId必填------ //nacos服務地址,如http://172.16.189.242:8848 "serviceAddress": "http://127.0.0.1:8848/", "namespaceId": "NetCloud", //--------如果需要使用nacos配置中心,則ConfigurationOption必填------ "configurationOption": { //配置的分組 "groupName": "DEFAULT_GROUP", //配置的dataId, "dataId": "app-Development.json" } }
-
Program 註入服務
builder.Host.UseNacosConfiguration();
-
測試
[ApiController] [Route("[controller]/[action]")] public class HomeController:ControllerBase { private readonly IConfiguration _configuration; public HomeController(IConfiguration configuration) { _configuration = configuration; } [HttpGet] public IActionResult Test1() { // 讀取nacos配置中心 var connectionString = _configuration.GetConnectionString("MySql"); return Ok(connectionString); } }
視頻配套鏈接:課程簡介 (cctalk.com)
海闊平魚躍,天高任我行,給我一片藍天,讓我自由翱翔。