微服务网关 Spring Cloud Gateway:流量控制与熔断降级的实战配置
·
Spring Cloud Gateway:流量控制与熔断降级实战配置
一、流量控制(限流)配置
Spring Cloud Gateway 通过 RequestRateLimiter 过滤器实现限流,常用 令牌桶算法。以下是完整配置流程:
- 添加依赖(
pom.xml):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
- Redis 配置(
application.yml):
spring:
redis:
host: 127.0.0.1
port: 6379
cloud:
gateway:
routes:
- id: user_service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10 # 每秒生成10个令牌
redis-rate-limiter.burstCapacity: 20 # 桶容量20个令牌
key-resolver: "#{@userKeyResolver}" # 限流键解析器
- 自定义限流键(Java 配置类):
@Bean
KeyResolver userKeyResolver() {
return exchange -> Mono.just(
exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()
); // 按IP限流
}
二、熔断降级配置
集成 Resilience4j 实现熔断(Hystrix 已弃用):
- 添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
- 熔断器配置(
application.yml):
resilience4j:
circuitbreaker:
instances:
backendA:
failureRateThreshold: 50% # 失败率阈值
minimumNumberOfCalls: 5 # 最小调用数
slidingWindowType: COUNT_BASED # 滑动窗口类型
slidingWindowSize: 10 # 窗口大小
- 网关熔断过滤器:
spring:
cloud:
gateway:
routes:
- id: order_service
uri: lb://order-service
predicates:
- Path=/api/orders/**
filters:
- name: CircuitBreaker
args:
name: backendA # 熔断器实例名
fallbackUri: forward:/fallback # 降级端点
- 降级处理控制器:
@RestController
public class FallbackController {
@GetMapping("/fallback")
public Mono<String> fallback() {
return Mono.just("服务暂时不可用,请稍后重试");
}
}
三、关键参数说明
| 配置项 | 说明 |
|---|---|
replenishRate |
每秒补充的令牌数,决定平均流量 |
burstCapacity |
桶容量,允许的瞬时突发流量 |
failureRateThreshold |
熔断触发失败率阈值(如:$50%$ 表示失败率过半时熔断) |
slidingWindowSize |
统计失败率的调用次数窗口大小 |
fallbackUri |
熔断时转发的降级服务端点 |
四、测试验证方法
-
限流测试:
# 使用压测工具模拟高并发 ab -n 100 -c 30 http://gateway:8080/api/users/观察返回
429 Too Many Requests的请求比例 -
熔断测试:
- 连续触发下游服务异常
- 当失败率达到阈值时,请求自动转发到
fallback端点
最佳实践:生产环境建议结合 Prometheus + Grafana 监控流量与熔断状态,动态调整阈值。
更多推荐
所有评论(0)