Ocelot限流(Rate Limiting)


Ocelot限流(Rate Limiting

 

前言

通过上节介绍Ocelot快速实践”后,了解了Ocelot网关,作为网关,要有很多功能才能满足要求,如访问量比较大时怎么限制呢?这节介绍限流(Rate Limiting)。

环境:

VS2022 +.NET5.0 + Ocelot 17.0.0.0

Ocelot限流(Rate Limiting

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

1.1 RateLimitOptions选项几个参数

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

项目演示

在上节Ocelot快速实践”项目基础上进行改造,在一分钟只容许5次访问,项目机构。

2.1 运行接口服务

运行接口服务项目Yak.Ocelot.Api”。

2.2 修改Ocelot网关配置

 配置如下:

  "Routes": [

    {

      "DownstreamPathTemplate": "/WeatherForecast",

      "DownstreamScheme": "http",

      "DownstreamHostAndPorts": [

        {

          "Host": "localhost",

          "Port": 6000

        }

      ],

      "UpstreamPathTemplate": "/Weather",

      "UpstreamHttpMethod": [ "Get" ],

      "RateLimitOptions": {

        "ClientWhitelist": [ "admin" ], //客户端白名单。名单中的客户端不会被限流。

        "EnableRateLimiting": true, // 是否启用限流

        "Period": "1m", // 限流时间(1s,5m,1h,1d)。在限流时间内限制请求数,需要等PeriodTimespan时间过去了,才能再次发起请求。

        "PeriodTimespan": 15, // 多少秒之后客户端可以重试

        "Limit": 5 // 在统计时间段内允许的最大请求数量

      }

    }

  ],

  "GlobalConfiguration": {

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

  }

2.3 验证限流

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

2. 通过网关访问天气预报。

3. 验证限流

一分钟内第6次访问接口“http://localhost:5000/weather”时,被限制访问了。

2.4 全局配置

  1. 修改网关全局配置,配置如下:

  "Routes": [

    {

      "DownstreamPathTemplate": "/WeatherForecast",

      "DownstreamScheme": "http",

      "DownstreamHostAndPorts": [

        {

          "Host": "localhost",

          "Port": 6000

        }

      ],

      "UpstreamPathTemplate": "/Weather",

      "UpstreamHttpMethod": [ "Get" ],

      "RateLimitOptions": {

        "ClientWhitelist": [ "admin" ], //客户端白名单。名单中的客户端不会被限流。

        "EnableRateLimiting": true, // 是否启用限流

        "Period": "1m", // 限流时间(1s,5m,1h,1d)。在限流时间内限制请求数,需要等PeriodTimespan时间过去了,才能再次发起请求。

        "PeriodTimespan": 15, // 多少秒之后客户端可以重试

        "Limit": 5 // 在统计时间段内允许的最大请求数量

      }

    }

  ],

  "GlobalConfiguration": {

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

    "RateLimitOptions": {

      "DisableRateLimitHeaders": false, // Http头  X-Rate-Limit 和 Retry-After 是否禁用

      "QuotaExceededMessage": "Interface access is frequent", // 当请求过载被截断时返回的消息

      "HttpStatusCode": 999, // 当请求过载被截断时返回的http status

      "ClientIdHeader": "client_id" // 用来识别客户端的请求头,默认是 ClientId

    }

  }

2.再次运行网关“Yak.Ocelot.Gateway”项目,接口访问第6次时显示如下。1分钟之内超过5次,便会被截断,直接返回截断后的消息提示,HttpStatusCode:999

总结

通过咋网关上进行配置,很好地达到了限制访问量的目的,Ocelot确实很方便。

鸣谢

https://www.zhangshengrong.com/p/Ap1Ze8z7X0/

源码

https://github.com/yandaniugithub/NETCore