架构师_程序员

查看: 75|回复: 0
打印 上一主题 下一主题

[资料] 【架构篇】ASP.NET Core 基于 Consul 动态配置热更新

[复制链接]
跳转到指定楼层
楼主
发表于 2020-10-16 18:25:34 | 只看该作者
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存储
https://www.itsvse.com/thread-9420-1-1.html

ASP.NET Core 配置

首先,安装nuget包,命令如下:

  1. Install-Package Consul
  2. Install-Package Winton.Extensions.Configuration.Consul
复制代码


修改 Program.cs 文件,代码如下:

  1. using Microsoft.AspNetCore.Hosting;
  2. using Microsoft.Extensions.Hosting;
  3. using System;
  4. using Winton.Extensions.Configuration.Consul;

  5. namespace WebApplication1
  6. {
  7.     public class Program
  8.     {
  9.         public static void Main(string[] args)
  10.         {
  11.             CreateHostBuilder(args).Build().Run();
  12.         }

  13.         public static IHostBuilder CreateHostBuilder(string[] args) =>
  14.             Host.CreateDefaultBuilder(args)
  15.                 .ConfigureAppConfiguration((hostingContext, config) =>
  16.                 {
  17.                     var env = hostingContext.HostingEnvironment;
  18.                     hostingContext.Configuration = config.Build();
  19.                     string consul_url = hostingContext.Configuration["Consul_Url"];
  20.                     Console.WriteLine(consul_url);
  21.                     Console.WriteLine(env.ApplicationName);
  22.                     Console.WriteLine(env.EnvironmentName);
  23.                     config.AddConsul(
  24.                                 $"{env.ApplicationName}/appsettings.{env.EnvironmentName}.json",
  25.                                 options =>
  26.                                 {
  27.                                     options.Optional = true;
  28.                                     options.ReloadOnChange = true;
  29.                                     options.OnLoadException = exceptionContext => { exceptionContext.Ignore = true; };
  30.                                     options.ConsulConfigurationOptions = cco => { cco.Address = new Uri(consul_url); };
  31.                                 }
  32.                                 );

  33.                     hostingContext.Configuration = config.Build();
  34.                 })
  35.                 .ConfigureWebHostDefaults(webBuilder =>
  36.                 {
  37.                     webBuilder.UseStartup<Startup>();
  38.                 });
  39.     }
  40. }
复制代码


关于 Configuration 更多配置,可以参考:

https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1

配置 Consul 服务中心地址,修改 appsettings.json 文件,配置如下:

  1. {
  2.   "Logging": {
  3.     "LogLevel": {
  4.       "Default": "Information",
  5.       "Microsoft": "Warning",
  6.       "Microsoft.Hosting.Lifetime": "Information"
  7.     }
  8.   },
  9.   "AllowedHosts": "*",
  10.   "Consul_Url": "http://127.0.0.1:8500"
  11. }
复制代码


控制器代码如下:

  1. using Microsoft.AspNetCore.Mvc;
  2. using Microsoft.Extensions.Configuration;
  3. using Microsoft.Extensions.Logging;

  4. namespace WebApplication1.Controllers
  5. {
  6.     public class HomeController : Controller
  7.     {
  8.         private readonly ILogger<HomeController> _logger;

  9.         public readonly IConfiguration _configuration;

  10.         public HomeController(ILogger<HomeController> logger, IConfiguration configuration)
  11.         {
  12.             _logger = logger;
  13.             _configuration = configuration;
  14.         }

  15.         public IActionResult Index()
  16.         {
  17.             return Ok("获取test值:" + _configuration["test"]);
  18.         }
  19.     }
  20. }
复制代码


启动项目,如下图:





由于,我们 Consul 并没有在配置 test 的值,所以获取为空。

打开 http://127.0.0.1:8500/ui/dc1/kv 配置项目所需要的文件。

项目读取的配置文件地址为:

“/WebApplication1/appsettings.Development.json”

因此,我们需要新建“WebApplication1”文件夹和“appsettings.Development.json”文件,如下图:



Value 如下:

  1. {
  2.         "test": "itsvse"
  3. }
复制代码


保存后,我们重新刷新网站,如下图:



测试中文字符,也没有任何问题,如下图:



可以看到,成功获取到了test的值,这就实现了动态配置功能,无需重启网站,就实现了配置文件的热更新。




上一篇:【架构篇】.net/c# 基于 Consul 实现分布式配置之Key/Value存储
下一篇:【架构篇】ASP.NET Core 基于 Consul 之服务高可用
帖子永久地址: 

架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与架构师_程序员享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和架构师_程序员的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、架构师_程序员管理员和版主有权不事先通知发贴者而删除本文

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2020-10-28 19:30

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表