Ocelot限流(Rate Limiting)
Ocelot限流(Rate Limiting)
前言
通过上节介绍“Ocelot快速实践”后,了解了Ocelot网关,作为网关,要有很多功能才能满足要求,如访问量比较大时怎么限制呢?这节介绍限流(Rate Limiting)。
环境:
VS2022 +.NET5.0 + Ocelot 17.0.0.0
1 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”。
2 项目演示
在上节“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 验证限流
- 运行网关项目“Yak.Ocelot.Gateway”。
2. 通过网关访问天气预报。
3. 验证限流
一分钟内第6次访问接口“http://localhost:5000/weather”时,被限制访问了。
2.4 全局配置
- 修改网关全局配置,配置如下:
"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。
3 总结
通过咋网关上进行配置,很好地达到了限制访问量的目的,Ocelot确实很方便。
4 鸣谢
https://www.zhangshengrong.com/p/Ap1Ze8z7X0/
5 源码
https://github.com/yandaniugithub/NETCore