简介

  

  

  

         前几篇文章我们陆续介绍如何用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替代。

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

  我们的准备工作完成了,接下来我们对配置流量限制。

在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.....  

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

 

 

  我们可以看见,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:当流量限制后返回的状态码

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

 

  源码在此

  网盘链接:https://pan.baidu.com/s/17sqfgcyx8yehrl_lwkaula
  提取码:p3d0

总结

         null