在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.yml或application.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 的注解方式非常灵活,可以根据实际的业务场景,使用不同的
blockHandler和fallback来处理限流后的行为。
















