您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > .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   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
作为 .NET 开发人员,我为什么开始使用 Python?
作者 | Alex Maher编译 | 小欧作为一名 .NET 开发人员,很长一段时间以来,我一直关注 C# 和 .NET 的出色工具和功能。但我最近开始使用 Python,感觉非常棒。这里申明一点,这篇文...【详细内容】
2023-12-25  Search: .Net  点击:(143)  评论:(0)  加入收藏
.NET Core 3.1 升级到 .NET 8,看看都有哪些变化
.NET Core 3.1 已经用了很长一段时间,其实在 2022 年的年底微软已经不提供支持了,后面的一个 LTS 版本 .NET 6 也会在 2024 年 11 月终止支持,所以直接升级到 .NET 8 是最好的...【详细内容】
2023-12-08  Search: .Net  点击:(192)  评论:(0)  加入收藏
.NET Core的中间件来对Web API进行流量限制实现方法
在.NET Core中,我们可以使用ASP.NET Core的中间件来对Web API进行流量限制。ASP.NET Core提供了一个名为RateLimit的开源库,可以方便地实现流量限制功能。下面将详细介绍如何...【详细内容】
2023-12-06  Search: .Net  点击:(177)  评论:(0)  加入收藏
深入 .NET 异步编程:Task 与 ValueTask 的区别与选择
在 .NET 中,Task 和 ValueTask 都是用于表示异步操作的类型,但它们有一些重要的区别。TaskTask 是最常见的表示异步操作的类型。它通常用于表示耗时的、异步的操作,比如从文件...【详细内容】
2023-11-26  Search: .Net  点击:(190)  评论:(0)  加入收藏
.NET 8.0中有哪些新的变化?
作者:葡萄城技术团队链接:https://my.oschina.net/powertoolsteam/blog/10143465.NET 8已正式GA1 性能提升.NET 8 在整个堆栈中带来了数千项性能改进 。默认情况下会启用一种...【详细内容】
2023-11-20  Search: .Net  点击:(223)  评论:(0)  加入收藏
.NET Core下有热门的ORM框架使用方法
.NET Core下有很多热门的ORM框架,以下是其中六个常用的框架,包括EF Core、Dapper、NHibernate、Fluent NHibernate、LLBLGen Pro和PetaPoco。接下来,我将为您详细介绍每个框架...【详细内容】
2023-11-16  Search: .Net  点击:(161)  评论:(0)  加入收藏
.NET Core中一些优秀的项目和框架
.NET Core是一个跨平台的开源框架,它可以用来构建Web应用程序、微服务、桌面应用程序和游戏等。它具有高性能、可扩展性和安全性等优点,因此越来越多的企业和开发者选择使用.N...【详细内容】
2023-11-13  Search: .Net  点击:(212)  评论:(0)  加入收藏
.net core下优秀的日志框架使用解析,附源代码
在 .NET Core 中,日志是一个非常重要的组件,它可以帮助我们记录应用程序的运行情况,以便在出现问题时进行排查。在本文中,我们将介绍五个优秀的 .NET Core 日志框架,它们分别是...【详细内容】
2023-10-18  Search: .Net  点击:(286)  评论:(0)  加入收藏
2 个 .NET 操作的 Redis 客户端类库
Redis ,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redi...【详细内容】
2023-10-11  Search: .Net  点击:(245)  评论:(0)  加入收藏
记一次 .NET 某拍摄监控软件的卡死分析
一:背景1. 讲故事今天本来想写一篇 非托管泄露 的生产事故分析,但想着昨天就上了一篇非托管文章,连着写也没什么意思,换个口味吧,刚好前些天有位朋友也找到我,说他们的拍摄监控软...【详细内容】
2023-09-27  Search: .Net  点击:(234)  评论:(0)  加入收藏
▌简易百科推荐
.Net开发中十种常见的内存错误以及相应的解决方案
在.Net开发中,为内存管理方面提供了许多便利,但仍然存在一些常见的错误和陷阱。这些错误可能导致内存泄漏、性能下降、异常抛出等问题,严重影响应用程序的稳定性和性能。在软件...【详细内容】
2024-03-26  小乖兽技术  今日头条  Tags:.Net   点击:(12)  评论:(0)  加入收藏
.NET配置文件大揭秘:轻松读取JSON、XML、INI和环境变量
概述:.NET中的IConfiguration接口提供了一种多源读取配置信息的灵活机制,包括JSON、XML、INI文件和环境变量。通过示例,清晰演示了从这些不同源中读取配置的方法,使配置获取变得...【详细内容】
2023-12-28  架构师老卢  今日头条  Tags:.NET   点击:(92)  评论:(0)  加入收藏
.Net开发都应当掌握的泛型基础知识集合
在C#编程语言中,泛型是一项非常强大和重要的功能。它允许我们编写更加灵活和通用的代码,同时提高代码的可重用性和性能。本文将介绍C#泛型的一些关键知识点,帮助读者理解和应用...【详细内容】
2023-12-25  小乖兽技术  今日头条  Tags:.Net   点击:(124)  评论:(0)  加入收藏
作为 .NET 开发人员,我为什么开始使用 Python?
作者 | Alex Maher编译 | 小欧作为一名 .NET 开发人员,很长一段时间以来,我一直关注 C# 和 .NET 的出色工具和功能。但我最近开始使用 Python,感觉非常棒。这里申明一点,这篇文...【详细内容】
2023-12-25    51CTO  Tags:.NET   点击:(143)  评论:(0)  加入收藏
.NET Core 3.1 升级到 .NET 8,看看都有哪些变化
.NET Core 3.1 已经用了很长一段时间,其实在 2022 年的年底微软已经不提供支持了,后面的一个 LTS 版本 .NET 6 也会在 2024 年 11 月终止支持,所以直接升级到 .NET 8 是最好的...【详细内容】
2023-12-08  不止dotNET  微信公众号  Tags:.NET   点击:(192)  评论:(0)  加入收藏
.NET Core的中间件来对Web API进行流量限制实现方法
在.NET Core中,我们可以使用ASP.NET Core的中间件来对Web API进行流量限制。ASP.NET Core提供了一个名为RateLimit的开源库,可以方便地实现流量限制功能。下面将详细介绍如何...【详细内容】
2023-12-06  架构师老卢  今日头条  Tags:.NET   点击:(177)  评论:(0)  加入收藏
微软官方出品微服务架构:十个.Net开源项目
1、一个高性能类型安全的.NET枚举实用开源库Enums.NET是一个.NET枚举实用程序库,专注于为枚举提供丰富的操作方法。它支持.NET Framework和.Net Core。它主要优点表现在类型...【详细内容】
2023-12-06  编程乐趣  今日头条  Tags:.Net   点击:(132)  评论:(0)  加入收藏
.NET开源的处理分布式事务的解决方案
前言在分布式系统中,由于各个系统服务之间的独立性和网络通信的不确定性,要确保跨系统的事务操作的最终一致性是一项重大的挑战。今天给大家推荐一个.NET开源的处理分布式事务...【详细内容】
2023-11-30  追逐时光者  微信公众号  Tags:.NET   点击:(173)  评论:(0)  加入收藏
深入 .NET 异步编程:Task 与 ValueTask 的区别与选择
在 .NET 中,Task 和 ValueTask 都是用于表示异步操作的类型,但它们有一些重要的区别。TaskTask 是最常见的表示异步操作的类型。它通常用于表示耗时的、异步的操作,比如从文件...【详细内容】
2023-11-26  架构师老卢  微信公众号  Tags: .NET   点击:(190)  评论:(0)  加入收藏
.NET字符串存储:解析常量与动态字符串,深入了解内存机制
在 .NET 中,字符串是不可变的,这意味着一旦创建,字符串的内容就不能被修改。字符串在内存中以不同的方式存储,具体取决于它是常量字符串还是动态创建的字符串。常量字符串常量字...【详细内容】
2023-11-25  架构师老卢  微信公众号  Tags:.NET   点击:(195)  评论:(0)  加入收藏
站内最新
站内热门
站内头条