【架構篇】ASP.NET Core 基於 Consul 動態配置熱更新

背景

一般,.Net 應用程序中的配置存儲在配置文件中,例如 App.config、Web.config 或 appsettings.json。從 ASP.Net Core 開始,出現了一個新的可擴展配置框架,它容許將配置存儲在配置文件以外,並從命令行、環境變量等等中檢索它們。html

在傳統項目中,修改配置文件,須要登陸生產環境進行修改,當項目多的時候,不便於維護和管理。web

所以咱們經過Consul在線實時配置,則達到了只更改配置不重啓服務便可實時響應的目的。實現思路基於Consul的Key/value ,多個Consul 節點之間能夠自動同步配置,咱們的程序中就是實現ConfigurationProvider,監聽Consul變化。json

Consul 配置

關於 下載安裝,能夠參考:c#

【架構篇】.net/c# 基於 Consul 實現分佈式配置之Key/Value存儲架構

https://down.itsvse.com/k/zdxr0g.htmlapp

ASP.NET Core 配置

首先,安裝nuget包,命令以下:框架

Install-Package Consul
Install-Package Winton.Extensions.Configuration.Consul

修改 Program.cs 文件,代碼以下:asp.net

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.1ide

配置 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

相關文章
相關標籤/搜索