【Part 4】在ASP.NET Core中使用Ocelot构建API网关 - Rate Limiting
Introduction
回顾这一系列文章,我们讨论了如何用ASP.NET Core构建API网关。
在这篇文章中,我们将讨论Ocelot的路由限制模板。
如果你想看系列文章,请访问以下链接:
-
【Part 1】 在ASP.NET Core中使用Ocelot构建API网关 - Basic
-
【Part 2】在ASP.NET Core中使用Ocelot构建API网关 - Authentication
-
【Part 3】在ASP.NET Core中使用Ocelot构建API网关 - Logging
What is Rate Limiting?
Wikipedia告诉我们,路由限制用于控制网络接口控制器发送或接收的流量速率,并用于防止DoS攻击。
大多数api都受到每秒(或一分钟,或另一个较短的时间段)可以进行多少次调用的限制,以保护服务器不受过载的影响,并为许多客户端维护高质量的服务。
现在,让我们看看如何使用Ocelot去实现路由限制。
我们将使用Ocelot的3.1.5版本去创建示例。
Preparation
我们需要创建两个项目,并确保它们能够正常运行。
像往常一样,首先创建两个项目:
Project Name | Project Type | Description |
APIGateway | ASP.NET Core Empty | This is the entry of this demo. |
APIServices | ASP.NET Core Web API | This is an API Service that provides some services. |
添加基本configuration.json文件到APIGateway项目。
- {
- "ReRoutes": [
- {
- "DownstreamPathTemplate": "/api/values",
- "DownstreamScheme": "http",
- "DownstreamHostAndPorts": [
- {
- "Host": "localhost",
- "Port": 9001
- }
- ],
- "UpstreamPathTemplate": "/customers",
- "UpstreamHttpMethod": [ "Get" ]
- },
- {
- "DownstreamPathTemplate": "/api/values/{id}",
- "DownstreamScheme": "http",
- "DownstreamHostAndPorts": [
- {
- "Host": "localhost",
- "Port": 9001
- }
- ],
- "UpstreamPathTemplate": "/customers/{id}",
- "UpstreamHttpMethod": [ "Get" ]
- }
- ],
- "GlobalConfiguration": {
- "RequestIdKey": "OcRequestId",
- "AdministrationPath": "/administration"
- }
- }
Note
请注意节点下的DownstreamHostAndPorts。在以前的Ocelot版本中,这个节点使用DownstreamHost和DownstreamPort来替换。
运行这两个项目,您可能会得到以下结果。
这意味着我们的准备工作已经完成了。现在,我们将把路由限制的配置添加到http://localhost:9000/customers。
Add Rate Limiting In configuration.json
我们只需要添加一个名为RateLimitOptions的节点。下面的代码展示了基本的配置。
- {
- "DownstreamPathTemplate": "/api/values",
- "DownstreamScheme": "http",
- "DownstreamHostAndPorts": [
- {
- "Host": "localhost",
- "Port": 9001
- }
- ],
- "UpstreamPathTemplate": "/customers",
- "UpstreamHttpMethod": [ "Get" ],
- "RateLimitOptions": {
- "ClientWhitelist": [],
- "EnableRateLimiting": true,
- "Period": "1s",
- "PeriodTimespan": 1,
- "Limit": 1
- }
- }
- //others.....
让我们看一下RateLimitOptions节点的解释。
- ClientWhitelist
这是一个包含客户端白名单的数组。这意味着这个数组中的客户机不会受到路由限制的影响。使用方式:在客户端请求头中添加key:ClientId,value为网关配置白名单。
- EnableRateLimiting
是否启用路由限制。
- Period
指定周期,如1s、5m、1h、1d等。
- PeriodTimespan
指定我们可以在一定秒数后重试。
- Limit
指定客户端在定义的时间段内可以发出的最大请求数。
在上面的配置中,我们每秒只能访问一次。
让我们看看添加路由限制后的结果:
正如您所看到的,它告诉我们API调用配额已经超出!最大允许1个1秒。您还可以看到以下截图。
响应状态码是429(请求太多)。而在响应标头中,它包含了retry-after,这意味着我们应该在1秒后重试一次。
Some More Configuration
我们已经完成了前一步的路由限制。
然而,你可能有三个问题:
- 我们可以替换默认提示吗?
- 我们可以移除速率限制的响应头吗?
- 我们可以更改响应状态代码吗?
所有这些问题的答案都是肯定的。
如果我们想要更改这些设置,我们需要添加一些全局配置。
- "GlobalConfiguration": {
- "RequestIdKey": "OcRequestId",
- "AdministrationPath": "/administration",
- "RateLimitOptions": {
- "DisableRateLimitHeaders": false,
- "QuotaExceededMessage": "Customize Tips!",
- "HttpStatusCode": 999
- }
- }
让我们来看看GlobalConfiguration中的RateLimitOptions节点!
- DisableRateLimitHeaders
指定是否禁用限制返回标头。
- QuotaExceededMessage
指定路由限制时的返回消息提示。
- HttpStatusCode
指定在发生路由限制时返回的HTTP状态码。
在添加这些配置之后,我们可以得到如下结果。
Summary
本文介绍了在Ocelot中如何使用速率限制模块。
希望能够帮到您。