Image

ASP.NET Core设置Ocelot网关限流_实用技巧

首页 / 新闻资讯 / 正文

1.限流(Rate Limiting)

很多时候为了防止DoS攻击,我们会通过限流方式对上游请求进行限制,以保护下游服务不会负荷过载,为客户端提供高质量的资源服务。在Ocelot限流项目示例中,通过APIGateway项目路由RateLimitOptions选项可以配置限流。对解决方案的示例APIServices项目Get方法进行限流,文件配置具体代码如下:

{    "Routes": [      {        "DownstreamPathTemplate": "/api/values",        "DownstreamScheme": "http",        "DownstreamHostAndPorts": [          {            "Host": "localhost",            "Port": 9001          }        ],        "UpstreamPathTemplate": "/customers",        "UpstreamHttpMethod": [ "Get" ],        "RateLimitOptions": {          //客户端白名单。名单中的客户端不会被限流。          "ClientWhitelist": [],          //是否启用限流。          "EnableRateLimiting": true,          //限流时间(1s,5m,1h,1d)。在限流时间内限制请求数,需要等PeriodTimespan时间过去了,才能再次发起请求。          "Period": "1s",          //限流时间间隔,限流后多少秒后才可以再次发起请求。          "PeriodTimespan": 3,          //限制请求数。          "Limit": 1        }      }    ],    //全局配置,所有下游服务都执行如下限流配置    "GlobalConfiguration": {      "RequestIdKey": "OcRequestId",      "AdministrationPath": "/administration",      "RateLimitOptions": {        //是否禁用X-Rate-Limit和Retry-After标头。        "DisableRateLimitHeaders": false,        //限流返回的消息。        "QuotaExceededMessage": "Customize Tips!"      }    }  }

下面来介绍下RateLimitOptions选项几个参数:

  • ClientWhitelist:客户端白名单。名单中的客户端不会被限流。
  • EnableRateLimiting:是否启用限流。
  • Period:限流时间(1s,5m,1h,1d)。在限流时间内限制请求数,需要等PeriodTimespan时间过去了,才能再次发起请求。
  • PeriodTimespan:限流时间间隔,限流后多少秒后才可以再次发起请求。
  • Limit:限制请求数。
  • DisableRateLimitHeaders:是否禁用X-Rate-Limit和Retry-After标头。
  • QuotaExceededMessage:限流返回的消息。
  • HttpStatusCode:限流时候,指定返回的HTTP状态代码。
  • ClientIdHeader:允许您指定应用于标识客户端的标头。默认情况下为“ClientId”。

2.项目演示

2.1APIGateway项目

添加Ocelot服务注入和Logging信息输出:

public class Startup  {      public Startup(IWebHostEnvironment env)      {          var builder = new Microsoft.Extensions.Configuration.ConfigurationBuilder();          builder.SetBasePath(env.ContentRootPath)                  .AddJsonFile("appsettings.json")                  //add configuration.json                  .AddJsonFile("configuration.json", optional: false, reloadOnChange: true)                  .AddEnvironmentVariables();            Configuration = builder.Build();      }        public IConfigurationRoot Configuration { get; }        public void ConfigureServices(IServiceCollection services)      {          //输出Logging信息;          services.AddLogging(logging =>          {              logging.AddConsole();              logging.AddDebug();          });          //添加Ocelot服务;          services.AddOcelot(Configuration);      }        public void Configure(IApplicationBuilder app)      {          //使用Ocelot;          app.UseOcelot().Wait();      }  }

2.2APIServices项目

项目添加一个Get方法,对应APIGateway项目的路由上下游配置,具体代码如下:

[Route("api/[controller]")]  public class ValuesController : Controller  {      // GET api/values      [HttpGet]      public IEnumerable<string> Get()      {          return new string[] { "value1", "value2" };      }  }

2.3项目运行

输入dotnet run --project 项目路径\项目文件.csproj把两个项目启动起来,通过在浏览器不断刷新上游服务地址,会看到如下信息:

根据上述信息可以知道在1秒时间内,如果请求数超过路由配置限制数,那么Ocelot网关就会直接返回429状态码和全局给客户端,不会再转发到对应下游服务方法去,防止了客户端恶意攻击,保证了下游服务不会负荷过载!

Loading...