.NET Core开发实战(第16课:选项数据热更新:让服务感知配置的变化)--学习笔记
16 | 选项数据热更新:让服务感知配置的变化
选项框架还有两个关键类型:
1、IOptionsMonitor
2、IOptionsSnapshot
场景:
1、范围作用域类型使用 IOptinsSnapshot
2、单例服务使用 IOptionsMonitor
通过代码更新选项:
IPostConfigureOptions
延续上一节的代码,但是做一些特殊处理,之前注册 Order 服务用的是单例模式,这里改为 Scoped 模式
public void ConfigureServices(IServiceCollection services)
{
services.Configure<OrderServiceOptions>(Configuration.GetSection("OrderService"));
//services.AddSingleton<IOrderService, OrderService>();
services.AddScoped<IOrderService, OrderService>();
services.AddControllers();
}
service 还是使用 IOptions
public class OrderService : IOrderService
{
IOptions<OrderServiceOptions> _options;
public OrderService(IOptions<OrderServiceOptions> options)
{
_options = options;
}
public int ShowMaxOrderCount()
{
return _options.Value.MaxOrderCount;
}
}
启动程序,输出如下:
orderService.ShowMaxOrderCount:200
修改配置
{
"OrderService": {
"MaxOrderCount": 2000
}
}
刷新浏览器,输出如下:
orderService.ShowMaxOrderCount:200
输出值还是200
那么如何能够读到新的配置呢?
只需要把 IOptions 换成 IOptionsSnapshot 即可
IOptionsSnapshot<OrderServiceOptions> _options;
public OrderService(IOptionsSnapshot<OrderServiceOptions> options)
{
...
}
这是因为我们的服务注册的是 Scoped 模式,并且使用 Snapshot 来读取配置,每次请求都会重新计算并读取配置
那如果我们的服务是单例的时候怎么办呢?
把服务注册改为单例模式
services.AddSingleton<IOrderService, OrderService>();
这里需要使用另一个接口,把 Snapshot 改为 Monitor
IOptionsMonitor<OrderServiceOptions> _options;
public OrderService(IOptionsMonitor<OrderServiceOptions> options)
{
...
}
Monitor 与 Snapshot 的定义略微有些不同,它获取值是需要用 CurrentValue 字段
public int ShowMaxOrderCount()
{
return _options.CurrentValue.MaxOrderCount;
}
启动程序,修改配置文件,刷新浏览器,可以看到输出了修改后的数据,也就是说单例对象同时也能读取到最新的配置
如果说我想知道配置的值发生变化并且通知到我的 Options 怎么做呢?
首先看一下 Monitor 的定义
namespace Microsoft.Extensions.Options
{
public interface IOptionsMonitor<out TOptions>
{
TOptions CurrentValue { get; }
TOptions Get(string name);
IDisposable OnChange(Action<TOptions, string> listener);
}
}
它有一个 OnChange 方法,也就是说可以监听它的变更
public OrderService(IOptionsMonitor<OrderServiceOptions> options)
{
_options = options;
_options.OnChange(option =>
{
Console.WriteLine($"配置更新了,最新的值是:{_options.CurrentValue.MaxOrderCount}");
});
}
启动程序,修改配置,可以看到输出配置变化,也就是说可以在单例模式下监听到 Options 的变化
通常情况下,在设计服务的时候,会在 ConfigureServices 添加配置注入、服务注入,但是当配置多起来的时候,注入代码就会非常多
那么如何使代码结构更加良好?
实际上可以把服务注册的代码放在静态扩展方法里,使得 ConfigureServices 更加简洁
namespace OptionsDemo
{
public static class OrderServiceExtensions
{
public static IServiceCollection AddOrderService(this IServiceCollection services,IConfiguration configuration)
{
services.Configure<OrderServiceOptions>(configuration);
services.AddSingleton<IOrderService, OrderService>();
return services;
}
}
}
这样在 Startup 的注册就变得更为简单了
services.AddOrderService(Configuration.GetSection("OrderService"));
我们在设计系统的时候会涉及大量的 service,所以我们可以把 service 的注册提炼在扩展方法里,不同的模块用不同的扩展方法隔开,使模块之间更加清晰,代码的结构也更加的清晰
那么实际上我们在设计服务的时候,还有一些特殊的述求,比如说把配置读取出来之后,还需要在内存里面进行一些特殊的处理,我们就可以使用动态配置的方式
动态配置的方式是在我们的 Configure 的代码之后,调用 PostConfigure 的方法,这里需要配置 OrderServiceOptions
{
public static class OrderServiceExtensions
{
public static IServiceCollection AddOrderService(this IServiceCollection services,IConfiguration configuration)
{
services.Configure<OrderServiceOptions>(configuration);
services.PostConfigure<OrderServiceOptions>(options =>
{
options.MaxOrderCount += 20;
});
services.AddSingleton<IOrderService, OrderService>();
return services;
}
}
}
启动程序,可以看到输出动态增加了20
GitHub源码链接:
https://github.com/MingsonZheng/DotNetCoreDevelopmentActualCombat/tree/main/OptionsDemo



