背景 通常,.Net 應用程式中的配置存儲在配置文件中,例如 App.config、Web.config 或 appsettings.json。從 ASP.Net Core 開始,出現了一個新的可擴展配置框架,它允許將配置存儲在配置文件之外,並從命令行、環境變數等等中檢索它們。 在傳統項目中,修改配 ...
背景
通常,.Net 應用程式中的配置存儲在配置文件中,例如 App.config、Web.config 或 appsettings.json。從 ASP.Net Core 開始,出現了一個新的可擴展配置框架,它允許將配置存儲在配置文件之外,並從命令行、環境變數等等中檢索它們。
在傳統項目中,修改配置文件,需要登錄生產環境進行修改,當項目多的時候,不便於維護和管理。
因此我們通過Consul線上實時配置,則達到了只更改配置不重啟服務即可實時響應的目的。實現思路基於Consul的Key/value ,多個Consul 節點之間可以自動同步配置,我們的程式中就是實現ConfigurationProvider,監聽Consul變化。
Consul 配置
關於 下載安裝,可以參考:
【架構篇】.net/c# 基於 Consul 實現分散式配置之Key/Value存儲
https://down.itsvse.com/k/zdxr0g.html
ASP.NET Core 配置
首先,安裝nuget包,命令如下:
Install-Package Consul
Install-Package Winton.Extensions.Configuration.Consul
修改 Program.cs 文件,代碼如下:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using System;
using Winton.Extensions.Configuration.Consul;
namespace WebApplication1
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
hostingContext.Configuration = config.Build();
string consul_url = hostingContext.Configuration["Consul_Url"];
Console.WriteLine(consul_url);
Console.WriteLine(env.ApplicationName);
Console.WriteLine(env.EnvironmentName);
config.AddConsul(
$"{env.ApplicationName}/appsettings.{env.EnvironmentName}.json",
options =>
{
options.Optional = true;
options.ReloadOnChange = true;
options.OnLoadException = exceptionContext => { exceptionContext.Ignore = true; };
options.ConsulConfigurationOptions = cco => { cco.Address = new Uri(consul_url); };
}
);
hostingContext.Configuration = config.Build();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
關於 Configuration 更多配置,可以參考:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1
配置 Consul 服務中心地址,修改 appsettings.json 文件,配置如下:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"Consul_Url": "http://127.0.0.1:8500"
}
控制器代碼如下:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public readonly IConfiguration _configuration;
public HomeController(ILogger<HomeController> logger, IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
}
public IActionResult Index()
{
return Ok("獲取test值:" + _configuration["test"]);
}
}
}
啟動項目,如下圖:
由於,我們 Consul 並沒有在配置 test 的值,所以獲取為空。
打開 http://127.0.0.1:8500/ui/dc1/kv 配置項目所需要的文件。
項目讀取的配置文件地址為:
“/WebApplication1/appsettings.Development.json”
因此,我們需要新建“WebApplication1”文件夾和“appsettings.Development.json”文件,如下圖:
Value 如下:
{
"test": "itsvse"
}
保存後,我們重新刷新網站,如下圖:
測試中文字元,也沒有任何問題,如下圖:
可以看到,成功獲取到了test的值,這就實現了動態配置功能,無需重新網站,就實現了配置文件的熱更新。
原文鏈接:https://down.itsvse.com/k/of9b7k.html