微服务引擎MSE

限流limit-count插件

2025-05-27 07:54:55

描述

在指定的时间范围内,限制总的请求个数。并且在 HTTP 响应头中返回剩余可以请求的个数,支持本地限流和全局限流两种限流方式。

当前配置模版中配置了三种模版可供选择:

l  基础配置为本地限流策略,云原生网关每个节点单独计算限流次数。整个集群的限流计数为配置的count * 节点数。

l  Redis单节点配置和Redis集群配置两种配置都是云原生网关的全局限流配置,此时count配置为集群全局限流计数。

作用范围

该插件即可用于全局插件,也可用于路由级插件。全局插件配置的优先级高于路由级插件配置,当同时在某一路由上配置了limit-count的全局插件和路由级插件时,以全局插件配置中设置的属性值为准。

属性

名称

类型

必选项

默认值

有效值

描述

count

integer

必须


count > 0

指定时间窗口内的请求数量阈值

time_window

integer

必须


time_window > 0

时间窗口的大小(以秒为单位),超过这个时间就会重置

key_type

string

可选

"var"

["var", "var_combination",   "constant"]

key 的类型

key

string

可选

"remote_addr"


用来做请求计数的依据,详情参见key的使用小节。如果 key 的值为空,$remote_addr 会被作为默认 key。

rejected_code

integer

可选

503

[200,...,599]

当请求超过阈值被拒绝时,返回的 HTTP 状态码

rejected_msg

string

可选


非空

当请求超过阈值被拒绝时,返回的响应体。

allow_degradation

boolean

可选

false


当限流插件功能临时不可用时(例如,Redis 超时)是否允许请求继续。当值设置为 true 时则自动允许请求继续,默认值是 false。

show_limit_quota_header

boolean

可选

true


是否在响应头中显示   X-RateLimit-LimitX-RateLimit-Remaining (限制的总请求数和剩余还可以发送的请求数),默认值是 true。

group

string

可选


非空

配置同样的 group 的 Route 将共享同样的限流计数器

redis_host

string

当policy为redis时必填



当使用 redis 限速策略时,该属性是 Redis 服务节点的地址。

redis_port

integer

可选

6379

[1,...]

当使用 redis 限速策略时,该属性是   Redis 服务节点的端口

redis_password

string

可选



当使用 redis 或者 redis-cluster 限速策略时,该属性是 Redis 服务节点的密码

redis_timeout

integer

可选

1000

[1,...]

当使用 redis 或者 redis-cluster 限速策略时,该属性是 Redis 服务节点以毫秒为单位的超时时间

redis_cluster_nodes

array

当 policy 为 redis-cluster 时必填



当使用 redis-cluster 限速策略时,该属性是 Redis 集群服务节点的地址列表(至少需要两个地址)。

redis_cluster_name

string

当 policy 为 redis-cluster 时必填



当使用 redis-cluster 限速策略时,该属性是 Redis 集群服务节点的名称。

 

count说明

l  当使用本地计数策略,即policy设置为local时,count数值为每个网关节点的限流计数。整个集群的限流计数=count * 节点数;

l  当使用redis时,即policy设置为redis或redis-cluster时,count记录在redis中,表示整个集群的全局限流计数。

key的使用说明

用来做请求计数的有效值。

key的类型

key的取值类型使用key_type标识,key_type支持三种值:"var", "var_combination", "constant"key_type为"constant"时,那么 key 会被当作常量。key_type为"var"时 key 会被当作变量名称。

如果 key_type 为 "var_combination",那么 key 会当作变量组。比如如果设置 "remote_addr consumer_name" 作为 key,那么插件会同时受 remote_addr 和 consumer_name 两个变量的约束。

例如,可以使用主机名(或服务器区域)作为关键字,以便限制每个主机名规定时间内的请求次数。我们也可以使用客户端地址作为关键字,这样我们就可以避免单个客户端规定时间内多次的连接我们的服务。

当前接受的 key如下:

key

key_type为var时填写

key_type为var_combination时填写

"remote_addr"(客户端 IP 地址)

remote_addr

$remote_addr

"server_addr"(服务端 IP 地址)

server_addr

$server_addr

请求头中的值"X-Forwarded-For"

http_x_forwarded_For

$http_x_forwarded_For

请求头中的值"X-Real-IP"

http_x_real_ip

$http_x_real_ip

"consumer_name"(consumer 的 username)

consumer_name

$consumer_name

"service_id"

service_id

$service_id

如何使用

在配置窗口页以YAML格式填写

配置示例

基于请求上下文和自定义表达式的限流配置示例

