Asp。NetCore自定义配置中心客户端
说明:下面的实例是通过阅读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 innerCnfiguration = new Dictionary(); public override void Load() { foreach (string key in innerCnfiguration.Keys) { base.Data[key] = innerCnfiguration[key]; } base.Load(); } internal void Load(Dictionary 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 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 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 options) { this.Option.Host = options["Host"]; this.Option.Host = options["Port"]; this.Start(); } public NiuBOption Option { get; set; } public List Listeners { get; set; } = new List(); public void Configure(Dictionary configuration) { foreach (var listener in Listeners) { listener.ConfigurationChanged(configuration); } } }
现在UseNiuBConfigure方法的实现变成了这样 public static IConfigurationBuilder UseNiuBConfigure(this WebApplicationBuilder builder, Action 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 innerCnfiguration = new Dictionary(); 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 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> ConfigureChanged; public void PublishConfig(Dictionary config) { if (this.ConfigureChanged != null) { ConfigureChanged(config); } } }
模拟配置中心发布了新的配置var service= app.Services.GetService(); service.ConfigureCenter.PublishConfig(new Dictionary() { { "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; } }
请求结果
新西兰奥克兰暴雨成灾保险企业面临大量理赔新华社北京1月30日电始于27日的持续强降雨在新西兰最大城市奥克兰引发大规模洪水,全市进入紧急状态。新西兰几家主要保险公司已收到总共约1万份理赔申请。这些公司的股价30日出现不同程
青海绿色税制引导企业减排降税应税污染物排放总体下降图为格尔木市税务局干部深入企业调研辅导环保税政策。张云龙摄中新网西宁1月30日电(李隽韩世峰刘璐)30日,记者从国家税务总局青海省税务局获悉,环境保护税开征五年来,该省坚持生态保护
湖南男孩出生三度小耳畸形,竟和妈妈的这份工作有关!李女士一家是从湖南过来的,孩子今年一岁半,三度小耳畸形。刘医生,我和我丈夫的直系亲属里都没有小耳畸形,怎么到了我孩子这就是这种情况啊?这个问题困惑了李女士很久。我向她解释,小耳畸形
对于女孩的性教育,宜早不宜迟关于性心理教育生活中,家庭性教育最好的方式就是和孩子拉家常。在日常生活中,父母可以通过性方面的事情来打开话匣子。不要指望一本教科书就能解决问题,那样的话就不会有理想的效果。关于性伦
降温乱添衣就是添乱!到底怎么判断宝宝冷不冷?视频加载中最近温度较冷,很多妈妈这时都有了个疑问,天气冷的时候怎么判断宝宝衣服穿的够不够?冷不冷呢?可以将手伸入宝宝的后衣领,摸后脖颈!是的,不是我们通常认为的摸手脚,因为宝宝的末
儿童睡前故事狼和七只小羊从前,在山脚下有一座小木屋,里面住着羊妈妈和七只小羊。有一天,羊妈妈要出门,她对小羊们说如果大灰狼来了,不要给他开门。你们要记住,大灰狼的声音是粗粗的,爪子是黑黑的。羊
圆梦儿女双全的机会来了!备战二胎三胎这样科学备孕成功率大增生男孩是众多中国家庭的梦想,究其原因,一是夫妻俩单纯喜欢男孩,二是第一胎或第二胎都生了女儿,希望凑成好字儿女双全,三是家里有强烈愿望想要生男孩的。近年来,越来越多人为了生男孩会选择
四时交替,巧除积水肾俞穴数,五十七穴,积阴所聚,水之出入,尻上五行,行五肾俞。水病性征,下为浮肿,大腹翩翩,上为喘呼,不得安卧,标本俱病。肺为喘呼,肾为水肿,肺为气逆,不得静卧,肺肾俱病,水气潴留。
人如其食,饮食决定健康,生物化学博士告诉你吃什么,怎么吃今天推荐一本书名称叫饮食术,风靡日本的科学饮食教科书,作者牧田善二,是日本有名的糖尿病专科医生,生物化学博士。该书揭开了人类肥胖衰老和疾病的秘密,告诉我们吃什么,如何吃。书中许多论
长期吃太饱,身体会发生什么变化?新年期间,心情好美食多没烦恼,大家就都忍不住每天多吃了亿点点,假期结束,恢复正常饮食生活也不能多吃哦!长期吃太饱引发5大风险长期过饱的危害很多,除了容易造成肥胖,还可能导致胃肠道疾
减盐,减糖,减油,好处超乎想象新年到,福寿到,财运到!这段时间,想必小伙伴都大吃大喝地满嘴流油了吧哈哈哈年饱年膘,这也是我们中国人迎接新年的重要方式跟必不可少的仪式感哦!然而,如果想要收获健康,营养饮食占第一位