您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > .NET

Asp.Net Core自定义配置中心客户端

时间:2023-02-23 15:13:07  来源:今日头条  作者:不知名程序猿

说明:下面的实例是通过阅读Nacos的SDK源码,提取出来的关键实现。

Asp.NET core添加一个自定义配置,只要通过IConfigurationBuilder的Add方法,传递一个实现了IConfigurationSource接口实例即可。

先定义一个NiuBConfigSource,实现接口IConfigurationSource

    public class NiuBConfigSource : NiuBOption, IConfigurationSource
    {
        public IConfigurationProvider Build(IConfigurationBuilder builder)
        {
              throw new NotImplementedException();
        }
    }

这时候,Build方法需要返回一个IConfigurationProvider的实例,那么再来定义一个IConfigurationProvider的实现类,直接继承.Net框架定义好的类ConfigurationProvider,该类实现了IConfigurationProvider接口。覆写一下Load方法,为后续的配置更新刷新内存配置做准备,重载一个Load方法,传一个键值对进来,调用原来的Load方法,实现对内存的刷新。

    public class NiuBConfigProvider : ConfigurationProvider
    {
        private Dictionary<string, string> innerCnfiguration = new Dictionary<string, string>();
        public override void Load()
        {
            foreach (string key in innerCnfiguration.Keys)
            {
                base.Data[key] = innerCnfiguration[key];
            }
            base.Load();
        }

        internal void Load(Dictionary<string, string> configuration)
        {
            this.innerCnfiguration = configuration;
            this.Load();
        }
    }

这时候NiuBConfigSource就可以返回一个IConfigurationProvider实例了

    public class NiuBConfigSource :  IConfigurationSource
    {
        public IConfigurationProvider Build(IConfigurationBuilder builder)
        {
            return new NiuBConfigProvider(service);
        }
    }

为了方便使用,定义一个WebApplicationBuilder的扩展方法UseNiuBConfigure

    public static class NiuBConfigProviderExtension
    {
        public static IConfigurationBuilder UseNiuBConfigure(this WebApplicationBuilder builder)
        {
            NiuBConfigSource source = new NiuBConfigSource();
            IConfigurationBuilder configBuilder = builder.Configuration;
            return configBuilder.Add(source);
        }
    }

那么来看一下怎么使用?

var builder = WebApplication.CreateBuilder(args);
builder.UseNiuBConfigure();

嗯,看起来不错了,那么问题来了,如果配置中心更新了配置,怎么刷新内存配置数据呢?

没错NiuBConfigProvider有个Load的方法。

我们先改造一下UseNiuBConfigure方法,把配置中心的请求服务地址信息传递进去

        public static IConfigurationBuilder UseNiuBConfigure(this WebApplicationBuilder builder, Action<NiuBOption> configure)
        {
            NiuBOption option= new NiuBOption();
            configure(option);
            NiuBConfigSource source = new NiuBConfigSource();
            IConfigurationBuilder configBuilder = builder.Configuration;
            return configBuilder.Add(source);
        }

NiuBOption的定义

    public class NiuBOption
    {
        public string ConfigSectionName { get; set; }
        public string Host { get; set; }
        public string Port { get; set; }
    }

定义个监听器

    public class Listener
    {
        NiuBConfigProvider provider;
        public Listener(NiuBConfigProvider provider)
        {
            this.provider = provider;
        }

        public void ConfigurationChanged(Dictionary<string, string> configuration)
        {
            provider.Load(configuration);
        }
    }

定义一个监听服务

public class NiuBService : INiuBService
    {
        // 启动远程监听,比如
        public NiuBService()
        {
            Start();
        }

        // 配置中心的代码没有实现,通过该方法进行测试
        private void grpcAccept(string host, string port, string configSectionName)
        {
            new ConfigureCenter().ConfigureChanged += configuration=> Configure(configuration);
        }
        // 该方法在UseNiuBConfigure方法中服务注入的时候会调用
        // 根据配置信息,启动远程监听,比如用GRPC的双工通信,socket通信
        public void Start()
        {
            Console.WriteLine("begin listen to xxx监听配置中心");
            // 如果有新的更新,那么调用Configure方法
            grpcAccept(this.Option?.Host, this.Option?.Port, this.Option?.ConfigSectionName);
       
        }

        public void Restart(Dictionary<string, string> options)
        {
            this.Option.Host = options["Host"];
            this.Option.Host = options["Port"];
            this.Start();
        }

        public NiuBOption Option { get; set; }

        public List<Listener> Listeners { get; set; } = new List<Listener>();

        public void Configure(Dictionary<string, string> configuration)
        {
            foreach (var listener in Listeners)
            {
                listener.ConfigurationChanged(configuration);
            }
        }
    }

