概述
- 目标:以统一指标与策略,在不同网关实现速率限制与配额,防止滥用与保证公平分配。
- 范畴:每秒请求限流、突发容量、每日配额计数、基于凭证/客户端维度的限流键。
核心与实战
- Kong(decK声明式):
```
_format_version: "3.0"
services:
- name: api
url: http://api:8080
routes:
- name: api-v1
service: api
paths: ["/v1"]
plugins:
- name: rate-limiting
config:
second: 100
policy: local
limit_by: consumer
fault_tolerant: true
- name: request-transformer
config:
add:
headers:
- "X-Rate-Key:consumer"
```
- Envoy(本地限流过滤器):
```
http_filters:
- name: envoy.filters.http.local_ratelimit
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit
stat_prefix: http_local_rate_limiter
token_bucket:
max_tokens: 100
tokens_per_fill: 100
fill_interval: 1s
filter_enabled:
runtime_key: local_rate_limit_enabled
default_value: true
```
- APISIX(limit-count与limit-req):
```
{
"uri": "/v1/*",
"plugins": {
"limit-count": {
"count": 1000,
"time_window": 60,
"key": "consumer_name",
"policy": "local"
},
"limit-req": {
"rate": 100,
"burst": 50,
"key": "consumer_name"
}
}
}
```
示例
- Kong应用配置:
```
deck sync -s kong.yaml
```
- Envoy加载配置:
```
envoy -c envoy.yaml --drain-time-s 2
```
- APISIX路由创建:
```
curl -X PUT http://apisix:9080/apisix/admin/routes/1 -H 'X-API-KEY: xxxxx' -d @route.json
```
验证与监控
- 观测命中率与拒绝比例:
- Kong:Admin API 或 Prometheus `kong_http_status`。
- Envoy:`listener.downstream_rq_1xx/2xx/4xx`与`token_bucket`相关指标。
- APISIX:`limit-count`与`limit-req`插件指标。
- 键维度与公平性:
- 校验限流键是否按`consumer`或`client_id`生效,避免所有流量共享单键造成不公平。
常见误区
- 只做全局限流而缺乏维度键,导致热点客户端吞噬配额;应按消费者或凭证维度限流。
- 本地内存策略在多节点集群下不一致;需考虑Redis/一致性哈希或集中式限流服务。
- 忽视突发容量与响应头暴露,客户端无法自适应;应暴露`X-RateLimit-*`头并提供重试策略。
结语
- 不同网关都能实现稳定的限流与配额,关键在统一指标、维度键与监控验证,以保障业务公平与高可用。

发表评论 取消回复