sentinel
阿里开源的一套服务容错方案,消息削峰填谷,集群流量控制,实时熔断下游不可用应用等,提供了实时监控功能
不同于redis的一种集群模式-sentinel-哨兵模式,redis集群有主从模式[当有服务器不好用时,需要人为干预选择]和哨兵模式[一种自动选举的模式]
所需依赖
xml
<!-- SpringCloud Alibaba Sentinel - Sentinel 核心 Starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- 可选:如果需要使用 Nacos 进行规则持久化,需额外引入数据源依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
启动sentinel控制台

这里使用的是1.8.5版本,控制台默认端口8080
启动命令:
java
java -jar sentinel-dashboard-1.8.5.jar --server.port=8080 --csp.sentinel.dashboard.server=localhost:8080 --project.name=sentinel-dashboard

如图所示,sentinel控制台可以操作的功能有:热点控制、熔断降级、流量控制、授权操作等等
sentinel容错维度
- 流量控制:控制有限的请求接入
- 熔断降级:请求异常时,让请求快速失败
- 系统负载保护:针对服务器进行设定
sentinel规则种类
-
流控:每秒限流
qps-每秒极限值 线程数-同一时刻线程数
三种模式:直接(默认)、关联(当关联资源达到限流,开启限流)、链路(
//是否合并接口上下文 默认true spring:cloud:sentinel:web-context-unify:false//不进行合并)
三种效果:快速失败(抛异常)、Warm Up(预热机制-预热时长-秒为单位-也是抛异常)、排队等待(超时时间-单位毫秒)
-
降级:设置熔断时长,当超过时长进行熔断处理
-
热点:热点参数限流(让热点商品不能占用全部流量),高并发,
-
系统:cpu使用率等限定
-
授权:有权限才可以访问
sentinel中的资源:(在sentinel控制台中能被识别到)
- controller中的接口默认就是资源
sentinel降级
三种衡量条件:(越来越严格的降级要求:慢调用-异常比例-异常数)
-
慢调用比例:需要设置允许的慢调用RT(即最大的响应时间)

-
异常比例

-
异常数(同异常比例)
sentinel热点


sentinel授权

java
//请求解析类,当访问指定资源时,会判断是否符合要求
@Component
public class MyRequestParser implements RequestOriginParser {
//解析请求目标的方法
@Override
public String parseOrigin(HttpServletRequest httpServletRequest) {
//通过request对象取参数
String serviceName = httpServletRequest.getParameter("serviceName");
if (serviceName == null || "".equals(serviceName)) {
return "error";
}
//返回给sentinel 和黑/白名单进行比对
return serviceName;
}
}
sentinel自定义异常返回
sentinel异常的父类:BlockException
- FlowException 限流异常
- DegradeException 降级异常
- ParamFlowException 参数限流异常
- AuthorityException 授权异常
- SystemBlockException 系统负载异常
热点或是链路的错误 显示500 是不能在BlockException中进行捕获的
java
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
//异常捕获类
@RestControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(BlockException.class)
public Object handleBlockException(HttpServletRequest request, HttpServletResponse response,BlockException e) {
Map<String, String> map = new HashMap<>();
//把异常对象进行比对
if (e instanceof FlowException){
map.put("code", "500");
map.put("message", "限流异常");
}else if (e instanceof DegradeException){
map.put("code", "500");
map.put("message", "降级异常");
}else if (e instanceof ParamFlowException){
map.put("code", "500");
map.put("message", "热点异常");
}else if (e instanceof AuthorityException){
map.put("code", "500");
map.put("message", "授权异常");
}else{
map.put("code", "500");
map.put("message", "系统异常");
}
return map;
}
}
nacos - sentinel持久化
在nacods中添加配置文件,用于存储sentinel持久化资源内容,设置资源访问限制。
yaml
[
{
"resource": "资源名",
"count": 500,
"grade": 1,
"limitApp": "default",
"strategy": 0,
"controlBehavior": 0
},
{....}
]
参数解析
| 参数名 | 含义说明 |
|---|---|
| resource | 资源名称。这是限流规则作用的目标对象 |
| count | 限流阈值。表示允许通过的最大数量 |
| grade | 阈值类型。• 0:基于线程数(并发线程数限流)。• 1:基于 QPS(每秒查询率限流) |
| limitApp | 流控针对的调用来源。• "default":不区分调用来源,所有来源的请求共享该阈值。• 若填写特定微服务名(如 order-service),则仅对该来源的请求进行限流。 |
| strategy | 调用关系限流策略。• 0:直接模式。当资源自身的 QPS 超过阈值时,直接触发限流。• 1:关联模式(关联资源超阈值时限流本资源)。• 2:链路模式(只统计指定入口的流量)。 |
| controlBehavior | 流控效果(行为)。• 0:快速失败(Default)。超过阈值后,新请求立即被拒绝,抛出 FlowException。• 1:Warm Up(预热/冷启动)。• 2:排队等待(匀速器模式)。• 3:预热 + 排队等待。 |
本地在网关中进行sentinel相关配置
yaml
spring:
application:
# 应用名称
name:
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置 Spring Boot 的环境变量 动态加载配置文件
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
sentinel:
# 取消控制台懒加载
eager: true
transport:
# 控制台地址
dashboard: 127.0.0.1:8718
# nacos配置sentinel持久化
datasource:
ds1:
nacos:
server-addr: 127.0.0.1:8848
dataId: 与nacos中控制台配置文件内容文件名一致
# 配置分组,默认分组DEFAULT_GROUP
groupId: DEFAULT_GROUP
# 数据格式,通常为 json
data-type: json
# 规则类型:网关流控规则
rule-type: gw-flow