前言

市面上已经有很多配置中心集成工具了,故此不会去实践某个框架。

下面链接是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 实践篇—————配置系统之简单配置中心[十一]的更多相关文章

  1. 重新整理 .net core 实践篇—————日志系统之战地记者[十五]

    前言 本节开始整理日志相关的东西.先整理一下日志的基本原理. 正文 首先介绍一下包: Microsoft.Extengsion.Logging.Abstrations 这个是接口包. Microsof ...

  2. 重新整理 .net core 实践篇—————日志系统之作用域[十七]

    前言 前面介绍了服务与日志之间的配置,那么我们服务会遇到下面的场景会被遇到一些打log的问题. 前面我提及到我们的log,其实是在一个队列里面,而我们的请求是在并发的,多个用户同时发送请求这个时候我们 ...

  3. 重新整理 .net core 实践篇—————日志系统之结构化[十八]

    前言 什么是结构化呢? 结构化,就是将原本没有规律的东西进行有规律话. 就比如我们学习数据结构,需要学习排序然后又要学习查询,说白了这就是一套,没有排序,谈如何查询是没有意义的,因为查询算法就是根据某 ...

  4. 重新整理 .net core 实践篇—————日志系统之服务与日志之间[十六]

    前言 前文介绍了一些基本思路,那么这里介绍一下,服务如何与配置文件配合. 正文 服务: public interface ISelfService { void ShowLog(); } public ...

  5. 重新整理 .net core 实践篇—————配置系统之强类型配置[十]

    前言 前文中我们去获取value值的时候,都是通过configurationRoot 来获取的,如configurationRoot["key"],这种形式. 这种形式有一个不好的 ...

  6. 重新整理 .net core 实践篇————配置应用[一]

    前言 本来想整理到<<重新整理.net core 计1400篇>>里面去,但是后来一想,整理 .net core 实践篇 是偏于实践,故而分开. 因为是重新整理,那么就从配置开 ...

  7. 重新整理 .net core 实践篇—————配置文件之环境配置[九]

    前言 在当今在互联网微服务比较适用的情况下,docker 可以说一个利器.每次我们打包docker的时候都是适用docker 的配置文件,那么配置文件里面会设置环境变量,这个时候需要我们的应用能够识别 ...

  8. 重新整理 .net core 实践篇————配置系统之盟约[五]

    前言 在asp .net core 中我们会看到一个appsettings.json 文件,它就是我们在服务中的各种配置,是至关重要的一部门. 不管是官方自带的服务,还是我们自己编写的服务都是用它来实 ...

  9. 重新整理 .net core 实践篇—————配置系统之军令状[七](配置文件)

    前言 介绍一下配置系统中的配置文件,很多服务的配置都写在配置文件中,也是配置系统的大头. 正文 在asp .net core 提供了下面几种配置文件格式的读取方式. Microsoft.extensi ...

随机推荐

  1. IDEA中Maven的配置

    Maven安装 下载Maven 官网:https://maven.apache.org/ 下载完成后,解压即可: 配置环境变量 在本机电脑的系统环境变量中 配置如下配置: 路径:此电脑-->高级 ...

  2. JAVAEE_Servlet_21_Cookie

    Cookie * Cookie 是什么? - Cookie翻译过来是曲奇饼干的意思 - Cookie可以保存回话状态,但是这个会话状态是保存在客户端上的,只要清除Cookie,或者 Cookie失效, ...

  3. OOP-面向对象(三)

    魔术方法的使用 # 使用 __new__ 创建单态模式 class Singleton(): __obj = None def __new__(cls, *args, **kwargs): if cl ...

  4. 【OO课下讨论】bug中的“二八定律”

    bug中的"二八定律" 本文主要为讨论2020/3/17下午OO课讨论的第三个思考题设立 有一个经典的经验性原则,叫帕累托原则,也称为二八定律.这个原则在经济.社会和科技等多个领域 ...

  5. 用Qt(C++)实现如苹果般的亮屏效果

    用Qt(C++)实现如苹果般的亮屏效果 苹果的亮屏效果可能有很多人没注意到,和其他大部分手机或电脑不同的是,苹果的亮屏特效不是简单的亮度变化,而是一个渐亮的过程.详细来说就是,图片中较亮的部分先显示出 ...

  6. hdu 3721 树的最小直径

    题意:       给你一棵树,让你改变一条边,改变之后依然是一棵树,然后问你怎样改变才能让树的直径最短.这里的改变一条边指的是指把一条边长度不变,连在别的两个点上. 思路:       首先求出树的 ...

  7. hdu5033 最大仰望角

    题意:       给你n个楼房排成一条直线,楼房可以看成是宽度为1的线段,然后给你m组询问,每组询问给你一个坐标,输出在当前坐标仰望天空的可视角度. 思路:       n比较大,O(n*m)肯定跪 ...

  8. Windows 10 系统进入测试模式命令

    首先需要开启测试模式,内容如下: @bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS @bcdedit -set TESTSIGNING ON 取消 ...

  9. java之Map和Collection

    java中保存对象的容器可分为两类: 1.Map.Map是以键值对的形式来保存一组对象,可以通过键来查找值. 2.Collection.用来保存独立对象的序列.Collection又可分为三种类型: ...

  10. webpack 快速入门 系列 —— 实战一

    实战一 准备本篇的环境 虽然可以仅展示核心代码,但笔者认为在一个完整的环境中边看边做,举一反三,效果更佳. 这里的环境其实就是初步认识 webpack一文完整的示例,包含 webpack.devSer ...