如何避免错误配置的应用接收用户流量?

简介: 如何避免错误配置的应用接收用户流量?

上一节,我们学习了通过选项框架IOptions<>来让服务组件集成配置,同时,也学习了让服务感知配置变更的选项配置热更新框架IOptionsSnapshot、IOptionsMonitor以及对配置进行操作的PostConfigure方法。那么,本篇,我们接着来学习一下如何通过为选项数据添加验证来避免错误配置的应用接收用户流量。


一般的,我们可以通过以下三种方式来实现数据验证

  • 直接注册验证函数
  • 实现IValidateOptions
  • 使用Microsoft.Extension.Options.DataAnnotations


下面,我们通过代码来看一下具体操作。


直接注册验证函数

服务在注册时,提供了Validate函数来让我们注册验证函数,validate函数接受2个参数,一个是bool类型的判断条件,一个是需要打印的信息。


services.AddOptions<OrderOptions>().Configure(options=>
{
   configuration.Bind(options);
}).Validate(options =>
{
  return options.MaxOrderCount <= 100;
}, "MaxOrderCount不能大于100");

当然,Validate函数是一个多重载函数,可以根据实际的需要选择合适的重载方法。


实现IValidateOptions

IValidateOptions接口包含一个Validate方法,方法包括2个入参,一个stirng类型,一个需要验证的类型T,我们还使用上节的代码,首先定义一个类OrderOptionsValidate来实现IValidateOptions<OrderOptions>接口,


public class OrderOptionsValidate : IValidateOptions<OrderOptions>
{
    public ValidateOptionsResult Validate(string name, OrderOptions options)
    {
        if (options.MaxOrderCount > 100)
        {
            return ValidateOptionsResult.Fail("MaxOrderCount 不能大于100!!!");
        }
        else
        {
            return ValidateOptionsResult.Success;
        }
    }
}


验证类实现完成后,在服务注册时,可以通过如下方式来添加该验证类。


services.AddOptions<OrderOptions>().Configure(options =>
{
    configuration.Bind(options);
}).Services.AddSingleton<IValidateOptions<OrderOptions>, OrderOptionsValidate>();


Microsoft.Extension.Options.DataAnnotations

最后一种,相对比较简单,我们可以使用类似EntityFramework的DataAnnotations的属性标注形式来完成数据验证。
比如,我们在类定义时,可以使用属性标注来限制MaxOrderCount


public class OrderOptions
{
    [Range(1,20)]
    public int MaxOrderCount { get; set; } = 100;
    public int TotalCount { get; set; } = 500;
}


在服务注册时,只需要简单的ValidateDataAnnotations方法即可实现数据验证。


services.AddOptions<OrderOptions>().Configure(options =>
{
    configuration.Bind(options);
}).ValidateDataAnnotations();


那么到这里,我们就学习完了选项框架数据验证的3种方式,而且选项框架部分也暂告一段落,我们来回顾一下,选项框架IOptions<>可以隔离服务和配置,是服务不必依赖于配置框架从而达到解耦;同时,选项框架提供IOptionsSnapshot、IOptionsMonitor来实现配置热更新的能力,并且,通过方法PostConfigure来实现对配置操作;最后,我们可以通过

  • 直接注册验证函数
  • 实现IValidateOptions
  • Microsoft.Extension.Options.DataAnnotations


3种方式来实现对选项框架的数据验证。


下篇,我们将进入日志框架部分的学习,让我们一起加油。


详细代码请参阅


https://github.com/IronMarmot/Samples/tree/master/CoreSamples
相关文章
|
7月前
|
Java 测试技术 调度
【ACK秒级部署】20万用户在10秒处理所有请求每个用户每秒5次请求
【ACK秒级部署】20万用户在10秒处理所有请求每个用户每秒5次请求
|
5天前
|
监控 安全 持续交付
【专栏】Webhook是服务器主动发送事件通知的机制,打破传统客户端轮询模式,实现数据实时高效传递。
【4月更文挑战第29天】Webhook是服务器主动发送事件通知的机制,打破传统客户端轮询模式,实现数据实时高效传递。常用于持续集成部署、第三方服务集成、实时数据同步和监控告警。具有实时性、高效性和灵活性优势,但也面临安全风险和调试挑战。理解并善用Webhook能提升系统性能,广泛应用于现代软件开发和集成。
|
10月前
|
网络协议 Shell Perl
根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁
根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁
70 1
|
存储 IDE 开发工具
CAN通信配置过滤器和使用三个邮箱发送
CAN通信配置过滤器和使用三个邮箱发送
710 0
|
前端开发 Java 应用服务中间件
基于websocket的实时通告功能,推送在线用户,新登录用户
SpringBoot 部署与Spring部署都有一些差别,但现在用Srpingboot的公司多,SpringBoot创建项目快,所以使用该方式来讲解,有一个问题就是开发WebSocket时发现无法通过@Autowired注入bean,一直为空。
基于websocket的实时通告功能,推送在线用户,新登录用户
|
人工智能
媒体转发开启后,VOS 怎样计算各种编码所占用的带宽
计算方法如下: 带宽 = 包长度 × 每秒包数 = 包长度 × (1 / 打包周期) =(Ethernet 头 + IP 头 + UDP 头 + RTP 头 + 有效载荷)× 每秒包数 =(112bit + 160bit + 64bit + 96bit + 有效载荷)× 每秒包数 =(112bit + 320bit + 有效载荷)× 每秒包数 =(432bit + 有效载荷)× 每秒包数 =(432bit × 每秒包数) + (有效载荷 × 每秒包数) =(432bit × 1000 / 打包周期) + 编码速率 =(432bit / 打包周期)Kbps + 编码速率 按照
|
网络协议 测试技术 Go
海量用户通讯系统-服务器接收消息1
海量用户通讯系统-服务器接收消息1
74 0
海量用户通讯系统-服务器接收消息1
|
JSON 网络协议 测试技术
海量用户通讯系统-服务器接收消息2|学习笔记
快速学习海量用户通讯系统-服务器接收消息2
89 0
海量用户通讯系统-服务器接收消息2|学习笔记
|
JSON 编解码 网络协议
海量用户通讯信息-服务器接收长度|学习笔记
快速学习海量用户通讯信息-服务器接收长度
126 0
海量用户通讯信息-服务器接收长度|学习笔记
|
消息中间件 Kafka
多网络情况下,Kafka客户端如何选择合适的网络发起请求
我们都知道, 每个Broker都可以配置多个监听器, 用来用于网络分流。 相关知识请看:一文搞懂Kafka中的listeners和advertised.listeners以及其他通信配置
多网络情况下,Kafka客户端如何选择合适的网络发起请求