(5)ASP.NET Core3.1 Ocelot服务质量-熔断

1.服务质量(Quality of Service)

对于微服务来说,熔断就是我们常说的“保险丝”,意思是当服务出现某些状况时候,通过切断服务防止应用程序不断地执行可能会失败的操作造成系统崩溃,或者大量的超时等待导致系统卡死等情况。而Ocelot也支持熔断,当客户端通过上游向下游服务发出请求时候,我们可以基于每个路由上配置熔断功能。Ocelot使用了Polly的.NET库中的熔断功能,安装命令如下:

Install-Package Ocelot.Provider.Polly

Ocelot服务质量项目示例中,通过APIGateway项目的路由QoSOptions选项可以配置熔断功能。APIGateway项目中配置一个下游服务加入了熔断功能,一个则没有,对应下文APIServices项目两个Get方法,具体代码如下:

{
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/values",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 9001
        }
      ],
      "UpstreamPathTemplate": "/customers",
      "UpstreamHttpMethod": [ "Get" ],
      "QoSOptions": {
        //该值必须大于0,该值是指当异常发生达到此值会熔断。
        "ExceptionsAllowedBeforeBreaking": 2,
        //该值指熔断后会保持多久。该值的单位是毫秒。
     "DurationOfBreak": 5000,
        //该值指定当请求超过此值会被自动设置为超时。同样该值的单位是毫秒。
        "TimeoutValue": 2000
      }
    },
    {
      "DownstreamPathTemplate": "/api/values/{id}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 9001
        }
      ],
      "UpstreamPathTemplate": "/customers/{id}",
      "UpstreamHttpMethod": [ "Get" ]
    }
  ]
}

下面来介绍下QoSOptions选项几个参数:
●ExceptionsAllowedBeforeBreaking:该值必须大于0,该值是指当异常发生达到此值会熔断。
●DurationOfBreak:该值指熔断后会保持多久。该值的单位是毫秒。
●TimeoutValue:该值指定当请求超过此值会被自动设置为超时。同样该值的单位是毫秒。
根据官网文档说明,如果路由配置里面不加入QoSOptions选项,则不使用熔断功能,但是Ocelot会将在所有下游请求默认为90秒超时。

2.项目演示

2.1APIGateway项目

Ocelot要使用熔断功能需要注册Polly服务,所以需在ConfigureServices方法中加入如下代码:

public virtual void ConfigureServices(IServiceCollection services)
{
    //注册Polly服务
    services.AddOcelot().AddPolly();
}

2.2APIServices项目

项目添加两个Get方法作对比,对应APIGateway项目的路由上下游配置,一个加入计数变量条件判断,如果计数变量超过等于小于3则等待6秒;一个传参即可,具体代码如下:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    private static int _count = 0;

    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        _count++;
        System.Console.WriteLine($"get...{_count}");
        if (_count <= 3)
        {
            System.Console.WriteLine($"circuit breaker...{_count}");
            Thread.Sleep(6000);
        }
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        return "value";
    }
}

2.3项目运行

输入dotnet run --project 项目路径\项目文件.csproj把两个项目启动起来,在浏览器上连续刷新三次上游服务地址http://localhost:9000/customers,会看到如下信息:


结合APIGateway项目网关配置QoSOptions选项和APIServices项目Get方法代码可以看到:_count变量是0-3的时候,会等待6秒才会输出字符串数组返回给客户端。当_count小于等于2的时候,控制台会输出Get方法_count变量信息,但是因为QoSOptions.TimeoutValue设置了2秒超时,所以在等待2秒后就直接切断服务请求返回503状态码给客户端,不会再进行下一步操作。而当_count等于3的时候,控制台并没有返回_count变量信息,这是为什么呢?因为QoSOptions.ExceptionsAllowedBeforeBreaking选项设置了2次请求异常或者超时处理时直接熔断,所以当第三次请求时,连下游服务都没分发就直接返回503状态码给客户端。下面我们再来看看第四次请求:

这时候会看到第四次请求跟第一二次请求是一样的状态码、回调结果,差不多的耗时,这证明QoSOptions配置生效了!而当第五次请求时候,我们就会看到成功获取Get回调字符串数组:

然后我们在浏览器上刷新http://localhost:9000/customers/1几次,会看到如下信息:

没添加熔断配置的服务是没有限制,可以直接访问。

参考文献:
Ocelot官网

posted on 2020-11-12 16:33  暗断肠  阅读(664)  评论(2编辑  收藏  举报

导航