本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。
.NET Core开发实战(第16课:选项数据热更新:让服务感知配置的变化)--学习笔记的更多相关文章
- 2月送书福利:ASP.NET Core开发实战
大家都知道我有一个公众号“恰童鞋骚年”,在公众号2020年第一天发布的推文<2020年,请让我重新介绍我自己>中,我曾说到我会在2020年中每个月为所有关注“恰童鞋骚年”公众号的童鞋们送一 ...
- 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新
大家好, 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新 . 简单的说, 原理就是 类似 Asp.net 那样 让 当前 WebApp 运行在一个 A ...
- supersockets支持热更新的服务器实例配置选项
SuperSocket 支持以下配置选项的热更新: * logCommand * idleSessionTimeOut * maxRequestLength * logBasicSessionActi ...
- [ASP.NET Core开发实战]开篇词
前言 本系列课程文章主要是学习官方文档,再输出自己学习心得,希望对你有所帮助. 课程大纲 本系列课程主要分为三个部分:基础篇.实战篇和部署篇. 希望通过本系列课程,能让大家初步掌握使用ASP.NET ...
- 《微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记1)WePY开发环境的安装
WePY的安装或更新都通过npm进行,全局安装或更新WePY命令行工具,使用以下命令: npm install wepy-cli -g 稍等片刻,成功安装后,即可创建WePY项目. 注意:如果npm安 ...
- 微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记4)支持React.js语法的Taro框架
Taro本身实现的情况类似于mpvue,mpvue的未来展望中也包含了支付宝小程序,现在的版本中,也可以使用不同的构建命令来构建出百度小程序的支持,如第10章所示,但是现在Taro先于mpvue实现了 ...
- 第2课第3节_Java面向对象编程_继承性_P【学习笔记】
摘要:韦东山android视频学习笔记 面向对象程序的三大特性之继承性:继承性的主要作用就是复用代码.继承性也有一定的限制,如图一 图一 1.我们在第2课第2节_Java面向对象编程_封装性_P 中 ...
- 2、SpringBoot接口Http协议开发实战8节课(1-6)
1.SpringBoot2.xHTTP请求配置讲解 简介:SpringBoot2.xHTTP请求注解讲解和简化注解配置技巧 1.@RestController and @RequestMapping是 ...
- .NET Core开发实战(第11课:文件配置提供程序)--学习笔记
11 | 文件配置提供程序:自由选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...
- [ASP.NET Core开发实战]基础篇01 Startup
Startup,顾名思义,就是启动类,用于配置ASP.NET Core应用的服务和请求管道. Startup有两个主要作用: 通过ConfigureServices方法配置应用的服务.服务是一个提供应 ...
随机推荐
- java项目实践-tomcat实现用户登录-day17
目录 1. 安装 2. 初识tomcat 2. 创建tomcat项目 3. 启动之前 3. java jsp 4. Request Response对象的其他属性 5. 用户登录小功能 1. 安装 t ...
- Idea 进行远程服务器debug操作
本文为博主原创,转载请注明出处: 很多时候为了定位服务器的问题,不方便定位时,采用idea 远程debug 服务器环境的服务进行问题定位,主要操作步骤如下: 1. 修改服务器服务的JVM 配置,开启远 ...
- 如何安全的大数据量表在线进行DDL操作
本文为博主原创,转载请注明出处 随着业务的需要,工作中需要对生产数据库的一些表做一些DDL操作,由于生产数据库表的数据量都是几千万, 而且生产数据库的表还在不断的进行新增和查询操作.应用中需要对生产数 ...
- [STM32H7] 实战技能分享,如何让工程代码各种优化等级通吃,含MDK AC5,AC6,IAR和GCC
引出问题: 一个好的工程项目代码,特别是开源类的,如果能做到各种优化等级通吃,是一种非常好的工程案例,这样别人借鉴的时候,可以方便的适配到自己工程里.但实际项目中,针对一款产品代码,我们一般不会 ...
- crypto常用算法
欧几里得算法(辗转相除法) def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) 扩展欧几里得算法 def ext_euclid( ...
- VUE - 配置跨域
'/api': { target: 'http://localhost:8088/', //这里后台的地址模拟的;应该填写你们真实的后台接口 changOrigin: true, //允许跨域 pat ...
- [转帖]python print如何格式化输出变量长度固定某个长度
https://zhuanlan.zhihu.com/p/595778735 在 Python 中,可以使用格式化字符串的方法来格式化输出变量. 例如,要将一个字符串变量 s 输出为 10 个字符长度 ...
- [转帖]nginx 反向代理 URL替换方案
nginx 提供反向代理服务,日常开发过程中有时候我们需要使用nginx 作为代理服务根据url的不同去访问不同的服务器或者不同端口,如下提供两种方案. 1.直接替换location 匹配部分 1. ...
- 阿里的AIGC数据库工具: Chat2DB的学习与使用
阿里的AIGC数据库工具: Chat2DB的学习与使用 背景 今天陪家中老人去完医院后, 继续回来学习时发现 阿里巴巴的 chat2DB已经发布的 2.0.1的版本. 想着下载下来试试. 主要也是备忘 ...
- Stress-ng 的简单学习
背景 想研究一下国产和不同架构,不通型号CPU的算力 也作为后续生产交付的基线准备. 学习各种不同工具进行简要测试. 安装 git clone https://github.com/ColinIanK ...