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 慢调用比例

image

image

上面规则为:单位时间内请求响应时间超过 1.5s 的请求大于 3 个时,对接口进行熔断,熔断时间为 10s,单位时间内请求数大于 5 有效

1.2 异常比例

image

1.3 异常数

image

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";
}
}

image

指定参数值进行限流,编辑热点规则项,修改高级选项

参数类型目前仅支持基本数据类型和 String 类型,不支持对象类型

image

3、权限规则

官方叫做黑白名单控制

  • 配置了白名单的资源只能允许配置的应用访问,拒绝其他应用的访问
  • 配置了黑名单的资源不允许配置的应用访问,允许其他应用访问

一个资源只能配置一个白名单或黑名单

黑白名单的配置是应用级别(origin)

image

上面规则只是配置给了资源提供方,要想规则生效,还得需要调用方提供请求来源(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 表示对所有应用生效,可以修改设置为只对指定来源的请求生效。

image

5、系统规则

前文涉及的各种流控规则都是资源(接口)维度的控制,而系统规则是设置整个微服务系统级别的流控规则,粒度更大

posted @   originyuan  阅读(262)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示