微服务-Ocelot熔断

Ocelot缓存
网关除了可以做请求转发外,还可以做缓存功能。

 

 

 

在网关服务的自定配置文件configuration.json中添加缓存配置节点,就可以实现将相同请求在一定时间内返回同一内容,网关直接将后面的请求拦截并处理,请求不会被转发到consul。

"FileCacheOptions": { //缓存设置
        "TtlSeconds": 10, //ttl秒被设置为10,这意味着缓存将在10秒后过期。(同一地址就返回同一结果)
        "Region": "" //缓存region ,可以使用administrator API清除
}

 

 

"FileCacheOptions": { //缓存设置
"TtlSeconds": 10, //ttl秒被设置为10,这意味着缓存将在10秒后过期。(同一地址就返回同一结果)
"Region": "" //缓存region ,可以使用administrator API清除
}
在10秒钟之内请求网关地址,返回的是同一个内容:

 

 

 

 

Ocelot限流

限制请求在1分钟只能最多请求5次,超过5次则不可请求。5秒钟过后可继续请求。要完成这样一个需求,需要用到网关的限流机制。

配置文件configuration.json中添加限流配置节点:

 

 

 

//限流:限制单位时间内请求数量(防爬虫,防ddos等)
      "RateLimitOptions": {
        "ClientWhitelist": [], // 白名单
        "EnableRateLimiting": true, // 是否限流
        "Period": "1m", // 1s,4m,1h,1d
        "PeriodTimespan": 5, // 多少秒之后客户端可以重试
        "Limit": 5 // 一个时间周期最多可以请求的次数
      }

 

"GlobalConfiguration": {
    "RateLimitOptions": { //超过限流
      "HttpStatusCode": 999 //自定义返回内容
    }
  }

 

 

//限流:限制单位时间内请求数量(防爬虫,防ddos等)
"RateLimitOptions": {
"ClientWhitelist": [], // 白名单
"EnableRateLimiting": true, // 是否限流
"Period": "1m", // 1s,4m,1h,1d
"PeriodTimespan": 5, // 多少秒之后客户端可以重试
"Limit": 5 // 一个时间周期最多可以请求的次数
}
"GlobalConfiguration": {
"RateLimitOptions": { //超过限流
"HttpStatusCode": 999 //自定义返回内容
}
}
RateLimitOptions配置项对请求的次数和时长做具体限制。

RateLimitOptions配置项对限流后返回内容做设置,比如自定义状态码,用999来表示已超过最大访问限流值。

 

一分钟之内请求超过5次,会返回如下信息:

 

 

 

 

Ocelot熔断

请求在5秒钟之内没有返回内容,那么本次请求就算超时。要完成这样一个需求,需要用到网关的熔断机制。

使用NuGet在网关项目中引用程序集:Ocelot.Provider.Polly

 

 

 

配置文件configuration.json中添加熔断配置节点:

 

 

 

//熔断:达成某些条件后,接口暂不提供服务
      "QoSOptions": { //断路器配置,目前Ocelot使用的Polly
        "ExceptionsAllowedBeforeBreaking": 3, //打开断路器之前允许的例外数量。(允许多少个异常请求)
        "DurationOfBreak": 60000, //断路器复位之前,打开的时间(毫秒)(熔断时间6秒钟)
        "TimeoutValue": 1000 //请求超时时间(毫秒)
      }

 

 

//熔断:达成某些条件后,接口暂不提供服务
"QoSOptions": { //断路器配置,目前Ocelot使用的Polly
"ExceptionsAllowedBeforeBreaking": 3, //打开断路器之前允许的例外数量。(允许多少个异常请求)
"DurationOfBreak": 60000, //断路器复位之前,打开的时间(毫秒)(熔断时间6秒钟)
"TimeoutValue": 1000 //请求超时时间(毫秒)
}
用一句话描述上述配置:对http://localhost:9526/ApiService/values/Timeout请求超过1s将会超时,发生三次超时后保持60s熔断。

 

要检查熔断机制有没有生效,在webapi的控制器中加一个方法:

 

 

 

 

 

让线程休息6秒钟。以达到超过配置项中1秒超时的目的。

 

 

 

 

 

 

 

从浏览器看这个请求返回503,代表请求被服务器拒绝访问。实际已经执行了,从log可以看出:

 

 

 

因为配置了熔断策略,所以这个超过1秒钟的请求被网关认为是超时请求。

 

可以看到在前4次请求,Time在1000ms之后返回503,在第四次以后发生熔断,请求后立即(Time在100ms左右)返回503。

 

 

 

参考文章:https://www.jianshu.com/p/c7f5f9515962

 

posted @ 2022-01-21 19:01  逊老头  阅读(273)  评论(0编辑  收藏  举报