在Linux环境中,使用Swagger(现在通常指的是OpenAPI)实现API限流可以通过多种方式来完成。以下是一些常见的方法:
1. 使用Nginx进行限流
Nginx是一个高性能的HTTP和反向代理服务器,也可以用来限制API请求速率。
配置示例:
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
表示不对突发请求进行延迟处理。
2. 使用HAProxy进行限流
HAProxy是一个可靠、高性能的TCP/HTTP负载均衡器,也可以用来限制API请求速率。
配置示例:
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 # 限速配置 stick-table type ip size 1m expire 30s store http_req_rate(1s) http-request track-sc0 src http-request deny if { sc_http_req_rate(0) gt 1 }
在这个配置中:
stick-table
定义了一个IP地址的限速表,type ip
表示按IP地址限速,size 1m
表示存储100万个IP地址的限速信息,expire 30s
表示限速信息30秒过期。http-request track-sc0 src
将客户端IP地址跟踪到共享连接表中。http-request deny if { sc_http_req_rate(0) gt 1 }
如果某个IP地址在1秒内的请求数超过1次,则拒绝请求。
3. 使用Redis和Lua脚本进行限流
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
是限速的时间窗口(秒)。
4. 使用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则适合微服务架构。