深入学习Spring Cloud Gateway 限流熔断攻略
什么是Spring Cloud Gateway
Spring Cloud Gateway是一个构建在Spring Framework 5,Project Reactor和Spring Boot 2之上的网关,可以作为所有基于HTTP路由的API的入口点。它提供了一种简单而有效的方式来传递客户端请求到多个下游服务实例。
限流熔断
在微服务架构中,服务之间的通信是基于网络进行的,由于网络的不稳定性,可能会出现响应延迟、服务故障等问题。为了保证服务的高可用性和稳定性,需要对服务进行一些保护性措施,其中限流和熔断是两种常见的保护措施。
限流
限流是通过对流量进行控制,使其达到服务所能承受的范围内,从而保证服务的可用性和稳定性。Spring Cloud Gateway通过应用Hystrix组件中的限流来达到限制请求流量的目的。可以通过在网关路由定义中配置限流规则,例如:
spring:
cloud:
gateway:
routes:
- id: book_service_route
uri: http://localhost:9090
predicates:
- Path=/books/**
filters:
- name: Hystrix
args:
fallbackUri: forward:/fallback/bookservicefallback
name: bookservicefallback # Hystrix命令名称
fallback:
type: THROWS_EXCEPTION # 回退时执行的类型,这里是抛出异常
# 以下是Hystrix插件的属性
circuitBreaker.requestVolumeThreshold: 2 # 当在10秒内达到5个请求时开启熔断
circuitBreaker.errorThresholdPercentage: 50 # 当请求失败率达到50%后开启熔断
circuitBreaker.sleepWindowInMilliseconds: 5000 # 熔断开启5秒后,进入半熔断状态
execution.isolation.thread.timeoutInMilliseconds: 1000 # 执行超时时间
# 限流配置属性
rateLimiter.enabled: true # 启用限流
rateLimiter.rateLimiter-type: user # 根据用户进行限流
rateLimiter.user-key-resolver-type: PrincipalNameKeyResolver # 能够解析用户信息,以便进行限流
rateLimiter.redis-rate-limiter.replenishRate: 1 # 令牌桶的填充速率
rateLimiter.redis-rate-limiter.burstCapacity: 1 # 令牌桶的容量
上述配置使用了Hystrix的限流属性,同时也使用了RateLimiter来进行具体的限流操作。
熔断
熔断是指当某个服务出现故障或延迟等异常情况时,关闭或断开对该服务的访问,直到该服务恢复正常。Gateway通过应用Hystrix组件中的熔断机制来达到熔断的目的。可以通过在网关路由定义中配置熔断规则,例如:
spring:
cloud:
gateway:
routes:
- id: book_service_route
uri: http://localhost:9090
predicates:
- Path=/books/**
filters:
- name: Hystrix
args:
fallbackUri: forward:/fallback/bookservicefallback
name: bookservicefallback # Hystrix命令名称
fallback:
type: THROWS_EXCEPTION # 回退时执行的类型,这里是抛出异常
# 以下是Hystrix熔断插件的属性
circuitBreaker.requestVolumeThreshold: 2 # 当在10秒内达到5个请求时开启熔断
circuitBreaker.errorThresholdPercentage: 50 # 当请求失败率达到50%后开启熔断
circuitBreaker.sleepWindowInMilliseconds: 5000 # 熔断开启5秒后,进入半熔断状态
execution.isolation.thread.timeoutInMilliseconds: 1000 # 执行超时时间
上述配置使用了Hystrix的熔断属性,在请求达到一定量之后,如果大批量的请求出现异常,那么Gateway就会开启熔断机制,限制对应路由的请求,防止对服务造成压力。
示例
下面是两个使用限流和熔断的示例。
示例1:限流
考虑一个情况,当用户对我们的API进行请求时,为了保护我们的服务,我们需要对每个请求进行限流,以防止攻击和过度使用。我们可以根据用户IP地址来限流。
spring:
cloud:
gateway:
routes:
- id: rate_limiter_route
uri: http://localhost:9000
predicates:
- Path=/limit/**
filters:
- name: RequestRateLimiter
# IP地址作为限流键值,每秒最多处理1个请求
args:
key-resolver: "#{@ipKeyResolver}"
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstCapacity: 1
上述配置使用了RequestRateLimiter过滤器,并采用了基于IP地址的限流策略。同时,我们需要定义一个IP地址解析器:
@Component
public class IpKeyResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
}
示例2:熔断
考虑另一个情况,我们需要在网关上实现熔断机制,以避免后端服务不可用或超时。我们可以为每个路由配置Hystrix过滤器,并在超过指定阈值的情况下打开熔断器。
spring:
cloud:
gateway:
routes:
- id: fallback_route
uri: https://example.com
predicates:
- Path=/fallback/**
filters:
- name: Hystrix
args:
name: fallbackcmd
fallbackUri: forward:/fallbackmessage
# 設置熔斷器相關參數
circuitBreaker.requestVolumeThreshold: 2
circuitBreaker.sleepWindowInMilliseconds: 10000
circuitBreaker.errorThresholdPercentage: 50
# 執行請求的相關參數
execution.isolation.thread.timeoutInMilliseconds: 2000
- uri: lb://stockquote
predicates:
- Path=/stock/**
filters:
- name: Hystrix
args:
name: hystrixcmd
fallbackUri: forward:/fallback/stockfallback
circuitBreaker.requestVolumeThreshold: 2
circuitBreaker.sleepWindowInMilliseconds: 10000
circuitBreaker.errorThresholdPercentage: 50
execution.isolation.thread.timeoutInMilliseconds: 5000
上述配置为两个路由配置了Hystrix过滤器,并分别采用了不同的熔断策略。当后端服务不可用或超时时,Gateway将为该路由开启熔断机制。这样做可以保持系统的稳定性,并防止系统负载达到过高。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入学习spring cloud gateway 限流熔断 - Python技术站