现在UseNiuBConfigure方法的实现变成了这样

        public static IConfigurationBuilder UseNiuBConfigure(this WebApplicationBuilder builder, Action<NiuBOption> configure)
        {
            NiuBOption option= new NiuBOption();
            configure(option);
            var service= new NiuBService();
            NiuBConfigSource source = new NiuBConfigSource(service);
            service.Option= option;
            builder.Services.addNiuBConfig(service);
            IConfigurationBuilder configBuilder = builder.Configuration;
            return configBuilder.Add(source);
        }

NiuBConfigProvider的实现修改为

    public class NiuBConfigProvider : ConfigurationProvider
    {
        private INiuBService service { get; set; }
        public NiuBConfigProvider(INiuBService service) { 
            this.service = service;
            service.Listeners.Add(new Listener(this));
        }
        private Dictionary<string, string> innerCnfiguration = new Dictionary<string, string>();
        public override void Load()
        {
            foreach (string key in innerCnfiguration.Keys)
            {
                base.Data[key] = innerCnfiguration[key];
                if (key == "ConfigCenterOption") {//热重启配置监听服务
                    service.Restart(innerCnfiguration);
                }
            }
            base.Load();
        }

        internal void Load(Dictionary<string, string> configuration)
        {
            this.innerCnfiguration = configuration;
            this.Load();
        }
    }

NiuBConfigSource把Service传递进去

    public class NiuBConfigSource : NiuBOption, IConfigurationSource
    {
        private INiuBService service;
        public NiuBConfigSource(INiuBService service)
        {
            this.service = service;
        }
        public IConfigurationProvider Build(IConfigurationBuilder builder)
        {
            return new NiuBConfigProvider(service);
        }
    }

事情搞完了,下面来测试一下,由于注册中心没有实现,下面来模拟一下

       // 配置中心的代码没有实现,通过该方法模拟监听
        private void grpcAccept(string host, string port, string configSectionName)
        {
            ConfigureCenter.ConfigureChanged += configuration=> Configure(configuration);
        }

ConfigureCenter的实现

    public class ConfigureCenter
    {
        public ConfigureCenter() { }
        public event Action<Dictionary<string, string>> ConfigureChanged;

        public void PublishConfig(Dictionary<string, string> config)
        {
            if (this.ConfigureChanged != null)
            {
                ConfigureChanged(config);
            }
        }
    }

模拟配置中心发布了新的配置

var service= app.Services.GetService<INiuBService>();

