宝哥软件园

NET Core 3.0基于Consul创建配置扩展组件

编辑:宝哥软件园 来源:互联网 时间:2021-08-23

前三篇文章讲完之后。NET核心配置,本文主要讨论如何扩展一个配置组件。

理解了Configuration的源代码之后,扩展一个组件会更容易。接下来,我们将基于创建一个配置组件。NET Core 3.0-预览5。

相信大家对执政官都有了更深入的了解,很多项目都会使用执政官作为配置中心。这里没有其他的解释,主要是说说创建Consul配置扩展的一些想法。在使用Consul配置函数时,我们可以将信息转换为JSON格式,然后存储,所以当我们读取它时,就像从JSON文件中读取一样。

开发前的准备初始化咨询

假设您已经安装并启动了Consul,我们打开Key/Value函数界面,创建两组配置选项,即commonservice和userservice,如下图所示

配置值采用JSON格式

实现理念

我们知道在Configuration的整个设计框架中,更重要的类ConfigurationRoot内部有一个iconfigulationprovider集合属性,这意味着我们添加的iconfigulationprovider实例最终会放入集合中,如下图所示

在这个项目中,我使用了一个封装的consult(v 0 . 7 . 2 . 6)类库,并且基于的设计风格。NET核心关于配置,我做了以下框架设计

考虑到我将在组件内部创建ConsulClient的实例,ConsulClient构造函数的一些参数被抽象地提取出来,并添加到IConsulConfigurationSource中,以增强组件的灵活性。

正如我之前所说,Consul中的配置信息是以JSON格式存储的,所以微软。这里使用了extensions . configuration . json . jsonconfigurationfile parser将JSON格式的信息转换成配置的通用格式Key/Value。

核心代码图标配置来源

///summary////consultonfigurationsource////summary public interface IConsulConfigurationSource : iconfightonfigutionsource {///summary////cancelationtoken///summary cancelationtoken { get;}///summary///consult构造函数实例,可以在////summary actionconsulclientconfiguration consulclientconfiguration { get;设置;}///summary///consult构造函数实例,可以传入////summary action http client consult http client { get;设置;}///summary///consult构造函数实例,可以在////summaryacityhttpclienthandler consulhttpclienthandler { get;设置;}///summary///service name////summary string服务密钥{ get}///summary///Optional///summary bool Optional { get;设置;}///汇总////查阅查询选项////汇总查询选项查询选项{ get设置;}///summary////重载延迟时间,以毫秒为单位////summary int ReLoadDelay { get;设置;}///summary////配置更改时是否重新加载////summary bool reload on change { get;设置;} }

ConsulConfigurationSource

此类提供了一个用于接收ServiceKey和CancellationToken实例的构造函数

public consultonfigurationsource(字符串serviceKey,cancelationtoken cancelationtoken){ if(字符串。isnullorhitespace(service key)){抛出新的ArgumentNullException(name of(service key));}这个。ServiceKey=serviceKey这个。cancelationtoken=cancelationtoken;}

它的build()方法也相对简单,主要是初始化ConsulConfigurationParser实例

public iconfigulationprovider Build(iconfigulationbuilder builder){ ConsulConfigurationParser consulParser=new ConsulConfigurationParser(this);返回新的ConsulConfigurationProvider(这个,consulParser);}

ConsulConfigurationParser

这个类比较复杂,主要实现Consul配置的获取、监控和容错处理。公共方法的源代码如下

///摘要///获取并转换领事配置信息////summary////param name=' reloading '/param///param name=' source '/param///returns/returns public async TaskIDictionarystring,string GetConfig(bool reloading,IConsulConfigurationSource source){ try { QueryResultKVPair=this wait .GetKvPairs(来源ServiceKey,来源。查询选项,来源取消令牌).配置等待(假);如果((kvPair?响应==null)!来源。可选){ if(!重载){抛出新的格式异常(参考资料错误_无效服务(来源服务密钥));}返回new Dictionarystring,string();} if (kvPair?响应==空){引发新的格式异常(参考资料错误_值不存在(来源服务密钥));}这个updateLastIndex(kvPair);返回JsonConfigurationFileParser .解析(来源ServiceKey,新内存流(kvPair .响应。值));} catch(异常异常){抛出异常} } ///摘要////领事配置信息监控////summary////param name=' key '/param///param name=' cancelatitoken '/param///returns/returns public IChangeToken Watch(字符串键,cancelationtoken cancelationtoken){任务.跑(()=这个.RefreshForChanges(键、canceliontoken)、canceliontoken );返回this.reloadToken}

另外,关于领事的监控主要利用了查询结果.识点的上位属性,该类缓存了该属性的值,并与实获取的值进行比较,以判断是否需要重新加载内存中的缓存配置

ConsulConfigurationProvider

该类除了实现负荷方法外,还会根据重新加载更改属性,在构造函数中注册待清扫房事件,用于重新加载配置信息,源码如下:

公共密封类ConsulConfigurationProvider :配置提供程序{ private readonly ConsulConfigurationParser配置解析器;私有只读图标配置来源源;public consult configurationprovider(IConsulConfigurationSource,consult configurationParser configurationParser){ this。配置解析器=配置解析器;this.source=sourceif(来源ReloadOnChange) { ChangeToken .OnChange(()=this。配置解析器。看这个。来源。服务钥匙,这个。来源。cancelationtoken),async()={请稍候。配置解析器。getconfig(真,来源).配置等待(假);线程。睡眠(来源。重新加载延迟);这个onleroad();});} }公共覆盖void Load(){ 0尝试{这个.数据=这个。configurationparsergetconfig(false,this.source).配置等待(假)。GetAwaiter().GetResult();} catch(AggregateException AggregateException){ throw AggregateException .InnerException} } }调用及运行结果

此处调用在程序中实现

public class Program { public static void Main(string[]args){ cancelatitoken source=new cancelatitoken source();网络主持人.CreateDefaultBuilder(参数).ConfigureAppConfiguration((宿主上下文,生成器)={ builder .addconservice('用户服务',cancellationTokenSource).令牌,来源={来源.ConsulClientConfiguration=CCO=CCO .address=new Uri(' http://localhost :8500 ');来源。可选=真;来源ReloadOnChange=真来源重新加载延迟=300来源查询选项=新查询选项{ WaitIndex=0 };});建筑商addconservice(公共服务),cancellationTokenSource .令牌,来源={来源.ConsulClientConfiguration=CCO=CCO .address=new Uri(' http://localhost :8500 ');来源。可选=真;来源ReloadOnChange=真来源重新加载延迟=300来源查询选项=新查询选项{ WaitIndex=0 };});}).UseStartupStartup().构建()。run();} }以上就是本次介绍的全部知识点内容,感谢大家对我们的支持。

更多资讯
游戏推荐
更多+