欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-02 15:13:22
背景 通常,.Net 应用程序中的配置存储在配置文件中,例如 App.config、Web.config 或 appsettings.json。从 ASP.Net Core 开始,出现了一个新的可扩展配置框架,它允许将配置存储在配置文件之外,并从命令行、环境变量等等中检索它们。 在传统项目中,修改配 ......

背景

通常,.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"]);
        }
    }
}

启动项目,如下图:

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

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

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

打开 配置项目所需要的文件。

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

“/webapplication1/appsettings.development.json”

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

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

value 如下:

{
    "test": "itsvse"
}

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

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

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

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

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

原文链接: