安装
- ocelot.provider.polly
注册相关服务
public void ConfigureServices(IServiceCollection services)
{
services.AddOcelot()
.AddPolly()
.AddConsul()
.AddConfigStoredInConsul();
}
配置文件
"QoSOptions": {
"ExceptionsAllowedBeforeBreaking":3,
"DurationOfBreak":10000,
"TimeoutValue":5000
}
ExceptionsAllowedBeforeBreaking:阈值,当转发到下游的服务连续出现的异常次数达到阈值就会触发熔断。必须和DurationOfBreak一起设置。
DurationOfBreak:熔断持续时间,单位毫秒。必须和ExceptionsAllowedBeforeBreaking一起设置。
TimeoutValue:限定时间内未响应的请求直接超时,单位毫秒。可以单独设置
tips:ocelot默认超时时间是90秒,90秒啊
然后写一个方法,休眠10秒:
[HttpGet]
public IActionResult TimeOut()
{
System.Threading.Thread.Sleep(10000);
return Ok();
}
超时
- 准备工作做完了,现在调用timeout方法:
- 方法是休眠10秒,但是等待5秒左右就主动返回了503,说明超时的设置已经生效。
熔断
当转发到下游某个服务的请求连续出现超时情况时,网关就会判断是否达到阈值,如果是就触发熔断,在此期间的请求统一返回503,熔断时间过了以后恢复正常。按上面配置来看:连续超时3次会触发熔断,熔断持续10秒。我们仍然调用Timeout方法,连续3次以后:
没有触发熔断时,只能等过5秒自动超时,很显然现在已经触发了超时,所以在200毫秒就直接返回了结果。熔断期间访问别的方法也会是503:
和开头写的一样,熔断和电路短路跳闸是思路是一样的,就算家里N条线只有1条漏电,那还是会跳闸整个屋子不能用电,这种做法最大程度上保证了程序安全。