重新整理 .net core 实践篇—————配置系统之简单配置中心[十一]
前言
市面上已经有很多配置中心集成工具了,故此不会去实践某个框架。
下面链接是apollo 官网的教程,实在太详细了,本文介绍一下扩展数据源,和简单翻翻阅一下apollo 关键部分。
apollo 服务配置:
https://github.com/ctripcorp/apollo/wiki/.Net客户端使用指南
apollo .net 客户端配置:
https://github.com/ctripcorp/apollo.net/tree/dotnet-core/Apollo.Configuration
正文
扩展数据源
经过前面的系列的源码解读,我们知道我们需要去实现IConfigurationSource,IConfigurationProvider。
他们的关系是IConfigurationSource build 方法会构建出IConfigurationProvider,IConfigurationProvider 会为 IConfigurationRoot 提供数据源。
好的,那么开始吧。
RemoteConfigurationSource 实现 IConfigurationSource:
public class RemoteConfigurationSource : IConfigurationSource
{
public RemoteConfigurationProvider _provider;
public RemoteConfigurationProvider Provider
{
get
{
if (_provider == null)
{
_provider = new RemoteConfigurationProvider();
}
return _provider;
}
}
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return this.Provider;
}
}
IConfigurationProvider 继承ConfigurationProvider:
public class RemoteConfigurationProvider : ConfigurationProvider
{
public RemoteConfigurationProvider():base()
{
}
public override void Load()
{
this.Data["name"] = "zhangshan";
Load(false);
}
public void Load(bool reload)
{
if (reload)
{
this.OnReload();
}
}
}
这里没有继承IConfigurationProvider而是继承ConfigurationProvider的原因,是因为ConfigurationProvider实现基于字典的数据源实现,这里演示比较方便。
static void Main(string[] args)
{
IConfigurationBuilder builder = new ConfigurationBuilder();
var selfSource = new RemoteConfigurationSource();
builder.Add(selfSource);
var root = builder.Build();
Console.WriteLine($"name: {root["name"]}");
ChangeToken.OnChange(() => root.GetReloadToken(), () =>
{
Console.WriteLine($"reload name: {root["name"]}");
});
selfSource.Provider.Set("name","lisi");
selfSource.Provider.Load(true);
Console.ReadKey();
}