service.ConfigureCenter.PublishConfig(new Dictionary<string, string>() {
    { "OrderService","{"Host":"http://niubi.com/api/order","descript":"订单服务地址"}"}
});

通过API查看是否能获取到配置中心发布的配置

    [Route("api/[Controller]")]
    public class OrderController : ControllerBase
    {
        public IConfiguration Configuration { get; set; }
 
        public OrderController(IConfiguration configuration )
        {
            this.Configuration = configuration;
            
        }
        [HttpGet]
        public string Get()
        {
            var value= Configuration["OrderService"];
            return value == null ?  "Empty": value;
        }
    }

请求结果

 



Tags:.Net   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
说明:下面的实例是通过阅读Nacos的SDK源码,提取出来的关键实现。Asp.Net core添加一个自定义配置,只要通过IConfigurationBuilder的Add方法,传递一个实现了IConfigurationSource...【详细内容】
2023-02-23  Tags: .Net  点击:(0)  评论:(0)  加入收藏
前言:来看看不同托管Main情况。概述一般的VS生成的默认Main如下:static void Main(string[] args) Console.Write("Tian xia feng yun chu wo bei"); Console.ReadLine;可以看...【详细内容】
2023-01-25  Tags: .Net  点击:(14)  评论:(0)  加入收藏
微软喜欢 Linux,但不会投资桌面应用程序 人们很容易将微软和开源 Linux 操作系统的历史看作是两个死敌谨慎和解的故事。 微软&mdash;&mdash;这家曾经将 Linux 称为癌症的公...【详细内容】
2022-12-26  Tags: .Net  点击:(213)  评论:(0)  加入收藏
升级vs或者装了.Net 7.0后, 工程框架用 net6 的 dotnet watch 出错 &#39;Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly &#39;S...【详细内容】
2022-11-16  Tags: .Net  点击:(156)  评论:(0)  加入收藏
编译 | 朱先忠、诺亚日前,微软推出了.NET 7的生产版本。据悉,.NET 7基础设施现在可用于Windows、macOS和Linux,这次版本的更新带来了性能增强、C#语言升级以及一系列基于容器...【详细内容】
2022-11-16  Tags: .Net  点击:(60)  评论:(0)  加入收藏
引言:按core传统方式添加 AddJsonFile("appsettings.json") 在windows平台和ssr工作正常,但是在 ios 和 android 无法用这种方式,因为资源生成方式不一样. 使用内置资源方式...【详细内容】
2022-11-14  Tags: .Net  点击:(79)  评论:(0)  加入收藏
ImageSharp 是一个流行的 .NET 项目,也是 .NET 生态中强大、跨平台的图像处理库。...【详细内容】
2022-10-24  Tags: .Net  点击:(85)  评论:(0)  加入收藏
跟物联网设备常用的通信协议有TCP,MQTT.今天我们介绍的是TCP连接,TCP连接程序的组件有Supersocket,dotnetty.Supersocket相信搞过.net的朋友应该都知道,dotnetty是有微软Azu...【详细内容】
2022-10-17  Tags: .Net  点击:(151)  评论:(0)  加入收藏
2022 年 9 月 14 日,Microsoft 发布了 .NET 7 Release Candidate 1,这是生产中支持的 .NET 7 的两个候选版本 (RC) 中的第一个。 .NET 7 的发布计划于 2022 年 11 月 8 日至 1...【详细内容】
2022-10-10  Tags: .Net  点击:(160)  评论:(0)  加入收藏
#asp.net core#先让我们看一下最小API的代码,通过以下几行代码就可以搭建一个简单的asp.net core web服务器,是不是十分简洁?var builder = WebApplication.CreateBuilder(a...【详细内容】
2022-10-04  Tags: .Net  点击:(126)  评论:(0)  加入收藏
▌简易百科推荐
说明:下面的实例是通过阅读Nacos的SDK源码,提取出来的关键实现。Asp.Net core添加一个自定义配置,只要通过IConfigurationBuilder的Add方法,传递一个实现了IConfigurationSource...【详细内容】
2023-02-23  不知名程序猿  今日头条  Tags:.Net   点击:(0)  评论:(0)  加入收藏
早在2017年,微软公布了其为平台提供的语言的.NET语言策略,即C#、F#和Visual Basic。然而,在当时,这些信息是以博客文章的形式提供的,这意味着它的可发现性不高,客户不知道这些指导...【详细内容】
2023-02-07  cnBeta  今日头条  Tags:.NET   点击:(25)  评论:(0)  加入收藏
前言:来看看不同托管Main情况。概述一般的VS生成的默认Main如下:static void Main(string[] args) Console.Write("Tian xia feng yun chu wo bei"); Console.ReadLine;可以看...【详细内容】
2023-01-25  江湖评谈  今日头条  Tags:.Net   点击:(14)  评论:(0)  加入收藏
微软喜欢 Linux,但不会投资桌面应用程序 人们很容易将微软和开源 Linux 操作系统的历史看作是两个死敌谨慎和解的故事。 微软&mdash;&mdash;这家曾经将 Linux 称为癌症的公...【详细内容】
2022-12-26  启辰8  今日头条  Tags:.NET   点击:(213)  评论:(0)  加入收藏
经常看到有群友调侃“为什么搞Java的总在学习JVM调优?那是因为Java烂!我们.NET就不需要搞这些!”真的是这样吗?今天我就用一个案例来分析一下。昨天,一位学生问了我一个问题:他建...【详细内容】
2022-11-30  程序员杨中科  今日头条  Tags:.NET   点击:(68)  评论:(0)  加入收藏
关于应用模块页面的生成应用模块页面函数如:public partial class userblog : BaseJsonMode{[ModeMethod("{CanNoLogin:true,CanEnable:true}")]static public ReturnJson i...【详细内容】
2022-11-19  散装码农  今日头条  Tags:.NET   点击:(101)  评论:(0)  加入收藏
升级vs或者装了.Net 7.0后, 工程框架用 net6 的 dotnet watch 出错 &#39;Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly &#39;S...【详细内容】
2022-11-16  AlexChow  今日头条  Tags:   点击:(156)  评论:(0)  加入收藏
编译 | 朱先忠、诺亚日前,微软推出了.NET 7的生产版本。据悉,.NET 7基础设施现在可用于Windows、macOS和Linux,这次版本的更新带来了性能增强、C#语言升级以及一系列基于容器...【详细内容】
2022-11-16    51CTO  Tags:.NET   点击:(60)  评论:(0)  加入收藏
引言:按core传统方式添加 AddJsonFile("appsettings.json") 在windows平台和ssr工作正常,但是在 ios 和 android 无法用这种方式,因为资源生成方式不一样. 使用内置资源方式...【详细内容】
2022-11-14  AlexChow  今日头条  Tags:.NET   点击:(79)  评论:(0)  加入收藏
ImageSharp 是一个流行的 .NET 项目,也是 .NET 生态中强大、跨平台的图像处理库。...【详细内容】
2022-10-24    开源中国  Tags:.NET   点击:(85)  评论:(0)  加入收藏
站内最新
站内热门
站内头条