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


    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

  • 相关阅读:
    安装、升级pip,但是python -m pip install --upgrade pip报错
    架构即未来阅读笔记3
    第十二周学习总结
    《大型网站技术架构:核心原理与案分析》阅读笔记02
    2021寒假(12)
    2021寒假(10)
    Spark简介
    《大型网站技术架构:核心原理与案分析》阅读笔记01
    2021寒假(9)
    2021寒假(8)
  • 原文地址:https://www.cnblogs.com/jiangyihz/p/12738374.html
Copyright © 2020-2023  润新知