Spring Cloud 降流和熔断原理和配置详解

670 阅读2分钟

一、降流原理和配置

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表示在一个时间窗口内统计的时间长度和桶数,用来计算错误率或者请求响应时间。

需要注意的是,熔断器在打开时,会进入一个预热阶段,即只允许一定数量的请求通过,其他请求将直接被拒绝。预热阶段结束后,熔断器才会开始正常工作。