上一篇介绍了.net core的配置原理已经系统提供的一些常用的配置,但有时我们的配置是存放在Zookeeper,DB,Redis中的,这就需要我们自己去实现集成了。
这里再介绍几个我们用的多的配置集成方案,可以加强我们对.net core配置机制的理解。
Zookeeper
.net core集成使用Zookeeper的做法在之前的博客中已经介绍过了,祥看:Zookeeper基础教程(六):.net core使用Zookeeper
通用配置
对于配置,数量一般不会很多,放在内存中一般时候是可以接受的,这样一方面方便使用,另一方面避免了频繁访问数据库或者Redis等第三方设置带来的性能消耗。
其实,对于数据在数据库或者redis等其他存储设备上的集成,官方给我们提供了一个InMemory解决方案,也就是上一篇说到的从内存集合中获取配置的方案。在使用时,我们只需要在程序启动时从数据库或者Redis等位置将数据读取出来,然后已InMemory的方式集成进去就行了。但是这样做有个不足,就是当配置被修改时,我们需要重新启动应用服务才能生效,这样就是放弃了.net core配置重新加载机制,因此我们需要自己去实现这个集成。
通过上述,我们可以认为数据库和Redis是同一类东西,但是又不能使用InMemory解决方案,因此,为满足以后的其它第三方配置需求,我们希望有一种通用的配置提供者,它需要满足两点:
1、提供配置所需的数据
2、能触发配置的重新加载更新
为满足这两点,我们可以提供一个接口,如:
public interface IDataProvider { /// <summary> /// 获取配置数据 /// </summary> /// <returns></returns> IDictionary<string, string> Process(); /// <summary> /// 开启监听,决定什么时候触发重新加载配置 /// </summary> /// <param name="trigger"></param> void Watch(Action trigger); }
在上一篇我们已经讲到,集成配置需要我们自己实现两个接口:IConfigurationSource 和 IConfigurationProvider 。另外还提到,如果我们的配置来自其它文件,推荐分别继承 FileConfigurationSource 和 FileConfigurationProvider 两个抽象类,否则推荐自己实现 IConfigurationSource 接口,但是 IConfigurationProvider 接口的实现类继承 ConfigurationProvider 抽象类,显然数据库和Redis之类的都不是文件,于是我们可以有这样两个实现类:
public class CommonConfigurationSource : IConfigurationSource { public Type DataProviderType { get; set; } /// <summary> /// 是否监控源数据变化 /// </summary> public bool ReloadOnChange { get; set; } = true; /// <summary> /// 加载延迟 /// </summary> public int ReloadDelay { get; set; } = 250; public IConfigurationProvider Build(IConfigurationBuilder builder) { if (!typeof(IDataProvider).IsAssignableFrom(DataProviderType)) { throw new ArgumentException("Data Provider Type must implement IDataProvider"); } return new CommonConfigurationProvider(this); } }