通过将key_type设置为var或var_combination来支持基于请求上下文和自定义表达式的限流。支持各种请求参数和内置的nginx变量,以及变量组合。

常用参数示例:

remote_addr :客户端ip

consumer_name:消费者名称;其他nginx变量也支持

arg_name: url参数,name表示参数名称

http_name: 请求header参数

cookie_name: 请求的cookie参数

 

下面是一个示例,开启了 limit count 插件,并设置 key_typevar,key设置为remote_addr表示基于客户端ip进行请求限流:

count: 2

 time_window: 60

 rejected_code: 503

 key_type: "var"

 key: "remote_addr"

下面是一个示例,开启了 limit count 插件,并设置 key_typevar,key设置为arg_userId,可对不同的url参数userId分别进行限流计数:

"allow_degradation": false,

 "count": 20,

 "key": "arg_userId",

 "key_type": "var",

 "policy": "local",

 "rejected_code": 503,

 "show_limit_quota_header": true,

 "time_window": 30

下面是一个示例,开启了 limit count 插件,并设置 key_typevar_combination, key值设置为$consumer_name $remote_addr表示同时基于消费者名称和客户端ip进行限流计数。

count: 2

 time_window: 60

 rejected_code: 503

 key_type: "var_combination"

 key: "$consumer_name $remote_addr"

下面是一个示例,开启了 limit count 插件,并设置 key_typeconstant

基于常量的限流配置示例

通过设置 key_typeconstantkey 的值将会直接作为常量来处理

count: 2

 time_window: 60

 rejected_code: 503

 key_type: "constant"

 key: "remote_addr"

全局限流配置示例

在页面上选择Redis单节点配置或者Redis集群配置,并设置redis相关参数即可开启全局限流配置。

Redis可选择通过平台开通redis实例,或者自行部署,并在配置中填入连接信息即可。

 

配置示例:

# 时间窗口内的请求数量阈值

# [必填]特别地,当使用redis时,表示整个集群的请求计数。

count: 30

# [必填]时间窗口的大小(以秒为单位)

time_window: 60

# [可选]请求超过阈值被拒绝时,返回的 HTTP 状态码

rejected_code: 503

# [可选]key 的类型

key_type: "var"

# [可选]用来做请求计数的依据

key: "remote_addr"

# [可选]当设置rejected_msg时,非空。默认可不填

# rejected_msg: "Requests are too frequent, please try again later."

# [可选]当限流插件功能临时不可用时(例如,Redis 超时)是否允许请求继续。当值设置为 true 时则自动允许请求继续,默认值是 false

allow_degradation: false

# [可选]是否在响应头中显示 X-RateLimit-Limit 和 X-RateLimit-Remaining (限制的总请求数和剩余还可以发送的请求数),默认值是 true

show_limit_quota_header: true

# [必填]速率限制策略,使用单节点redis

policy: "redis"

# [必填]redis服务地址

redis_host: "127.0.0.1"

# [可选]redis服务端口

redis_port: 6379

# [可选]redis服务密码

redis_password: "password"

# [可选]redis服务的datebase

redis_database: 1

# [可选]redis服务的超时时间,单位毫秒

redis_timeout: 1000

 

 

停用/启用

在配置页面设置生效开关

验证插件

上述配置限制了 60 秒内只能访问 2 次,前两次访问都会正常访问:

 curl -i http://127.0.0.1:9080/index.html

响应头里面包含了 X-RateLimit-LimitX-RateLimit-Remaining,他们的含义分别是限制的总请求数和剩余还可以发送的请求数:

HTTP/1.1 200 OK

 Content-Type: text/html

 Content-Length: 13175

 Connection: keep-alive

 X-RateLimit-Limit: 2

 X-RateLimit-Remaining: 0

 Server: APISIX web server

当你第三次访问的时候,就会收到包含 503 返回码的响应头:

HTTP/1.1 503 Service Temporarily Unavailable

 Content-Type: text/html

 Content-Length: 194

 Connection: keep-alive

 Server: APISIX web server

 

 <html>

 <head><title>503 Service Temporarily Unavailable</title></head>

 <body>

 <center><h1>503 Service Temporarily Unavailable</h1></center>

 <hr><center>openresty</center>

 </body>

 </html>

同时,如果你设置了属性 rejected_msg 的值为 "Requests are too frequent, please try again later." ,当你第三次访问的时候,就会收到如下的响应体:

HTTP/1.1 503 Service Temporarily Unavailable

 Content-Type: text/html

 Content-Length: 194

 Connection: keep-alive

 Server: APISIX web server

 

 {"error_msg":"Requests are too frequent, please try again later."}

这就表示 limit count 插件生效了。


Gc27mfHH6Z03