【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


__EOF__

本文作者ddockerman
本文链接https://www.cnblogs.com/jiangyihz/p/12738374.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ddockerman  阅读(296)  评论(1编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示