【架构篇】ASP.NET Core 基于 Consul 动态配置热更新
背景
通常,.net 应用程序中的配置存储在配置文件中,例如 app.config、web.config 或 appsettings.json。从 asp.net core 开始,出现了一个新的可扩展配置框架,它允许将配置存储在配置文件之外,并从命令行、环境变量等等中检索它们。
在传统项目中,修改配置文件,需要登录生产环境进行修改,当项目多的时候,不便于维护和管理。
因此我们通过consul在线实时配置,则达到了只更改配置不重启服务即可实时响应的目的。实现思路基于consul的key/value ,多个consul 节点之间可以自动同步配置,我们的程序中就是实现configurationprovider,监听consul变化。
consul 配置
关于 下载安装,可以参考:
【架构篇】.net/c# 基于 consul 实现分布式配置之key/value存储
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 更多配置,可以参考:
配置 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 的值,所以获取为空。
打开 配置项目所需要的文件。
项目读取的配置文件地址为:
“/webapplication1/appsettings.development.json”
因此,我们需要新建“webapplication1”文件夹和“appsettings.development.json”文件,如下图:
value 如下:
{ "test": "itsvse" }
保存后,我们重新刷新网站,如下图:
测试中文字符,也没有任何问题,如下图:
可以看到,成功获取到了test的值,这就实现了动态配置功能,无需重新网站,就实现了配置文件的热更新。
原文链接:
上一篇: 站在更高的角度,看微服务架构的理论基础
下一篇: vue-vuex