重新整理 .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 ...
随机推荐
- 痞子衡嵌入式:利用i.MXRT1xxx系列内部DCP引擎计算Hash值时需特别处理L1 D-Cache
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是利用i.MXRT1xxx系列内部DCP引擎计算Hash值时需特别处理L1 D-Cache. 关于i.MXRT1xxx系列内部通用数据协处 ...
- 网关Ocelot功能演示完结,久等了~~~
前言 关于网关(Ocelot)的分享,还遗留一些功能没演示呢,接着来聊聊:这次重点针对网关Ocelot使用缓存.集成Polly做服务治理.集成IdentityServer4做认证授权来详细说说:如果对 ...
- 963. Minimum Area Rectangle II
Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from these ...
- 使用BurpSuite抓取HTTPS网站的数据包
昨天面试,技术官问到了我如何使用BurpSuite抓取https网站的数据包,一时间没能回答上来(尴尬!).因为以前https网站的数据包我都是用Fiddler抓取的,Fiddlert自动帮我们配置好 ...
- LeetCode---84. 柱状图中最大的矩形(hard)
题目:84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 示例: 输入: [2,1,5 ...
- java线程池实践
线程池大家都很熟悉,无论是平时的业务开发还是框架中间件都会用到,大部分都是基于JDK线程池ThreadPoolExecutor做的封装, 都会牵涉到这几个核心参数的设置:核心线程数,等待(任务)队列, ...
- [花式栈溢出]栈上的 partial overwrite
[花式栈溢出]栈上的 partial overwrite 希望能在这几天对Pwn中的栈上的各种利用和其他一些较小的分支做一个收尾,以便全力投入学习堆的相关知识.初步计划是对照ctf-wiki查缺补漏. ...
- Day009 面向对象和方法回顾
面向过程&面向对象 面向过程思想 步骤清晰简单,第一步做什么,第二步做什么..... 面象过程适合处理一些较为简单的问题 面向对象思想 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些 ...
- 对标印度的PostMan,一款中国接口测试软件的崛起
对于我们开发者,Api接口调试一定不陌生.包括我在内,之前进行Api调试时,一直使用的是一款印度的软件Postman.记得刚入手的时候,由于该款软件缺乏中文版本,上手一直比较慢,而且还至少存在如下几个 ...
- 开箱即用的Vite-Vue3工程化模板
开箱即用的Vite-Vue3工程化模板 前言 由于临近毕业肝毕设和论文,停更有一段时间了,不过好在终于肝完了大部分内容,只剩下校对工作 毕设采用技术栈Vue3,Vite,TypeScript,Node ...