这里只是作为演示,实际上我们可以通过在RemoteConfigurationProvider 做监听,然后收到通知后,进行reload 调用即可,在configurationProvider中的reload如下:
private ConfigurationReloadToken _reloadToken = new ConfigurationReloadToken();
protected void OnReload()
{
ConfigurationReloadToken previousToken = Interlocked.Exchange(ref _reloadToken, new ConfigurationReloadToken());
previousToken.OnReload();
}
触发令牌更新,然后令牌会触发回调。
那么来看下apollo 第三方组件怎么写的吧。
引入这个包: Com.Ctrip.Framework.apollo.Configuration
public class ApolloConfigurationProvider : ConfigurationProvider, IRepositoryChangeListener, IConfigurationSource
{
internal string? SectionKey { get; }
internal IConfigRepository ConfigRepository { get; }
private Task? _initializeTask;
public ApolloConfigurationProvider(string? sectionKey, IConfigRepository configRepository)
{
SectionKey = sectionKey;
ConfigRepository = configRepository;
ConfigRepository.AddChangeListener(this);
_initializeTask = ConfigRepository.Initialize();
}
public override void Load()
{
Interlocked.Exchange(ref _initializeTask, null)?.ConfigureAwait(false).GetAwaiter().GetResult();
SetData(ConfigRepository.GetConfig());
}
protected virtual void SetData(Properties properties)
{
var data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
foreach (var key in properties.GetPropertyNames())
{
if (string.IsNullOrEmpty(SectionKey))
data[key] = properties.GetProperty(key) ?? string.Empty;
else
data[$"{SectionKey}{ConfigurationPath.KeyDelimiter}{key}"] = properties.GetProperty(key) ?? string.Empty;
}
Data = data;
}
void IRepositoryChangeListener.OnRepositoryChange(string namespaceName, Properties newProperties)
{
SetData(newProperties);
OnReload();
}
IConfigurationProvider IConfigurationSource.Build(IConfigurationBuilder builder) => this;
}
里面有这个OnRepositoryChange 监听,如果收到监听信息然后就触发设置数据,然后调用OnReload 触发令牌过期,也就是触发通知。
有些人肯定问啊,肯定要有IconfigurationSource啊,在哪呢? 看这个设计ApolloConfigurationProvider 继承了IConfigurationSource接口。
ApolloConfigurationProvider实现的build(上面贴了)如下:
IConfigurationProvider IConfigurationSource.Build(IConfigurationBuilder builder) => this;
直接返回本身即可。看到这里我们有时候也就不用太古板了,不是说非要分开两个类来实现。完全可以作为一个整体,也是极好的。
结
上述只是个人整理,如有错误,望请指点。
配置大概就整理到这里,后面写服务相关的,当然也会使用到前面这些微薄的原理(没有深入分析),就知道为什么服务配置要那么写了。
下一节 服务与配置之间。
重新整理 .net core 实践篇—————配置系统之简单配置中心[十一]的更多相关文章
- 重新整理 .net core 实践篇—————日志系统之战地记者[十五]
前言 本节开始整理日志相关的东西.先整理一下日志的基本原理. 正文 首先介绍一下包: Microsoft.Extengsion.Logging.Abstrations 这个是接口包. Microsof ...
- 重新整理 .net core 实践篇—————日志系统之作用域[十七]
前言 前面介绍了服务与日志之间的配置,那么我们服务会遇到下面的场景会被遇到一些打log的问题. 前面我提及到我们的log,其实是在一个队列里面,而我们的请求是在并发的,多个用户同时发送请求这个时候我们 ...
- 重新整理 .net core 实践篇—————日志系统之结构化[十八]
前言 什么是结构化呢? 结构化,就是将原本没有规律的东西进行有规律话. 就比如我们学习数据结构,需要学习排序然后又要学习查询,说白了这就是一套,没有排序,谈如何查询是没有意义的,因为查询算法就是根据某 ...
- 重新整理 .net core 实践篇—————日志系统之服务与日志之间[十六]
前言 前文介绍了一些基本思路,那么这里介绍一下,服务如何与配置文件配合. 正文 服务: public interface ISelfService { void ShowLog(); } public ...
- 重新整理 .net core 实践篇—————配置系统之强类型配置[十]
前言 前文中我们去获取value值的时候,都是通过configurationRoot 来获取的,如configurationRoot["key"],这种形式. 这种形式有一个不好的 ...
- 重新整理 .net core 实践篇————配置应用[一]
前言 本来想整理到<<重新整理.net core 计1400篇>>里面去,但是后来一想,整理 .net core 实践篇 是偏于实践,故而分开. 因为是重新整理,那么就从配置开 ...
- 重新整理 .net core 实践篇—————配置文件之环境配置[九]
前言 在当今在互联网微服务比较适用的情况下,docker 可以说一个利器.每次我们打包docker的时候都是适用docker 的配置文件,那么配置文件里面会设置环境变量,这个时候需要我们的应用能够识别 ...
- 重新整理 .net core 实践篇————配置系统之盟约[五]
前言 在asp .net core 中我们会看到一个appsettings.json 文件,它就是我们在服务中的各种配置,是至关重要的一部门. 不管是官方自带的服务,还是我们自己编写的服务都是用它来实 ...
- 重新整理 .net core 实践篇—————配置系统之军令状[七](配置文件)
前言 介绍一下配置系统中的配置文件,很多服务的配置都写在配置文件中,也是配置系统的大头. 正文 在asp .net core 提供了下面几种配置文件格式的读取方式. Microsoft.extensi ...
随机推荐
- Day05_25_Super关键字
Super关键字 Super关键字的所用 Super关键字的用法有三种: 在子类的成员方法中,访问父类的成员变量. 在子类的成员方法中,访问父类的成员方法. 在子类的构造方法中,访问父类的构造方法. ...
- OAuth 2.0、OIDC 原理
OAuth 目录 OAuth 什么是 OAuth? 为什么是 OAuth? SAML OAuth 和 API OAuth 主要组件 OAuth 作用域 OAuth 参与者 OAuth 令牌 OAuth ...
- php读取目录下的所有文件
php读取目录下的所有文件 $path = './use'; $result = scanFile($path); function scanFile($path) { global $result; ...
- hdu4965 巧用矩阵乘法结合律
题意: 给两个矩阵,n*m的矩阵A,和m*n的矩阵B, 求(A*B)^(n*n)其中 m<=6,n<=1000. 思路: 一开始直接模拟,写了个矩阵快速幂,超时了,因 ...
- Python 爬虫 BeautifulSoup4 库的使用
BeautifulSoup4库 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据.lxml 只会局部遍历,而Be ...
- 【JavaScript】Leetcode每日一题-平方数之和
[JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...
- php 获取某年后的日期
比如两年后:date('Y-m-d',strtotime('+2 year')) 月份year改成month
- 阿里云短信服务 PHP
1.开通短信服务后,进入控制器->短信服务 2.点击国内消息,配置签名,模板(这里不作详细介绍) 3.点击进入左侧帮助文档里面,找到PHP sdk,Composer命令直接安装 4.获取acce ...
- 【opencv】Java实现的opencv3.x版本后Highhui报错
随笔为博主原创,如需转载,请注明出处. opencv3.x以后Highgui不再使用,用Imgcodecs代替,引入import org.opencv.imgcodecs.Imgcodecs;即可. ...
- windows下使用dos命令手工与ntp服务器同步系统时间
管理员模式的命令窗口 net stop w32time &w32tm /unregister &w32tm /register &net start w32time & ...