Spring Cloud Gateway限流和流量控制详解
创作时间:
作者:
@小白创作中心
Spring Cloud Gateway限流和流量控制详解
引用
CSDN
1.
https://blog.csdn.net/u010020088/article/details/143790858
限流和流量控制是API网关的重要功能,能够防止后端服务过载,确保系统在高并发和流量突增的情况下依然能够稳定运行。Spring Cloud Gateway提供了多种限流和流量控制策略,本文将详细介绍其原理和具体实现方法。
常见限流算法
漏桶算法(不推荐)
- 原理:将请求缓存到一个队列中,然后以固定的速度处理,从而达到限流的目的
- 实现:将请求装到一个桶中,桶的容量为固定的一个值,当桶装满之后,就会将请求丢弃掉,桶底部有一个洞,以固定的速率流出。
- 举例:桶的容量为1W,有10W并发请求,最多只能将1W请求放入桶中,其余请求全部丢弃,以固定的速度处理请求
- 缺点:处理突发流量效率低(处理请求的速度不变,效率很低)
令牌桶算法(推荐)
- 原理:将请求放在一个缓冲队列中,拿到令牌后才能进行处理
- 实现:装令牌的桶大小固定,当令牌装满后,则不能将令牌放入其中;每次请求都会到桶中拿取一个令牌才能放行,没有令牌时即丢弃请求/继续放入缓存队列中等待
- 举例:桶的容量为10w个,生产1w个/s,有10W的并发请求,以每秒10W个/s速度处理,随着桶中的令牌很快用完,速度又慢慢降下来啦,而生产令牌的速度趋于一致1w个/s
- 缺点:处理突发流量提供了系统性能,但是对系统造成了一定的压力,桶的大小不合理,甚至会压垮系统(处理1亿的并发请求,将桶的大小设置为1,这个系统一下就凉凉啦)
使用Spring Cloud Gateway进行限流
Spring Cloud Gateway内置了基于Redis的分布式限流器,你可以通过配置Redis限流过滤器来实现请求限流。
- 添加依赖
在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>
- 配置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
- 配置限流键解析器
创建一个自定义限流键解析器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());
}
}
- 配置限流策略
在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的稳定性和容错能力。
- 添加依赖
在pom.xml文件中添加以下依赖:
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
</dependency>
- 配置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
- 创建熔断器的回退处理
创建一个回退处理控制器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网关。
热门推荐
衡量音响好坏的关键指标有哪些?
都匀毛肚火锅:舌尖上的历史传承
备孕期间感冒用药全攻略:这些成分要当心!
冬季感冒高发,这些药你选对了吗?
“寻迹三国”小程序:让500处三国古迹触手可及
武警贯耳冲击:现代军事训练的秘密武器
《三国志战略版》汉中之战地图大揭秘:郡治模式下的策略博弈
《乱世逐鹿》带你云游真实三国地图
三国鼎立到隋朝统一:地理变迁与文化融合
蜂蜜水能治愈糜烂性胃炎吗?专家解读来了!
糜烂性胃炎患者如何安全使用蜂蜜?
拉伸真的能长高吗?科学解读来了!
黑晶石真的能助你科学长高吗?
晨间伸展助你轻松长高!
利好股市是什么?利好股市的因素有哪些?
主播常用梗大盘点:从“我X了”到“老铁666”
探秘重庆古镇:龚滩与濯水的文化遗产之旅
从五五开到大司马:那些年我们一起追的经典主播梗
北京事业单位退休人员去世后,家属可领哪些钱?
秋收神器!掌握这些装载机操作技巧
双十一期间,如何给你的小铲车做一次全面体检?
新能源电瓶铲车:绿色粮仓的新宠
探悉金丝楠的功效,你知其美,可知其功效之多?
惠州南站改扩建,深汕高铁+双地铁齐上阵!
广汕高铁通车!惠州南站16条公交线路全解析
广汕高铁开通!从惠州南站出发探秘罗浮山
当心!代充话费暗藏洗钱陷阱
国画入门:河边风戏柳的画法详解
解读股票价格走势:如何借助大盘分析捕捉市场机遇
最新进展!上交所受理海通证券A股主动终止上市申请