基本概念

超时、熔断、限流听起来好像很远,但实际上用在方方面面。很多人可能还搞不懂熔断是做什么,其实可以把熔断理解为一种防护措施。做个假设,在微服务体系下,某个下游服务响应很慢,然后随着时间推移,会有越来越多的请求堆积,从而会导致各种严重后果,单说连接池大量被占用就很要命。更不用说服务之间还要相互调用,你等我10秒,我等你5秒,不仅毫无体验感,高可用也就成了空谈。不如换个思路:与其等10秒返回一个请求失败,不如马上就返回请求失败。这样一来,请求堆不起来,资源也有时间释放或者恢复。这个动作就叫熔断,或者叫短路。有点像家用电路,一旦有漏电直接跳闸,最大程度保障安全。

熔断的概念基本有了,接下来给网关集成。这里需要用到一个叫polly的库。

简单说下它:polly由.net实现,是一个非常优秀的库,主要提供重试、熔断、超时、恢复等功能,当然今天主角不是它,想研究的可以去官方看下:https://github.com/App-vNext/Polly

接下来开始集成。首先添加nuget包:

然后注册相关服务:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddOcelot()
  4. .AddPolly()
  5. .AddConsul()
  6. .AddConfigStoredInConsul();
  7. }

接下来在配置文件添加节点:

  1. "QoSOptions": {
  2. "ExceptionsAllowedBeforeBreaking":3,
  3. "DurationOfBreak":10000,
  4. "TimeoutValue":5000
  5. }

ExceptionsAllowedBeforeBreaking:阈值,当转发到下游的服务连续出现的异常次数达到阈值就会触发熔断。必须和DurationOfBreak一起设置。

DurationOfBreak:熔断持续时间,单位毫秒。必须和ExceptionsAllowedBeforeBreaking一起设置。

TimeoutValue:限定时间内未响应的请求直接超时,单位毫秒。可以单独设置

tips:ocelot默认超时时间是90秒,90秒啊

然后写一个方法,休眠10秒:

  1. [HttpGet]
  2. public IActionResult TimeOut()
  3. {
  4. System.Threading.Thread.Sleep(10000);
  5. return Ok();
  6. }

超时

准备工作做完了,现在调用timeout方法:

方法是休眠10秒,但是等待5秒左右就主动返回了503,说明超时的设置已经生效。

熔断

当转发到下游某个服务的请求连续出现超时情况时,网关就会判断是否达到阈值,如果是就触发熔断,在此期间的请求统一返回503,熔断时间过了以后恢复正常。按上面配置来看:连续超时3次会触发熔断,熔断持续10秒。我们仍然调用Timeout方法,连续3次以后:

没有触发熔断时,只能等过5秒自动超时,很显然现在已经触发了超时,所以在200毫秒就直接返回了结果。熔断期间访问别的方法也会是503:

和开头写的一样,熔断和电路短路跳闸是思路是一样的,就算家里N条线只有1条漏电,那还是会跳闸整个屋子不能用电,这种做法最大程度上保证了程序安全。

限流

假设现在只能承载1万并发,那么过来5万并发会怎么样?一般情况下,只要持续时间稍久一些,服务基本全都挂了。这种情况在生产环境难免会发生,毕竟业务量也无法测算那么精准。所以为了提高可用性,瞬时请求超过最大阈值,其他的全都忽略才能保证服务安全可用。让客户等下一次请求,总好过服务挂了没的请求。

限流也是配置就能实现,在路由中新增下面的节点:

  1. "RateLimitOptions": {
  2. "ClientWhitelist": [],
  3. "EnableRateLimiting": true,
  4. "Period": "1s",
  5. "PeriodTimespan": 1,
  6. "Limit": 1
  7. }

ClientWhitelist:客户端白名单,白名单不受限流规则限制。

EnableRateLimiting:是否启用限流。

Period:周期,单位有s(秒)、m(分)、h(时)、d(天),比如1h

PeriodTimespan:多少秒后重试。

Limit:周期内允许多少个请求。

想要更精细的控制,还可以在Global部分添加这些:

  1. "RateLimitOptions": {
  2. "DisableRateLimitHeaders": false,
  3. "QuotaExceededMessage": "Customize Tips!",
  4. "HttpStatusCode": 999,
  5. "ClientIdHeader" : "Test"
  6. }

DisableRateLimitHeaders:是否禁用X-Rate-Limit、Retry-After标头。

QuotaExceededMessage:触发限流时返回的消息。

HttpStatusCode:触发限流时返回的http状态码(一般会写429)。

ClientIdHeader:用来识别客户端的标头。

tips:DisableRateLimitHeaders中提到的X-Rate-Limit、Retry-After:X-Rate-Limit——标准时间内允许多少个请求,Retry-After——触发限流以后多久可以重试。

接下来修改我的配置:

  1. "RateLimitOptions": {
  2. "ClientWhitelist": [ "myclient" ],
  3. "EnableRateLimiting": true,
  4. "Period": "1s",
  5. "PeriodTimespan": 10,
  6. "Limit": 1
  7. }

修改全局配置:

  1. "RateLimitOptions": {
  2. "DisableRateLimitHeaders": false,
  3. "QuotaExceededMessage": "123123",
  4. "HttpStatusCode": 429,
  5. "ClientIdHeader": "Test"
  6. }

