Spring Cloud Gateway限流和流量控制
创作时间:
作者:
@小白创作中心
Spring Cloud Gateway限流和流量控制
引用
CSDN
1.
https://blog.csdn.net/u010020088/article/details/143790858
限流和流量控制是API网关的重要功能,能够防止后端服务过载,确保系统在高并发和流量突增的情况下依然能够稳定运行。Spring Cloud Gateway提供了多种限流和流量控制策略,本文将详细介绍其原理和具体实现方法。
常见限流算法
1. 漏桶算法(不推荐)
- 原理:将请求缓存到一个队列中,然后以固定的速度处理,从而达到限流的目的
- 实现:将请求装到一个桶中,桶的容量为固定的一个值,当桶装满之后,就会将请求丢弃掉,桶底部有一个洞,以固定的速率流出。
- 举例:桶的容量为1W,有10W并发请求,最多只能将1W请求放入桶中,其余请求全部丢弃,以固定的速度处理请求
- 缺点:处理突发流量效率低(处理请求的速度不变,效率很低)
2. 令牌桶算法(推荐)
- 原理:将请求放在一个缓冲队列中,拿到令牌后才能进行处理
- 实现:装令牌的桶大小固定,当令牌装满后,则不能将令牌放入其中;每次请求都会到桶中拿取一个令牌才能放行,没有令牌时即丢弃请求/继续放入缓存队列中等待
- 举例:桶的容量为10w个,生产1w个/s,有10W的并发请求,以每秒10W个/s速度处理,随着桶中的令牌很快用完,速度又慢慢降下来啦,而生产令牌的速度趋于一致1w个/s
- 缺点:处理突发流量提供了系统性能,但是对系统造成了一定的压力,桶的大小不合理,甚至会压垮系统(处理1亿的并发请求,将桶的大小设置为1,这个系统一下就凉凉啦)
使用Spring Cloud Gateway进行限流
Spring Cloud Gateway内置了基于Redis的分布式限流器,你可以通过配置Redis限流过滤器来实现请求限流。
1. 添加依赖
在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2. 配置Redis限流器
在application.yml中配置Redis限流器:
spring:
redis:
host: localhost
port: 6379
cloud:
gateway:
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/users/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter:
replenishRate: 10
burstCapacity: 20
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
fetch-registry: true
register-with-eureka: true
3. 配置限流键解析器
创建一个自定义限流键解析器HostAddrKeyResolver.java:
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Configuration
public class RateLimiterConfig {
@Bean
public KeyResolver hostAddrKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
}
4. 配置限流策略
在application.yml中配置限流策略:
spring:
cloud:
gateway:
default-filters:
- name: RequestRateLimiter
args:
key-resolver: "#{@hostAddrKeyResolver}"
redis-rate-limiter:
replenishRate: 10
burstCapacity: 20
使用Resilience4j实现限流和熔断
Resilience4j是一个轻量级的故障处理库,支持限流、熔断、重试等功能。你可以通过集成Resilience4j来增强Spring Cloud Gateway的稳定性和容错能力。
1. 添加依赖
在pom.xml文件中添加以下依赖:
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
</dependency>
2. 配置Resilience4j
在application.yml中配置Resilience4j:
spring:
cloud:
gateway:
routes:
- id: product-service
uri: lb://PRODUCT-SERVICE
predicates:
- Path=/products/**
filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/fallback
resilience4j:
circuitbreaker:
instances:
myCircuitBreaker:
registerHealthIndicator: true
ringBufferSizeInClosedState: 5
ringBufferSizeInHalfOpenState: 2
waitDurationInOpenState: 10000
failureRateThreshold: 50
eventConsumerBufferSize: 10
3. 创建熔断器的回退处理
创建一个回退处理控制器FallbackController.java:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FallbackController {
@GetMapping("/fallback")
public String fallback() {
return "This is a fallback response";
}
}
一个完整的示例
为了更好地理解上述概念,我们来看一个完整的限流和流量控制配置示例。假设我们有一个电商平台,有用户服务、订单服务和产品服务。我们需要配置Gateway来实现限流、流量控制和熔断功能。
完整的Spring Cloud Gateway配置
spring:
application:
name: gateway-service
redis:
host: localhost
port: 6379
cloud:
gateway:
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/users/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter:
replenishRate: 10
burstCapacity: 20
- id: order-service
uri: lb://ORDER-SERVICE
predicates:
- Path=/orders/**
- id: product-service
uri: lb://PRODUCT-SERVICE
predicates:
- Path=/products/**
filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/fallback
default-filters:
- name: RequestRateLimiter
args:
key-resolver: "#{@hostAddrKeyResolver}"
redis-rate-limiter:
replenishRate: 10
burstCapacity: 20
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
fetch-registry: true
register-with-eureka: true
resilience4j:
circuitbreaker:
instances:
myCircuitBreaker:
registerHealthIndicator: true
ringBufferSizeInClosedState: 5
ringBufferSizeInHalfOpenState: 2
waitDurationInOpenState: 10000
failureRateThreshold: 50
eventConsumerBufferSize: 10
management:
endpoints:
web:
exposure:
include: "*"
启动和测试
- 启动Redis服务:
docker run -d -p 6379:6379 redis
- 启动Eureka服务注册中心:
# 启动Eureka服务注册中心
java -jar eureka-server.jar
- 启动用户服务、订单服务和产品服务:
# 启动用户服务
java -jar user-service.jar
# 启动订单服务
java -jar order-service.jar
# 启动产品服务
java -jar product-service.jar
- 启动Gateway服务:
java -jar gateway-service.jar
- 测试限流和流量控制配置:
访问 http://localhost:8080/users 应该受到限流控制,每秒最多10次请求,突发请求不超过20次。
访问 http://localhost:8080/products 时,如果服务故障,会触发Resilience4j熔断器并返回回退响应。
结论
通过本文的讲解,你应该已经掌握了如何在Spring Cloud Gateway中实现限流和流量控制。我们详细介绍了如何使用Redis限流器、配置限流键解析器、自定义限流策略,以及使用Resilience4j实现限流和熔断,帮助你构建一个稳定、高可用的API网关。
热门推荐
最佳团队锦旗如何设计
酒后闹事会承担什么法律后果
个人养老金产品也能退税,退多少?这笔钱不能错过
俄乌军队超过1000天的战斗数据对比
木槿花的芳香之谜:探究木槿花气味的成分和特点
育儿知识 | 儿童四大气质类型大解析,你家宝宝属于哪种?
2025年初级会计考试大纲解析:《经济法基础》整体结构并未发生重大变化
专家提醒:这6种食物空腹食用需谨慎
安东尼戴维斯离队背后的真相
米与千米的换算与日常生活应用探讨
星际52区抽卡系统介绍:新手必看的卡池概率攻略
加州野火带来哪些启示?气候变化加剧,需增强气候韧性与风险管理!
杠杆风险是什么意思?如何防范和应对杠杆风险?
献血有益身体健康
Excel文件创建时间查看方法详解
商业租房税谁来承担
如何手动降低笔记本电脑的性能以降低功耗
央视权威报道:美发店以"学徒"为由拒付工资被判支付二倍工资差额
凉拌挂面怎么调汁好吃
马斯克为特朗普政府裁员出新招:要么交“周报”,要么被解雇
科兴生物新冠疫苗有效率,科兴疫苗保护率是多少?
摆脱儿童肥胖,三招有效应对!
如何快速诊断和解决异常咖啡机故障问题:咖啡机无法启动、水流不畅和声音异常怎么办
《盗梦空间》:揭秘诺兰的非线性叙事艺术
萨达姆脑子有多好使?留下400亿遗产,美国只能眼睁睁的看着!
防弹材料试验方法新标与纤维增强复合材料行业
上海六所基地校探索AI教育新模式:课程开发、空间拓展与师资培育三管齐下
再植牙的四种愈合方式包括
国标GB28181视频平台EasyGBS小知识:如何确保摄像机的网络连接稳定?
探秘华为智慧:“财报六看” 如何重塑企业财务分析思维?