【微服务之流量治理Sentinel】Sentinel应用示例
一 Sentinel介绍
SpringCloud Sentinel 是阿里巴巴开源的一款面向云原生微服务的流量治理组件,致力于保障服务的稳定性。它以“资源”为核心,从流量控制、熔断降级、系统负载保护等多个维度来防止服务雪崩。与 Hystrix 相比,Sentinel 设计更轻量,不依赖线程池隔离,支持更为丰富的流控模式(如冷启动预热、排队等待),并提供开箱即用的实时监控控制台。它能无缝集成 Spring Cloud、Dubbo 及各类 API 网关,是目前微服务架构中主流的稳定性解决方案。
主要功能和使用场景如下:

为了更好地理解上述表格,需要了解 Sentinel 的三个核心概念:
- 资源 (Resource):Sentinel 保护的目标。可以是 Java 代码块、方法、RPC 接口、API 路由等。
- 规则 (Rules):定义如何保护资源的策略(如:QPS > 100 就报错)。规则可以动态推送到 Sentinel 控制台。
- 控制台 (Dashboard):可视化的 Web 界面,用于实时监控服务流量、查看调用链路、动态配置规则。
二 调用组件SpringCloud Sentinel示例
1. 引入Sentinel依赖
在父模块pom引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2. 编写Sentinel配置项
编写Sentinel配置项。
spring:
cloud:
openfeign:
#使用 Apache HttpClient 5
httpclient:
hc5:
enable: true
client:
config:
#全局
default:
logger-level: full
connect-timeout: 3000
read-timeout: 3000
sentinel:
transport:
dashboard: localhost:8080
eager: true
3. 启动sentinel-dashboard控制台
Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。下载控制台jar包,并启动控制台。

控制台界面

4. 对接口资源设置流控规则

1) 对接口资源设置流控规则中QPS阈值为1。

高频访问该资源接口,当QPS超过1时,会提示错误。可以根据自己需求重写流控异常处理器BlockExceptionHandler,返回想要的信息。

2) 对service方法资源设置流控规则中QPS阈值为1。

// 示例
@Service
public class OrderServiceImpl implements OrderService {
@SentinelResource(value = "createOrder",blockHandler = "createOrderFallback")
@Override
public OrderEntity createOrder() {
OrderEntity orderEntity = new OrderEntity();
orderEntity.setId(10l);
orderEntity.setTotalNum(1);
orderEntity.setUserName("Admin");
return orderEntity;
}
}
在资源方法上,设置blockHandler兜底方法,如果超过限制条件,可返回预设置的兜底数据。

5. 流控模式
流控模式是根据什么条件判断是否限流。 Sentinel 提供三种流控模式:
- 直接:默认模式。直接统计当前资源的 QPS 或线程数,当达到阈值时,直接对当前资源进行限流。逻辑:自己扛不住了,就限自己。
- 关联:统计与当前资源有关联的另一个资源,当关联资源流量超限时,限制当前资源。逻辑:为了保住重要的(关联资源),牺牲次要的(当前资源)。
- 链路:只记录指定入口(Entry)进来的流量。如果从某个特定入口调用当前资源的流量超限,则限流;其他入口调用不受影响。

6. 流控效果
流控效果,定义当 QPS 超过阈值时,系统如何处理多余的请求(仅针对 QPS 限流生效)。
- 快速失败:默认效果。当流量达到阈值,直接抛出 FlowException 异常,拒绝请求。
- Warm Up:应对服务冷启动的方案,系统在刚启动的一段时间内(预热时长),阈值从一个较小值(max/3)缓慢增加到设置的最大阈值。
- 排队等待: 允许所有的请求按照先后次序排队执行,保证请求之间的间隔不小于指定的时长。严格控制请求通过的间隔时间,强制请求以匀速通过。超过排队等待时间的请求才会被拒绝。
7. 熔断规则
当调用链路中的某个资源出现不稳定状态(如响应时间变长、异常比例升高)时,Sentinel 会对该资源的调用进行熔断,即在一段时间内(熔断时长)直接拒绝访问并快速返回降级数据,避免源源不断的请求导致资源耗尽(如线程池满),从而保护主业务链路。
Sentinel 的熔断机制基于熔断器模式,包含三种状态:Closed(关闭/正常)、Open(开启/熔断)、Half-Open(半开启/恢复检测)。
Sentinel 提供三种主要的熔断策略(规则)
- 慢调用比例:针对响应时间。在统计时长内,如果请求的响应时间(RT)超过了设定的阈值,该请求被记为“慢调用”。当慢调用比例 > 设定阈值,触发熔断。
- 异常比例:针对错误率。在统计时长内,如果(异常请求数 / 总请求数)的比例 > 设定阈值,触发熔断。
- 异常数:针对错误计数。在统计时长内,如果请求的异常总数 > 设定阈值,触发熔断。

8. 热点规则
普通的流控是限制整个 API 的总流量(例如:/getProduct 接口每秒只能访问 100 次),而热点规则是统计传入参数中的热点数据,并对包含该特定参数值的请求进行限流(例如:/getProduct?id=1 这个具体商品的访问量过大,只限制 id=1 的请求,而不影响 id=2 的请求)。热点规则的使用通常需要配合注解 @SentinelResource 使用。

Sentinel 的热点规则如下:
- 热点参数基础限流:针对参数索引。指定监控方法中的第几个参数(索引 0, 1…)。当该参数的任意值(如 id=A, id=B)的 QPS 超过阈值时,对该特定值的请求进行限流。
- 参数例外项: 针对特定值定制。在基础限流的前提下,对某些特定的参数值设置“特殊待遇”(更高或更低的阈值)。

更多推荐
所有评论(0)