SpringCloud-Alibaba学习(十一):Sentinel熔断降级及其他规则
1、Sentinel熔断降级
文档:
https://github.com/alibaba/Sentinel/wiki/熔断降级
熔断策略
- 慢调用比例
- 请求的响应时间大于设置的 RT 即为慢调用
- 单位时间慢调用的比例大于阈值时,进行熔断
- 单位时间请求数需要大于设置的最小请求数才生效(最小 5)
- 熔断后经过熔断时长后会进入探测恢复状态,发起一个请求,请求超时继续熔断,否则恢复
- 异常比例
- 单位时间请求数大于最小请求数
- 发生异常的请求比例大于阈值
- 异常数
- 单位统计时长内的异常数目超过阈值后进行熔断
// 模拟接口 @RestController @RequestMapping("/break") public class BreakController { @GetMapping("/test1") public String test1(@RequestParam("type") Integer type) { System.out.println("test1"); if (type == 0) { System.out.println("正常接口调用"); } else { if (type == 1) { System.out.println("慢调用"); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } } if (type == 2) { System.out.println("异常调用"); throw new RuntimeException("接口发生异常"); } } return "test"; } }
1.1 慢调用比例
上面规则为:单位时间内请求响应时间超过 1.5s 的请求大于 3 个时,对接口进行熔断,熔断时间为 10s,单位时间内请求数大于 5 有效
1.2 异常比例
1.3 异常数
2、热点参数
对资源的指定参数进行限流
触发条件:必须有至少一个参数,参数的值可以任意
注意:仅支持 QPS 限流模式,HTTP 接口不能使用默认的资源名会不生效,需要用 @SentinelResource 定义资源
@RestController @RequestMapping("/hotKey") public class HotKeyController { @GetMapping("/test") @SentinelResource("hotkey-test") public String test(String name, Integer age) { System.out.println("name:" + name); System.out.println("age:" + age); return "hotKey"; } }
指定参数值进行限流,编辑热点规则项,修改高级选项
参数类型目前仅支持基本数据类型和 String 类型,不支持对象类型
3、权限规则
官方叫做黑白名单控制
- 配置了白名单的资源只能允许配置的应用访问,拒绝其他应用的访问
- 配置了黑名单的资源不允许配置的应用访问,允许其他应用访问
一个资源只能配置一个白名单或黑名单
黑白名单的配置是应用级别(origin)
上面规则只是配置给了资源提供方,要想规则生效,还得需要调用方提供请求来源(origin)
服务提供方拦截请求,解析获取 origin,如果 origin 在白名单中就放行,在黑名单中就拦截
a)服务提供方解析来源,这里是从请求头中获取(也可以定义其他请求头)
RequestOriginParser
是 Sentinel 提供的接口
@Component public class CustomRequestOriginParser implements RequestOriginParser { @Override public String parseOrigin(HttpServletRequest httpServletRequest) { String source = httpServletRequest.getHeader("source"); System.out.println("请求来源:" + source); return origin; } }
b)调用方定义传递请求头
通过 feign 提供的拦截器,统一处理
/** * 自定义 feign 请求的拦截器,请求发送前执行 */ @Component public class CustomRequestInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { requestTemplate.header("source", "cloud-sentinel-demo"); } }
4、针对来源流控
默认来源是 default 表示对所有应用生效,可以修改设置为只对指定来源的请求生效。
5、系统规则
前文涉及的各种流控规则都是资源(接口)维度的控制,而系统规则是设置整个微服务系统级别的流控规则,粒度更大
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)