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