在Spring Cloud中,限流通常可以通过整合Netflix的Zuul网关与Hystrix来实现,或者使用Alibaba的Sentinel。由于Hystrix已经进入维护模式,这里以Sentinel为例来提供一个限流的应用配置示例及详解。

1. 添加依赖

首先,在Spring Boot项目中添加Sentinel的依赖。如果你使用Maven,可以在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2. 配置文件

application.ymlapplication.properties中配置Sentinel。以下是application.yml的一个示例配置:

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 # Sentinel 控制台地址
        port: 8719
      eager: true

这个配置定义了如何连接到Sentinel控制台,并设置了Sentinel在项目中的监听端口。

3. 定义资源和规则

在代码中,你可以通过@SentinelResource注解来定义资源,然后在Sentinel控制台中设置限流规则。以下是一个使用注解的例子:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;

@RestController
public class TestController {

    @GetMapping("/hello")
    @SentinelResource(value = "hello", blockHandler = "handleException")
    public String hello() {
        return "Hello Sentinel";
    }

    public String handleException(BlockException ex) {
        return "Service has been limited";
    }
}

在上述代码中,@SentinelResource注解将hello方法定义为一个Sentinel资源,并指定了当资源被限流时调用的处理函数handleException

4. 在控制台配置限流规则

在Sentinel控制台中,可以为hello资源配置限流规则。例如,可以设置QPS(每秒请求数)不超过100,若超过该值,则触发限流。

详解

Sentinel 提供了丰富的限流策略,如QPS、并发数、响应时间等。以下是一些常用的限流参数:

  • 资源名:通常是请求路径或业务名称,是限流规则的作用对象。
  • 阈值类型:可以是QPS(每秒请求数量)或线程数等。
  • 单机阈值:设置在单机上的限流阈值,比如QPS设置为100,则当请求的QPS达到100时开始限流。
  • 是否集群:如果服务是集群部署,可以配置集群限流,限流的粒度将是整个集群的流量。
  • 流控模式:直接限流、关联限流、链路限流等。
  • 流控效果:快速失败(默认行为,直接拒绝)、Warm Up(预热,逐渐增加到阈值)、排队等待(匀速排队)。

Sentinel控制台提供了直观的界面来设置这些规则,你可以根据实际需求来调整限流策略,以适应不同的场景和要求。

注意事项

  • 在使用Sentinel时,务必要启动Sentinel控制台,并在配置文件中正确设置控制台地址和项目端口。
  • Sentinel控制台需要独立部署,它提供了API来动态修改限流规则。
  • Sentinel 不仅限于限流,它还提供了降级、系统负载保护等多种服务保护措施。
  • Sentinel 的注解方式非常灵活,可以根据实际的业务场景,使用不同的blockHandlerfallback来处理限流后的行为。