本文最后更新于25 天前,其中的信息可能已经过时,如有错误请发送邮件到qiqin-chang@qq.com
基础配置:
依赖:
<!--sentinel 服务保护-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
配置:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 #控制台地址
eager: true
http-method-specify: true # 区分请求方式前缀(可选)
# web-context-unify: false #开启链路分割
异常处理:
流控异常:
异常类:
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, String resourceName, BlockException e) throws Exception {
response.setContentType("application/json;charset=utf-8");
PrintWriter writer = response.getWriter();
//R为返回结果类,请使用自己的结果类包装
R error = R.error(500,resourceName + "被Sentinel限制了,原因" + e.getClass());
String json = objectMapper.writeValueAsString(error);
writer.write(json);
writer.flush();
writer.close();
}
}
@SentinelResource:
异常类:
全局异常处理器:
@RestControllerAdvice //全局异常处理器
public class GlobalExceptionHandler {
}
方法注解:
@SentinelResource(value = "createUser-资源名称",blockHandler = "createUserFallback-兜底函数") //fallback异常
服务类中兜底函数:
//兜底回调
public Order createUserFallback(Long userId, BlockException e) { //Throwable exception
User user = new user();
user.setId(0L);
user.setTotalAmount(new BigDecimal("0"));
user.setUserId(userId);
user.setNickName("未知用户");
user.setAddress("异常信息:"+ e.getClass());
return user;
}
OpenFeign:
请看OpenFeign章节
硬编码SphU:
try {
SphU.entry("resourceName");
}catch (BlockException e) {
//编码处理
}
流控规则:
阈值类型:
- 阈值 请求阈值
- QPS 每秒访问次数
- 并发线程数 分配线程池连接数量
集群模式:
- 单机均摊 每台服务器都分配阈值的数量
- 总体阈值 所有服务器一共分配阈值的数量
流控模式:
- 直接 达到阈值触发流控
- 链路 需要开启链路分割对不同链路都可进行流控
- 关联 需要开启链路分割关联的链路达到阈值触发流控
流控效果:
- 快速失败 达到阈值直接失败
- Warm UP(预热/冷启动) +冷启动时间 逐渐增加并发数直至阈值
- 匀速排队 +最大等待时间 每秒接受阈值个请求其余请求进行排队超出最大请求时间将被舍弃
熔断降级:
- 慢调用比例 规定时间内超时线程比例超过阈值进行熔断
- 异常比例 规定时间内异常线程比例超过阈值进行熔断
- 异常数 规定时间内异常数超过阈值进行熔断
热点规则:
- 对参数实现流控规则
权限规则:
- 设置流控应用的黑白名单
系统规则:
- 对系统的整体阈值进行规则限流
请求限流:
线程隔离:
OpenFeign整合Sentinel:
修改chang-service模块的application.yml文件,开启Feign的sentinel功能:
feign:
sentinel:
enabled: true # 开启feign对sentinel的支持
测试配置:
server:
port: 8082
tomcat:
threads:
max: 50 # 允许的最大线程数
accept-count: 50 # 最大排队等待数量
max-connections: 100 # 允许的最大连接