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