zoukankan      html  css  js  c++  java
  • 【架构篇】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://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

  • 相关阅读:
    C#中使用MATLAB
    各种插值法及效果图对比
    Visual Studio中你所不知道的智能感知
    C#中使用Surfer
    XCode中连接使用GitHub
    个人作业Week1
    个人作业Week3
    个人作业Week2
    第一次作业——subway
    执行ajax加载页面中的js总结
  • 原文地址:https://www.cnblogs.com/itsvse/p/12191299.html
Copyright © 2011-2022 走看看