文章目錄
一、概念篇
1 什麼是配置中心?
2 為什麼要使用配置中心?
3 配置中心選擇對比
3.1 Apollo
3.2 Consul
3.3 Nacos
二、.Net項目接入
1 Nuget包引用
2 配置檔案中配置Consul位址
3 Program檔案修改
4 動态加載配置資訊
一、概念篇
1 什麼是配置中心?
配置是用來動态修改程式執行的一種行為的機制
2 為什麼要使用配置中心?
安全性:配置跟随源代碼儲存在代碼庫中,容易造成配置洩漏。
時效性:修改配置,需要重新開機服務才能生效。
局限性:無法支援動态調整:例如日志開關、功能開關。
3 配置中心選擇對比
3.1 Apollo
Java開發 ----- 運維成本比高
Apollo分為MySQL,Config Service,Admin Service,Portal四個子產品,MySQL存儲Apollo中繼資料和使用者配置資料; Config Service提供配置的讀取、推送等功能,用戶端請求都是落到Config Service上; Admin Service提供配置的修改、釋出等功能,Portal操作的服務就是Admin Service; Portal提供給使用者配置管理界面;功能強大,社群活躍,但較為複雜,部署元件較多,運維成本比高
3.2 Consul
go開發
依賴:不依賴其他元件
應用内/外:屬于外部應用,侵入性小
ACP原則:遵循CP原則(一緻性+分離容忍) 服務注冊稍慢,由于其一緻性導緻了在Leader挂掉時重新選舉期間真個consul不可用。
版本疊代:目前仍然進行版本疊代
內建支援:支援SpringCloud K8S內建
通路協定:HTTP/DNS
雪崩保護:不支援雪崩保護
自動登出執行個體:不支援
3.3 Nacos
依賴:mysql
應用内/外:屬于外部應用,侵入性小
ACP原則:通知遵循CP原則(一緻性+分離容忍) 和AP原則(可用性+分離容忍)
版本疊代:目前仍然進行版本疊代,最近的送出是幾天前
內建支援:支援Dubbo 、SpringCloud、K8S內建
通路協定:HTTP/動态DNS/UDP
雪崩保護:支援雪崩保護
Spring cloud config java開發 ----- Net支援比較差
自動登出執行個體:支援
界面:國産服務,中文界面,符合國人習慣
上手:極易,中文文檔,案例,社群活躍
Consul實際上是和Nacos比較相似的産品,雖然Consul目前的主要發展方向放在了Service Mesh,但是Consul最初支援的服務發現和配置管理,也是Nacos的兩大功能。雖然Nacos在Consul之後以與之相似的部署架構開源,但這并不意味着Nacos在功能和架構上也模仿Consul,Nacos的架構和功能是由阿裡巴巴内部十年的運作演進經驗得來,是以二者的比較也一定會讓大家更加了解他們的定位和演進方向是完全不一樣的。
二、.Net項目接入
1 Nuget包引用
在項目中Nuget下載下傳Winton.Extensions.Configuration.Consul
2 配置檔案中配置Consul位址
"Consul_Url": "http://127.0.0.1:8500",
1
3 Program檔案修改
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.ConfigureAppConfiguration((hostingContext, config) =>
{
// 加載預設配置資訊到Configuration
hostingContext.Configuration = config.Build();
// 加載consul配置中心配置
string consul_url = hostingContext.Configuration["Consul_Url"];
Console.WriteLine(#34;consul_url:{consul_url}");
// 動态加載環境資訊,主要在于動态擷取服務名稱和環境名稱
var env = hostingContext.HostingEnvironment;
config.AddConsul(
#34;{env.ApplicationName}/appsettings.{env.EnvironmentName}.json",
options =>
{
options.ConsulConfigurationOptions = cco => { cco.Address = new Uri(consul_url); }; // 1、consul位址
options.Optional = true; // 2、配置選項
options.ReloadOnChange = true; // 3、配置檔案更新後重新加載
options.OnLoadException = exceptionContext => { exceptionContext.Ignore = true; }; // 4、忽略異常
}
);
config.AddConsul(
#34;{env.ApplicationName}/other.json",
options =>
{
options.ConsulConfigurationOptions = cco => { cco.Address = new Uri(consul_url); }; // 1、consul位址
options.Optional = true; // 2、配置選項
options.ReloadOnChange = true; // 3、配置檔案更新後重新加載
options.OnLoadException = exceptionContext => { exceptionContext.Ignore = true; }; // 4、忽略異常
}
);
hostingContext.Configuration = config.Build(); // 5、consul中加載的配置資訊加載到Configuration對象,然後通過Configuration 對象附加元件目中
});
});
4 動态加載配置資訊
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync(Configuration["Name"]);
});
});