按配置来看,我设置1秒内最多允许1个请求,超过就触发限流。之后的请求都会返回429和123123,持续10秒。来试试:

等待10秒后再次请求,恢复正常:

白名单

白名单里的客户端是不会受到限流限制的。按照配置添加请求头,就可以被白名单识别:

请求时添加这个请求头,无论怎么刷都不会被限流。

超时、熔断、限流的必要性和好处是不言而喻的,但是上生产一定要注意配置的合理性,充分综合业务场景和需要才是王道,毕竟技术如果不解决问题那就毫无意义。

.Net Core微服务——Ocelot(3):超时、熔断、限流的更多相关文章

  1. ASP.NET Core 微服务初探[2]:熔断降级之Polly

    当我们从单体架构迁移到微服务模式时,其中一个比较大的变化就是模块(业务,服务等)间的调用方式.在以前,一个业务流程的执行在一个进程中就完成了,但是在微服务模式下可能会分散到2到10个,甚至更多的机器( ...

  2. .NET Core微服务二:Ocelot API网关

    .NET Core微服务一:Consul服务中心 .NET Core微服务二:Ocelot API网关 .NET Core微服务三:polly熔断与降级 本文的项目代码,在文章结尾处可以下载. 本文使 ...

  3. .NET Core微服务一:Consul服务中心

    本文的项目代码,在文章结尾处可以下载. 防爬虫,本文的网址是:https://www.cnblogs.com/shousiji/p/12253295.html 本文使用的环境:Windows10 64 ...

  4. 不死的小强 .net core 微服务 快速开发框架 Viper 限流

    1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...

  5. .NET Core微服务之基于Polly+AspectCore实现熔断与降级机制

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.熔断.降级与AOP 1.1 啥是熔断? 在广义的解释中,熔断主要是指为控制股票.期货或其他金融衍生产品的交易风险,为其单日价格波动幅度 ...

  6. .NET Core微服务之基于Ocelot实现API网关服务(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.负载均衡与请求缓存 1.1 负载均衡 为了验证负载均衡,这里我们配置了两个Consul Client节点,其中ClientServic ...

  7. .NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.案例结构总览 这里,假设我们有两个客户端(一个Web网站,一个移动App),他们要使用系统,需要通过API网关(这里API网关始终作为 ...

  8. .NET Core微服务之基于Ocelot实现API网关服务

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.啥是API网关? API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端 ...

  9. (5)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 熔断降级(Polly)

    一. 什么是熔断降级 熔断就是“保险丝”.当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发 ...

随机推荐

  1. Winform 窗体自适应

    前言 在使用 Winform 开发过程中,经常发些因为显示器分辨率.窗体大小改变,控件却不能自适应变化,几经查找资料,和大佬的代码.经过细小修改,终于可以让窗体在外界影响下,窗体内背景图片.控件都会自 ...

  2. Redis多种数据类型以及使用场景

    SDS简单动态字符串 struct sdshdr { // 记录buf数组中已使用字节的数量 // 等于SDS所保存字符串的长度 int len; // 记录buf数组中未使用字节的数量 int fr ...

  3. python测试开发工具库汇总(转载)

    Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...

  4. IDEA Web渲染插件开发(二)— 自定义JsDialog

    <IDEA Web渲染插件开发(一)>中,我们了解到了如何编写一款用于显示网页的插件,所需要的核心知识点就是IDEA插件开发和JCEF,在本文中,我们将继续插件的开发,为该插件的JS Di ...

  5. Tomcat各种日志的关系与catalina.out文件的分割

    Tomcat 各日志之间的关系 一图胜千言! 其他日志如localhost.{yyyy-MM-dd}.log.localhost-access.{yyyy-MM-dd}.log是context的名称, ...

  6. 每日总结:Number&Math类(2021.10.4)

    Java语言为每一个内置数据类型提供了对应的包装类. 所有的包装类(Integer.Long.Byte.Double.Float.Short)都是抽象类Number的子类 其中Integer 对应的基 ...

  7. Oracle12C安装教程

    准备工作 网盘链接: https://pan.baidu.com/s/1gffHbOjImk1SfezdWO2Bpw 提取码: imft Oracle12C的安装 1.分别解压"winx64 ...

  8. LuckySheet一款在线Excel使用心得

    1.LuckySheet简介 Luckysheet ,是一款国产的纯JS实现的类似excel的在线表格,功能强大.配置简单.完全开源. 开源地址 https://gitee.com/mengshuke ...

  9. 命名空间、作用域、LEGB法则、垃圾回收机制

    一.命名空间.作用域.LEGB法则. 1.命名空间和作用域 : 命名空间:变量名称与值的映射关系 作用域:变量作用的区域,即范围. 注意:class/def/模块会产生作用域:分支语句,循环语句,异常 ...

  10. CSP2021 翻车记

    DAY - INF 日常模拟赛被吊打,不知道为啥总是出一些小问题导致正解gg,成绩的话也就是中游吧,不过方差不小 DAY - 2 感冒了,头疼得很,签到题甚至也签到失败了,烦得很 DAY -1 全真体 ...