安装

  • ocelot.provider.polly

polly - 图1

注册相关服务

  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方法:

polly - 图2

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

熔断

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

polly - 图3

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

polly - 图4

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