CSDN|基于选项模式实现.NET Core的配置热更新( 六 )

return new RedisConfigurationProvider(_options); } } 接下来是RedisConfigurationProvider类的实现:
public class RedisConfigurationProvider : ConfigurationProvider { private CSRedisClient _redisClient; private readonly RedisConfigurationOptions _options; public RedisConfigurationProvider(RedisConfigurationOptions options ) { _options = options; _redisClient = new CSRedisClient(_options.ConnectionString); if (options.AutoReload) { //利用Redis的发布-订阅重新加载配置 _redisClient.Subscribe((_options.HashCacheChannel, msg => Load)); } } public override void Load { Data = http://news.hoteastday.com/a/_redisClient.HGetAll(_options.HashCacheKey) ?? new Dictionary; } } 为了用起来更得心应手 , 扩展方法是少不了的:
现在 , 我们改一下入口类Program.cs , 因为在这个阶段依赖注入是无法使用的 , 所以 , 看起来有一点难受 , 从命名就可以看出来 , 内部使用了Hash这种结构 , 理论上每个客户端应该使用不同的 Key 来进行缓存 , 应该使用不同的 Channel 来接收配置更新的通知:
public static IHostBuilder CreateHostBuilder(string args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration(configurationBuilder => { configurationBuilder.AddRedisConfiguration(new Models.RedisConfigurationOptions { AutoReload = true, ConnectionString = "127.0.0.1:6379", HashCacheKey = "aspnet:config", HashCacheChannel = "aspnet:config:change" }); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>; });假设现在Redis里存储着下图所示的信息:
CSDN|基于选项模式实现.NET Core的配置热更新
本文插图
相应地 , 我们可以在Startup中进行绑定:
services.Configure<AppInfoOptions>(Configuration.GetSection("App"));调一下接口看看?完全一致!Yes!
CSDN|基于选项模式实现.NET Core的配置热更新
本文插图

本文小结回想起这个面试中“邂逅”的问题 , 针对对这块内容 , 其实当时并没有和面试官进行太深的交流 , 提到了分布式配置、配置中心以及像缓存的雪崩、击穿等等常见的问题 , 我隐约记得配置文件appsettings.json配置的部分有热更新的配置项 , 但我并没有对选项模式(Options)里的三剑客做过深入的挖掘 , 所以 , 这篇博客 , 一方面是系统地了解了一下选项模式(Options)的使用 , 而另一方面是由配置热更新这个话题引申出来的一系列细节 , 在没有理解IChangeToken的时候 , 实现一个自定义的配置源是有一点困难的 , 在这篇博客的最后 , 我们基于 Redis 的发布-订阅实现了一个简单的配置中心 , 不得不说 , Redis里用:来分割 Key 的方式 , 实在是太棒了 , 因为它可以完美地和 .NET Core 里的配置系统整合起来 , 这一点只能用赏心悦目来形容 。


推荐阅读