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课:选项数据热更新:让服务感知配置的变化)--学习笔记的更多相关文章

  1. 2月送书福利:ASP.NET Core开发实战

    大家都知道我有一个公众号“恰童鞋骚年”,在公众号2020年第一天发布的推文<2020年,请让我重新介绍我自己>中,我曾说到我会在2020年中每个月为所有关注“恰童鞋骚年”公众号的童鞋们送一 ...

  2. 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新

    大家好,  我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain  用于 热更新 . 简单的说, 原理就是 类似 Asp.net 那样 让 当前 WebApp 运行在一个 A ...

  3. supersockets支持热更新的服务器实例配置选项

    SuperSocket 支持以下配置选项的热更新: * logCommand * idleSessionTimeOut * maxRequestLength * logBasicSessionActi ...

  4. [ASP.NET Core开发实战]开篇词

    前言 本系列课程文章主要是学习官方文档,再输出自己学习心得,希望对你有所帮助. 课程大纲 本系列课程主要分为三个部分:基础篇.实战篇和部署篇. 希望通过本系列课程,能让大家初步掌握使用ASP.NET ...

  5. 《微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记1)WePY开发环境的安装

    WePY的安装或更新都通过npm进行,全局安装或更新WePY命令行工具,使用以下命令: npm install wepy-cli -g 稍等片刻,成功安装后,即可创建WePY项目. 注意:如果npm安 ...

  6. 微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记4)支持React.js语法的Taro框架

    Taro本身实现的情况类似于mpvue,mpvue的未来展望中也包含了支付宝小程序,现在的版本中,也可以使用不同的构建命令来构建出百度小程序的支持,如第10章所示,但是现在Taro先于mpvue实现了 ...

  7. 第2课第3节_Java面向对象编程_继承性_P【学习笔记】

    摘要:韦东山android视频学习笔记  面向对象程序的三大特性之继承性:继承性的主要作用就是复用代码.继承性也有一定的限制,如图一 图一 1.我们在第2课第2节_Java面向对象编程_封装性_P 中 ...

  8. 2、SpringBoot接口Http协议开发实战8节课(1-6)

    1.SpringBoot2.xHTTP请求配置讲解 简介:SpringBoot2.xHTTP请求注解讲解和简化注解配置技巧 1.@RestController and @RequestMapping是 ...

  9. .NET Core开发实战(第11课:文件配置提供程序)--学习笔记

    11 | 文件配置提供程序:自由选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...

  10. [ASP.NET Core开发实战]基础篇01 Startup

    Startup,顾名思义,就是启动类,用于配置ASP.NET Core应用的服务和请求管道. Startup有两个主要作用: 通过ConfigureServices方法配置应用的服务.服务是一个提供应 ...

随机推荐

  1. plsqll连接Oracle的两种方式

    第一种方式:配置tnsnames.ora 找到plsql软件根目录 下的配置文件

  2. python 设计模式 开篇 第1篇

    1. 设计模式的定义 软件设计中普遍存在的 反复出现的 各种问题 所提出的解决方案 首先,什么是软件设计? 系统开发 项目开始的时候 需要做 需求分析 软件系统设计 软件建模 类的设计 接口的设计 等 ...

  3. Vue2 - 配置跨域

    在根目录下创建 vue.config.js 文件 . 即可 vue.config.js : // vue.config.js 配置说明 //官方vue.config.js 参考文档 https://c ...

  4. [转帖]ss 输出格式说明

    ss 命令输出详解ss 全名socket statistics,是iproute2中的一员ss已经替代netstat,大热于江湖.但是关于ss命令输出的内容,是什么意思呢? [root@test]#  ...

  5. [转帖]etcd raft模块解析

    https://www.cnblogs.com/luohaixian/p/16641100.html 1. Raft简介 raft是一个管理复制式日志的共识算法,它是通过复制日志的方式来保持状态机里的 ...

  6. [转帖]【基础】HTTP、TCP/IP 协议的原理及应用

    https://juejin.cn/post/6844903938232156167 前言 本文将持续记录笔者在学习过程中掌握的一些 HTTP .TCP/IP 的原理,以及这些网络通信技术的一些应用场 ...

  7. [转帖]LVS入门篇(五)之LVS+Keepalived实战

    LVS入门篇(五)之LVS+Keepalived实战 https://www.cnblogs.com/linuxk/p/9365189.html 一.实验架构和环境说明 (1)本次基于VMware W ...

  8. [转帖]unmatched(riscv64)上编译,安装和移植SPEC CPU 2006

    https://zhuanlan.zhihu.com/p/429399630 Linux ubuntu 5.11.0-1021-generic #22-Ubuntu SMP Tue Sep 28 15 ...

  9. [转帖]Linux小知识:sudo su和su的区别

    https://www.cnblogs.com/jiading/p/11717388.html su是申请切换root用户,需要申请root用户密码.有些Linux发行版,例如ubuntu,默认没有设 ...

  10. [转帖]Native Memory Tracking 详解(3):追踪区域分析(二)

    https://www.modb.pro/db/539804 上篇文章 Native Memory Tracking 详解(2):追踪区域分析(一) 中,分享了NMT追踪区域的部分内存类型--Java ...