一、降流原理和配置
1.1 原理
降流是通过限制服务的请求流量来保护服务,避免系统过载而导致宕机。Spring Cloud提供了多种限流方式,如基于IP限流、基于令牌桶算法的限流、基于漏桶算法的限流等。
基于令牌桶算法的限流是最常见的一种限流方式。令牌桶算法的原理是,系统以一定的速度生成令牌,当请求到达时,先去令牌桶中获取令牌,如果令牌桶中有令牌,则正常处理请求;如果令牌桶中没有令牌,则拒绝请求。
1.2 配置
在Spring Cloud中,我们可以使用Gateway或者Zuul等网关组件来实现降流功能。以Gateway为例,我们可以通过配置文件或者Java代码来配置令牌桶限流。
配置文件方式: 在application.yml文件中添加如下配置:
spring:
cloud:
gateway:
routes:
- id: serviceA
uri: http://localhost:8081
predicates:
- Path=/serviceA/**
filters:
- name: RequestRateLimiter
args:
key-resolver: "#{@remoteAddrKeyResolver}"
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstCapacity: 2
其中,RequestRateLimiter是Gateway内置的限流过滤器,key-resolver用于解析限流的Key,redis-rate-limiter是基于Redis实现的限流算法。
Java代码方式:
@Bean
public KeyResolver remoteAddrKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/serviceA/**")
.filters(f -> f.requestRateLimiter().rateLimiter(RedisRateLimiter.class, c -> c.setBurstCapacity(2).setReplenishRate(1)).stripPrefix(1))
.uri("http://localhost:8081"))
.build();
}
其中,requestRateLimiter()表示使用Gateway内置的限流过滤器,rateLimiter()表示限流算法的类型,stripPrefix(1)表示去除服务前缀。
二、熔断原理和配置
2.1 原理
熔断是指当服务出现故障或者延迟时,直接返回默认的响应,避免因等待超时而浪费系统资源。Spring Cloud提供了Hystrix组件来实现熔断功能。Hystrix通过对服务调用进行监控,当服务调用失败率达到一定阈值时,启动熔断器,直接返回默认的响应。
2.2 配置
我们可以通过配置文件或者Java代码来配置熔断器。以Gateway为例,我们可以在application.yml文件中添加如下配置:
hystrix:
command:
default:
circuitBreaker:
requestVolumeThreshold: 10
sleepWindowInMilliseconds: 5000
errorThresholdPercentage: 50
metrics:
rollingStats:
timeInMilliseconds: 10000
numBuckets: 10
上述配置中,requestVolumeThreshold、sleepWindowInMilliseconds和errorThresholdPercentage的含义同降流一样。rollingStats表示在一个时间窗口内统计的时间长度和桶数,用来计算错误率或者请求响应时间。
需要注意的是,熔断器在打开时,会进入一个预热阶段,即只允许一定数量的请求通过,其他请求将直接被拒绝。预热阶段结束后,熔断器才会开始正常工作。