Ocelot之基于Polly熔断

 

Ocelot之基于Polly熔断

前言

上章节介绍了Ocelot之基于Consul服务发现,这节介绍.NET Core平台下Ocelot之基于Polly熔断。

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

 

环境:Win10+VS2022 +.NET5.0 + Ocelot17.0.0.0 + Consul 1.6.1.1

Polly介绍

 Polly是一个被.NET基金会认可的弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略,其主要功能如下:

重试(Retry

断路器(Circuit-Breaker

超时检测(Timeout

缓存(Cache

降级(Fallback

  Polly的策略主要由“故障”和“动作”两个部分组成,“故障”可以包括异常、超时等情况,“动作”则包括Fallback(降级)、重试(Retry)、熔断(Circuit-Breaker)等。策略则用来执行业务代码,当业务代码出现了“故障”中的情况时就开始执行“动作”。

 

 

 

 

 

 

熔断

 

在广义的解释中,熔断主要是指为控制股票、期货或其他金融衍生产品的交易风险,为其单日价格波动幅度规定区间限制,一旦成交价触及区间上下限,交易则自动中断一段时间(“熔即断”),或就此“躺平”而不得超过上限或下限(“熔而不断”)

  而对于微服务来说,熔断就是我们常说的“保险丝”,意为当服务出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作造成系统的“雪崩”,或者大量的超时等待导致系统卡死等情况,很多地方也将其成为“过载保护”。

 

 

 

 

 

项目实现

在上节Ocelot之基于Consul服务发现”的项目实现上继续改造。

3.1 修改接口服务

在获取天气接口中添加打印Log和休眠6秒功能。

        [HttpGet]

        public IEnumerable<WeatherForecast> Get()

        {

            _logger.LogInformation("执行");

            Thread.Sleep(6000);

            var rng = new Random();

            return Enumerable.Range(1, 5).Select(index => new WeatherForecast

            {

                Date = DateTime.Now.AddDays(index),

                TemperatureC = rng.Next(-20, 55),

                Summary = Summaries[rng.Next(Summaries.Length)]

            })

            .ToArray();

        }

 

 

3.2 修改网关

1.添加Ocelot的Polly依赖

添加Polly依赖后,Yak.Ocelot.Gateway项目文件下添加了下面代码。

 

 

 

 

  <ItemGroup>

    <PackageReference Include="Ocelot" Version="17.0.0" />

    <PackageReference Include="Ocelot.Provider.Consul" Version="17.0.0" />

    <PackageReference Include="Ocelot.Provider.Polly" Version="17.0.0" />

  </ItemGroup>

 

2. 修改ocelot配置文件,添加熔断配置。

{

  "Routes": [

    {

      "DownstreamPathTemplate": "/WeatherForecast",

      "DownstreamScheme": "http",

      "ServiceName": "service-a",

      "UseServiceDiscovery": true,

      "UpstreamPathTemplate": "/Weather",

      "UpstreamHttpMethod": [ "Get" ],

      "LoadBalancerOptions": {

        "Type": "RoundRobin"

      }, //熔断器Polly

      "QoSOptions": {

        "ExceptionsAllowedBeforeBreaking": 3, //打开断路器之前允许的多少个异常请求

        "DurationOfBreak": 60000, // 熔断时间

        "TimeoutValue": 1000 //请求超时时间(毫秒)

      }

    }

  ],

  "GlobalConfiguration": {

    "BaseUrl": "http://localhost:5000"

  }

}

 

说明:上面配置是在请求超过1秒将会超时,发生三次超时后保持60秒熔断。

3. 修改Startup,添加Polly服务。

   public void ConfigureServices(IServiceCollection services)

        {

services.AddControllers();

services

                .AddOcelot()

                .AddConsul()

                .AddPolly();                 }

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime, ConsulOption consulOption)

        {

            .........

app.UseEndpoints(endpoints =>

            {

                endpoints.MapGet("/", async context =>

                {

                    await context.Response.WriteAsync("我是Ocelot网关!");

                });

            });

            // 注册

             app.UseOcelot().Wait();

            ...........

        }

 

3.3 启动Consul

这里是Win10系统,下载相应的Consul后,在文件夹下创建启动BAT文件用于启动Consul,双击启动。

3.4 服务发现

启动Yak.Ocelot.Api”项目,查看到服务已经注册到Consul中。

 

 

 

 

 

 

3.5 调试

1. 启动网关服务

运行网关项目Yak.Ocelot.Gateway”。

 

 

 

2. 启动接口服务

运行网关项目Yak.Ocelot.Api”,通过接口自己的端口http://localhost:5000/Weather访问WebAPI天气接口服务。

 

 

 

 

 

3. 通过网关访问接口服务

通过网关地址访问WebAPI天气接口服务

 

 

 

 

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

 

 

 

 

访问三次后直接熔断了,在访问接口就没Log打印出了,除非超过所设置熔断时间60秒后再访问。

 

 

 

 

 

总结

通过上面项目实践,我们了解到了Ocelot网关结合Polly就可以实现访问熔断,在三次访问接口都超时时,直接熔断了60秒。

鸣谢

https://www.cnblogs.com/edisonchou/p/9159644.html

源码

https://github.com/yandaniugithub/NETCore/tree/main/Yak.Ocelot.Demo

 

 

posted @ 2022-04-07 17:09  春光牛牛  阅读(329)  评论(0编辑  收藏  举报