限流概述
限流 是控制系统负载、避免服务过载的一种机制。在微服务架构中,限流有助于确保系统在高并发下能够保持稳定性和高可用性,避免因为过多的请求导致系统崩溃。常见的限流技术包括基于 令牌桶算法、漏桶算法、QPS 限流 等。
在实际生产环境中,限流策略不仅限于后端服务,通常会在不同层级上进行限流,以实现流量的多层次控制。主要包括以下几种层级:
- Nginx:前端反向代理层,适用于防止 DDoS 攻击和 IP 层面流量控制。
- API 网关(如 Spring Cloud Gateway):适用于服务网关层的全局流量管理,提供基于接口和用户的限流。
- 后端服务(如 Sentinel):适用于微服务的业务流量控制,能根据业务需求动态调整流量控制策略。
1. Nginx 限流
Nginx 是非常常见的反向代理和负载均衡工具,它可以通过配置文件进行高效的限流,尤其适用于防止 恶意流量、高并发攻击 和 IP 滥用 等场景。
主要配置项:
- limit_req_zone:定义限流区域,通常基于
binary_remote_addr
(IP 地址)。 - limit_req:对特定路径或资源进行限流,控制请求频率。
- limit_conn:限制每个客户端的最大并发连接数。
示例:Nginx 配置 IP 限流
http {
# 定义每个 IP 地址每秒最多请求 1 次
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location /api/ {
# 每个 IP 地址最多突发 5 次请求
limit_req zone=one burst=5;
proxy_pass http://backend;
}
}
}
limit_req_zone
:创建一个共享内存区域(zone=one:10m
),每秒限制每个 IP 地址 1 次请求。limit_req
:为/api/
路径配置限流,允许每个 IP 最多突发 5 次请求。
适用场景:
- 防止 DDoS 攻击
- 控制全局请求频率
- 基于 IP 地址的流量控制
2. Spring Cloud Gateway 限流
Spring Cloud Gateway 是一个现代化的 API 网关,能够为微服务架构提供统一的流量管理、路由功能和限流策略。它内建了流量控制功能,可以非常灵活地基于请求路径、请求频率、用户等进行限流。
主要配置项:
- RequestRateLimiter:Spring Cloud Gateway 提供了
RequestRateLimiter
过滤器来实现基于令牌桶算法的限流。 - RedisRateLimiter:基于 Redis 实现分布式限流,确保多实例架构下的流量控制。
示例:Spring Cloud Gateway 限流配置
spring:
cloud:
gateway:
routes:
- id: service_route
uri: lb://SERVICE
predicates:
- Path=/api/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10 # 每秒允许 10 次请求
redis-rate-limiter.burstCapacity: 20 # 最大突发请求数为 20
redis-rate-limiter.replenishRate
:每秒钟允许 10 个请求。redis-rate-limiter.burstCapacity
:允许最大突发请求数为 20。
适用场景:
- 在 API 网关层进行全局流量控制
- 每个接口、每个用户等粒度的限流控制
- 分布式环境下的限流管理
3. Sentinel 限流
Sentinel 是一个由阿里巴巴提供的流量控制工具,专门用于分布式系统中的流量管理。Sentinel 提供了非常强大的功能,支持 QPS 限流、并发线程数限流、熔断、降级等策略,非常适合用于微服务的后端限流和服务保护。
主要配置项:
- FlowRule:限流规则,可以配置限流策略(如基于 QPS 或线程数的限制)。
- @SentinelResource:用于注解业务方法,定义流量控制策略,提供流控异常处理方法。
示例:Sentinel 基于注解的限流
-
添加依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
-
使用 @SentinelResource 注解限流:
@SentinelResource(value = "yourApiMethod", blockHandler = "handleBlock") public String yourApiMethod() { return "Success"; } public String handleBlock(BlockException ex) { return "Request Blocked due to rate limiting"; }
-
配置流量控制规则:
@Bean public FlowRule flowRule() { FlowRule flowRule = new FlowRule(); flowRule.setResource("yourApiMethod"); flowRule.setCount(10); // 每秒 10 个请求 flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 按 QPS 限流 flowRule.setLimitApp(RuleConstant.LIMIT_APP_DEFAULT); return flowRule; }
FlowRule
:流控规则,setCount(10)
表示每秒最多允许 10 个请求,setGrade(RuleConstant.FLOW_GRADE_QPS)
表示按 QPS 限流。
适用场景:
- 微服务架构中的后端流量控制
- 灵活的限流策略,支持 QPS 限流、并发线程数控制等
- 结合熔断、降级和流量控制,保护系统的高可用性
综合使用:Nginx + Spring Cloud Gateway + Sentinel
在微服务架构中,通常需要多个层级的流量控制来保障系统的稳定性和高可用性。不同层级的限流策略可以协同工作,以防止流量冲击后端服务。
使用场景:
- Nginx 限流:用于保护整个服务层,防止恶意请求、IP 滥用、全局请求频率控制等。
- 适合应用于负载均衡前端,对流量进行粗粒度控制。
- Spring Cloud Gateway 限流:用于微服务架构中的 API 网关层,提供对每个接口、每个用户的流量控制,支持分布式限流。
- 适合全局流量控制,提供接口级别、用户级别的限流。
- Sentinel 限流:用于微服务中的后端服务,精细控制每个服务的流量,可以动态调整流控策略,结合降级和熔断机制。
- 适合后端服务的业务流量控制,确保微服务在高并发下不会崩溃。
流量控制的多层次防护:
- Nginx:首先拦截流量,防止 DDoS 攻击和恶意请求,保护后端服务。
- Spring Cloud Gateway:作为 API 网关,提供接口层级的流量控制,保护微服务的 API 层。
- Sentinel:在后端服务中提供精细化的流量控制,并结合熔断、降级等策略保护业务系统。
总结
- Nginx:适用于前端流量控制,防止 DDoS 攻击、IP 滥用等;通过配置文件进行高效的限流。
- Spring Cloud Gateway:适用于 API 网关层的流量控制,支持每个接口、每个用户的限流,通过配置文件或代码灵活配置。
- Sentinel:适用于后端微服务的流量控制,支持精细的限流策略(如 QPS 限流、并发控制),通过注解和代码动态配置流控规则。
通过结合这三者的限流机制,可以实现多层次、全方位的流量控制,确保系统的稳定性、可靠性和高可用性。