【Part 4】在ASP.NET Core中使用Ocelot构建API网关 - Rate Limiting

Introduction

回顾这一系列文章,我们讨论了如何用ASP.NET Core构建API网关。

在这篇文章中,我们将讨论Ocelot的路由限制模板。

如果你想看系列文章,请访问以下链接:

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项目。

 
  1. {  
  2.     "ReRoutes": [  
  3.         {  
  4.             "DownstreamPathTemplate": "/api/values",  
  5.             "DownstreamScheme": "http",  
  6.             "DownstreamHostAndPorts": [  
  7.                 {  
  8.                     "Host": "localhost",  
  9.                     "Port": 9001  
  10.                 }  
  11.             ],  
  12.             "UpstreamPathTemplate": "/customers",  
  13.             "UpstreamHttpMethod": [ "Get" ]  
  14.         },  
  15.         {  
  16.             "DownstreamPathTemplate": "/api/values/{id}",  
  17.             "DownstreamScheme": "http",  
  18.             "DownstreamHostAndPorts": [  
  19.                 {  
  20.                     "Host": "localhost",  
  21.                     "Port": 9001  
  22.                 }  
  23.             ],  
  24.             "UpstreamPathTemplate": "/customers/{id}",  
  25.             "UpstreamHttpMethod": [ "Get" ]  
  26.         }  
  27.     ],  
  28.     "GlobalConfiguration": {  
  29.         "RequestIdKey": "OcRequestId",  
  30.         "AdministrationPath": "/administration"  
  31.     }  
  32. }  

Note 

请注意节点下的DownstreamHostAndPorts。在以前的Ocelot版本中,这个节点使用DownstreamHost和DownstreamPort来替换。

运行这两个项目,您可能会得到以下结果。

ASP.NET Core   

这意味着我们的准备工作已经完成了。现在,我们将把路由限制的配置添加到http://localhost:9000/customers。

Add Rate Limiting In configuration.json

我们只需要添加一个名为RateLimitOptions的节点。下面的代码展示了基本的配置。

 
  1. {  
  2.     "DownstreamPathTemplate": "/api/values",  
  3.     "DownstreamScheme": "http",  
  4.     "DownstreamHostAndPorts": [  
  5.         {  
  6.             "Host": "localhost",  
  7.             "Port": 9001  
  8.         }  
  9.     ],  
  10.     "UpstreamPathTemplate": "/customers",  
  11.     "UpstreamHttpMethod": [ "Get" ],  
  12.     "RateLimitOptions": {  
  13.         "ClientWhitelist": [],  
  14.         "EnableRateLimiting": true,  
  15.         "Period": "1s",  
  16.         "PeriodTimespan": 1,  
  17.         "Limit": 1  
  18.     }  
  19. }  
  20. //others.....  

让我们看一下RateLimitOptions节点的解释。

  1. ClientWhitelist
    这是一个包含客户端白名单的数组。这意味着这个数组中的客户机不会受到路由限制的影响。使用方式:在客户端请求头中添加key:ClientId,value为网关配置白名单。
  1. EnableRateLimiting
    是否启用路由限制。
  1. Period
    指定周期,如1s、5m、1h、1d等。
  1. PeriodTimespan
    指定我们可以在一定秒数后重试。
  1. Limit
    指定客户端在定义的时间段内可以发出的最大请求数。

在上面的配置中,我们每秒只能访问一次。

让我们看看添加路由限制后的结果:

正如您所看到的,它告诉我们API调用配额已经超出!最大允许1个1秒。您还可以看到以下截图。

ASP.NET Core

响应状态码是429(请求太多)。而在响应标头中,它包含了retry-after,这意味着我们应该在1秒后重试一次。

Some More Configuration

我们已经完成了前一步的路由限制。

然而,你可能有三个问题:

  1. 我们可以替换默认提示吗?
  2. 我们可以移除速率限制的响应头吗?
  3. 我们可以更改响应状态代码吗?

所有这些问题的答案都是肯定的。

如果我们想要更改这些设置,我们需要添加一些全局配置。

 

 
  1. "GlobalConfiguration": {  
  2.     "RequestIdKey": "OcRequestId",  
  3.     "AdministrationPath": "/administration",  
  4.     "RateLimitOptions": {  
  5.       "DisableRateLimitHeaders": false,  
  6.       "QuotaExceededMessage": "Customize Tips!",  
  7.       "HttpStatusCode": 999  
  8.     }  
  9.   }  

让我们来看看GlobalConfiguration中的RateLimitOptions节点!

  1. DisableRateLimitHeaders
    指定是否禁用限制返回标头。
  1. QuotaExceededMessage
    指定路由限制时的返回消息提示。
  1. HttpStatusCode
    指定在发生路由限制时返回的HTTP状态码。

在添加这些配置之后,我们可以得到如下结果。

ASP.NET Core

 

Summary

本文介绍了在Ocelot中如何使用速率限制模块。

希望能够帮到您。

 

原文地址:https://www.c-sharpcorner.com/article/building-api-gateway-using-ocelot-in-asp-net-core-rate-limiting-part-four

posted @ 2020-04-20 16:03  ddockerman  阅读(292)  评论(1编辑  收藏  举报