查看原文
其他

ASP.NET Core基于Consul动态配置热更新

DotNet 2021-09-23

(给DotNet加星标,提升.Net技能

转自:_小渣渣 
cnblogs.com/itsvse/p/12191299.html

背景


通常.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的值,这就实现了动态配置功能,无需重新网站,就实现了配置文件的热更新。


推荐阅读  点击标题可跳转
.NET 5 Preview 1 发布.NET中的控制反转及AutoFac.NET Core+Vue后台管理基础框架后端授权


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

好文章,我在看❤️

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存