前三篇文章讲完之后。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();} }以上就是本次介绍的全部知识点内容,感谢大家对我们的支持。