范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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;         }     }
  请求结果

启程2023修复还是复苏?家电行业在K线上寻找明天世人皆赞春花好,春光也曾绿叶妆。2022年5月份,一位刚刚被裁的老员工,在美的内部网络社区上留下一段文字,纪念自己的美的岁月。看过留言,美的集团(000333。SZ)总裁方洪波有些三大运营商省级系统集成公司龙虎榜本文统计范围包括联通系的产业互联网公司移动系的信息系统集成公司电信系的公众信息中电鸿信中电万维等共计20家,不包括电信的天翼云移动系的中移铁通和中移建设,这两家公司将单独成篇。三大2023年以来个人养老金基金全部实现正收益最高涨幅近6央广网北京1月24日消息(记者冯方)个人养老金制度启动实施以来已有两月,随着权益市场在元旦假期后持续上攻,个人养老金基金也实现开门红,2023年以来个人养老金基金全部实现正收益。根受裁员影响,微软将于3月10日关闭VR社交平台AltspaceVRIT之家1月24日消息,微软于1月19日宣布,2023财年第三财季将裁员1万人,消息指出微软解雇了AltSpaceVR和MixedRealityToolKit(MRTK)整个开发团推荐6道凉菜除夕吃,有荤有素下酒又下饭小年已过,大年将至,今年的1月21日就是我们传统的除夕了,在除夕的家宴上,不但要有硬菜热菜,还要有凉菜。凉菜的种类很多,有素也有荤,今天,精选6道凉菜和大家分享,总有一两是你喜欢的大寒寒雪消处春意升云南丽江古城黑龙潭公园,梅花绽放。新华社发云南腾冲市马站乡响水沟山谷里,叶片上凝结了晶莹的冰。新华社发在重庆市南川区北坡景区拍摄的雪鸭。新华社发河南省焦作市温县,月季花果实与白雪相假如我可以双手插兜,我会对春晚掏心窝说上几句话想必大家都会认为春晚越来越没意思了。春晚身为年终盛宴,担负服务普罗大众精神生活的责任。春晚汇聚了各种资源,一手天听的好牌,负服务普罗大众精神生活的责任。春晚傲气,当然也有睥睨天下的吉尔吉斯斯坦连体婴儿成功分离据乌兹别克斯坦卫生部19日消息,该国医生首次独立完成连体婴儿分离手术。该手术是在国家妇产中心新生儿外科培训和治疗中心进行,该中心在为新生儿(包括来自邻国的新生儿)进行复杂手术方面拥过年,如果有人这样逗你的孩子,别忍着,直截了当地怼回去自从有了孩子之后,倩倩就特别害怕过年。她并不是不喜欢过年的氛围,而是不喜欢过年喜欢逗孩子却没有分寸的亲戚们。去年过年发生的一件事,到现在都令倩倩心有余悸,以至于今年越临近过年,倩倩被曝最脏水果第一名?冬天娃超爱吃,很多妈妈却不敢买之前网上有个新闻我们平时经常吃的草莓菠菜桃子甜椒等居然都因为农残被列为最脏蔬果之一。原来每年,网络上都会盛传一张美国环境工作组(EWG)评选出的脏十二清单,而草莓年年位居榜首。EW不一样的卡梅拉米小圈大卫不可以居然儿童不宜?不一样的卡梅拉米小圈大卫不可以居然少儿不宜?我们的孩子到底能看什么?说起卡梅拉米小圈和大卫不可以,那是曾是儿童读物中的顶流,一时间变成了不适宜儿童阅读的读物了。原因在哪儿?卡梅拉中
中国最牛夫妻北极求婚,南极结婚,旅行10年身价过亿01hr梁红与张昕宇相识,是在4岁那年。青梅竹马,两小无猜。孩提时代,二人最大的愿望,是能一辈子在一块写作业。怎样才能实现呢?听大人说,结了婚就能一辈子一块儿写作业。梁红那我们在哪第20届四川光雾山国际红叶节11月1日开幕据四川省文旅厅消息,第20届四川光雾山国际红叶节,将于11月1日在巴中市文旅新区光雾山旅游区铁炉坝广场开幕。光雾山秋日美景。四川省文旅厅供图本届红叶节主题为安逸走四川相约光雾山,活细数北京红叶最佳观赏地秋日生活打卡季老舍在北平的秋里写道中秋前后是北平最美丽的时候。天气正好不冷不热,昼夜的长短也划分得平匀。没有冬季从蒙古吹来的黄风,也没有伏天里挟着冰雹的暴雨。天是那么高,那么蓝,那人在屋檐下刘田忠人在屋檐下不得不低头。县官不如现管。周勃周亚夫父子功大至丞相,尊贵无比,岂料一日沦为阶下囚,受尽凌辱,下场十分相似。周勃担心文帝猜忌,晚年回封地安享晚年。怕啥来啥,有人告发周一场被称为二战前奏的战争西班牙内战1936年7月爆发的西班牙内战,一般被认为是第二次世界大战的前奏,法西斯和共产主义势力在伊比利亚半岛上打起了代理人战争人民阵线得到了苏联与墨西哥的援助,而佛朗哥的国民军则有纳粹德国高山流水遇知音,俞伯牙与钟子期的故事,我讲给你听俞伯牙与钟子期的故事你知道嘛?钟子期去世后俞伯牙又为何摔琴?今天给大家讲讲他们的故事。浪说曾分鲍叔金,谁人辨得伯牙琴!干今交道好如鬼,湖海空悬一片心。自古以来若论朋友交情之深厚,史山西省是如何划分晋北晋中晋南的?我在头条搞创作第二期陕西省由三个差异较为明显的地区组成,就是位于黄土高原的陕北,中间平原地带的关中,秦岭以南地理气候与四川相似的陕南。黄河对岸的山西省也称为三晋大地,但这个三一般是理查德米勒(RichardMille)有色彩有特殊材质RM1102勒芒经典理查德米勒(RichardMille)一直以来的作风赛车风格富有创造力的设计大胆引用创新材料昂贵的定价。自2002年起,顶级腕表品牌理查德米勒成为世界三大汽车赛事之一勒芒的合作伙伴海南胡椒调出市场好滋味满足多元化消费需求来源经济日报图为黑白红胡椒果。(资料图片)上图胡椒槟榔间作生态高效种植模式。(资料图片)右图海南农垦热作产业集团有限公司东昌现代化农业科技示范基地内的胡椒园。经济日报记者王伟摄胡椒科德教育2022年前三季度净利润5303。96万元同比下降22。15中证智能财讯科德教育(300192)10月27日披露2022年第三季度报告。2022年前三季度,公司实现营业总收入5。89亿元,同比下降9。01归母净利润5303。96万元,同比下欧冠4负本菲卡小组出局夸德拉多送点基恩米利克进球难救主北京时间10月26日凌晨3点,202223赛季欧冠联赛小组赛H组第五轮,意甲豪门尤文图斯前往客场对阵葡超劲旅本菲卡,这是事关尤文出线命运的一场关键战。上半场,安东尼奥席尔瓦率先破门