【架構篇】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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM