在Linux環境下使用Swagger(通常指的是OpenAPI)實現API限流可以通過多種方式來完成。以下是一些常見的方法:
Nginx是一個高性能的HTTP和反向代理服務器,可以用來限制API請求速率。以下是一個基本的Nginx限流配置示例:
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
listen 80;
location /api/ {
limit_req zone=mylimit burst=5 nodelay;
proxy_pass http://backend;
}
}
}
在這個配置中,limit_req_zone
定義了一個限流區域,$binary_remote_addr
表示根據客戶端IP地址進行限流,zone=mylimit:10m
定義了存儲限流信息的共享內存區域大小為10MB,rate=1r/s
表示每秒允許1個請求。limit_req
指令應用限流規則,burst=5
允許突發5個請求,nodelay
表示不延遲處理這些突發請求。
HAProxy是一個可靠、高性能的TCP/HTTP負載均衡器,也可以用來限制API請求速率。以下是一個基本的HAProxy限流配置示例:
frontend http_front
bind *:80
default_backend http_back
backend http_back
balance roundrobin
server server1 192.168.1.1:80 check
server server2 192.168.1.2:80 check
acl rate_limit src 192.168.1.0/24
http-request track-sc0 src
http-request deny if { sc_http_req_rate(0) gt 1 }
在這個配置中,acl rate_limit src 192.168.1.0/24
定義了一個ACL規則,限制來自特定IP范圍的請求。http-request track-sc0 src
跟蹤每個源IP的請求計數。http-request deny if { sc_http_req_rate(0) gt 1 }
如果請求速率超過每秒1個請求,則拒絕請求。
Redis是一個高性能的內存數據庫,結合Lua腳本可以實現更復雜的限流邏輯。以下是一個使用Lua腳本進行限流的示例:
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local expire = tonumber(ARGV[2])
local current = tonumber(redis.call('GET', key) or '0')
if current + 1 > limit then
return 0
else
redis.call('INCR', key)
if expire then
redis.call('EXPIRE', key, expire)
end
return 1
end
使用示例:
redis-cli --eval rate_limit.lua ,api_key 10 60
在這個示例中,api_key
是API的標識符,10
是每分鐘允許的最大請求數,60
是限速的時間窗口(秒)。
如果你使用的是Spring Cloud Gateway,可以利用其內置的限流功能。以下是一個基本的Spring Cloud Gateway限流配置示例:
spring:
cloud:
gateway:
routes:
- id: my_route
uri: lb://my-service
predicates:
- Path=/api/**
filters:
- name: RequestRateLimiter
args:
key-resolver: "#{@userKeyResolver}"
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstCapacity: 5
在這個配置中,RequestRateLimiter
過濾器用于限流。key-resolver
指定如何解析請求的唯一標識符(例如用戶ID)。replenishRate
表示每秒允許的請求數,burstCapacity
表示允許的突發請求數。
以上方法各有優缺點,選擇哪種方法取決于你的具體需求和環境。Nginx和HAProxy適合大規模部署,Redis和Lua腳本適合需要復雜邏輯的場景,而Spring Cloud Gateway則適合微服務架構。