限流

前几篇文章我们陆续介绍如何用ASP.NET Core 创建API网关。

这次我们讨论Ocelot的流量限制模块。

什么是流量控制(Rate Limiting)高端词 限流熔断

维基百科定义流量控制是网络接口控制器限制发送接收的流量以防止DoS攻击。

多数APIs每秒(每份,或者其他短时间周期)被调用的次数是被限制的,以便保护服务以免过载或者为多数客户端提供高质量的服务。

现在我们看看Ocelot是如何实现速度限制的。

这里我用Ocelot 3.1.5创建一个示例。

准备

我们创建两个项目并保证能运行。

和往常一样,先创建两个项目。

项目名称

项目类型

描述

APIGateway

ASP.NET Core Empty

示例的入口

APIServices

ASP.NET Core Web API

API服务提供一些服务

给APIGateway项目添加基本configuration.json文件

{  
    "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"  
    }  
}  

注意

需要注意节点DownstreamHostAndPorts,之前的Ocelot版本,该节点被DownstreamHost和DownstreamPort替代。

启动这两个项目,你会看到下面的结果。


我们的准备工作完成了,接下来我们对http://localhost:9000/customers配置流量限制。

在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节点。

  1. ClientWhitelist
    这个值包含了客户端的白名单。在白名单里的客户端不受限流影响。
  1. EnableRateLimiting
    这个值控制是否启用终结点速率限制。
  1. Period
    这个值是周期, 比如 1s, 5m, 1h,1d等等。
  1. PeriodTimespan
    这个值表示我们可以在多少秒数后重试。
  1. Limit
    这个值表示客户端在定义的时间段内可以发出的最大请求数。

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

好了。启动项目看看流量限制效果。

我们可以看见,API请求超出配额,1秒只允许请求1次。当我们的请求在1秒中超过一次。你可以看到下图的情况。


返回状态码为429(请求太多),在返回头(Response Header)包含Retry-After属性,这个属性意味我们1秒后再尝试请求。

更多配置

在上面我们已经实现了速度限制。

可能你会有下面的疑问。

  1. 我们可以替换默认的提示吗?(超过限制返回的提示)
  2. 我们能移除返回头的流量限制标记吗?
  3. 我们能修改超限的返回状态码吗?

当然可以。

只需要添加一些全局配置即可。

"GlobalConfiguration": {  
    "RequestIdKey": "OcRequestId",  
    "AdministrationPath": "/administration",  
    "RateLimitOptions": {  
      "DisableRateLimitHeaders": false,  
      "QuotaExceededMessage": "Customize Tips!",  
      "HttpStatusCode": 999  
    }  
  }  

我们具体介绍一下GlobalConfiguration的RateLimitOptions节点。

  1. DisableRateLimitHeaders:是否显示X-Rate-Limit和Retry-After头
  2. QuotaExceededMessage:超限提示信息
  3. HttpStatusCode:当流量限制后返回的状态码

添加上面的配置以后,我们看下图的效果。



我在github的源码。

总结

本文介绍了如何在Oclet中使用限流模块,希望能够对你有所帮助。

版权声明: 本文为智客工坊「楠木大叔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

results matching ""

    No results matching ""