目录
本版本的sentinel是以1.8.0版本为准。
一、介绍
sentinel是现阶段使用比较简单、功能比较齐全的一个轻量级流量控制产品,主要以流量为切入点,从流量控制、熔断降级、系统负载等多个维度来帮助我们保护服务的稳定性。
二、如何使用
1、准备工作
使用sentinel时需要:sentinel-dashboard和nacos服务
sentinel-dashboard
安装和使用:【sentinel】docker sentinel 安装_yilishuku的专栏-CSDN博客
sentinel-dashboard是sentinel的中间件服务,提供了机器发现、配置规则、查看实时监控、查看调用链路信息等功能,使得用户可以非常方便地去查看监控和进行配置。
nacos
nacos 可以给sentinel做持久化功能,修改nacos配置文件sentinel规则直接生效
eagle-sentinel-ap - eagle-check-ap-flow.json
[
{
"resource":"sentinel-check",
"limitApp":"default",
"grade":1,
"count":3,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}
]
eagle-sentinel-bp - eagle-sentinel-bp-flow.json
[
{
"resource":"sentinel-feign-check",
"limitApp":"default",
"grade":1,
"count":50,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}
]
- eagle-check-bp-degrade.json
[
{
"resource":"sentinel-feign-check",
"limitApp":"default",
"grade":1,
"count":0.5,
"timeWindow":30,
"statIntervalMs":1000,
"minRequestAmount":10,
"slowRatioThreshold":1
}
]
2、项目结构
3、sentinel 直接使用
eagle-sentinel-ap 项目 SentinelCheckService
@Slf4j
@Service
@RequiredArgsConstructor
public class SentinelCheckService {
private final SentinelBpFeign sentinelBpFeign;
@SentinelResource(value = "sentinel-check",
blockHandlerClass = SentinelCheckServiceHandler.class, blockHandler = "checkBlockException",
fallbackClass = SentinelCheckServiceHandler.class, fallback = "fallback")
public ResultMessage check(Long id) {
throw new IndexOutOfBoundsException("失败了");
}
@SentinelResource(value = "sentinel-check",
blockHandlerClass = SentinelCheckServiceHandler.class, blockHandler = "checkBlockException",
fallbackClass = SentinelCheckServiceHandler.class, fallback = "fallback",
exceptionsToIgnore = IndexOutOfBoundsException.class)
public ResultMessage checkIgnore(Long id) {
throw new IndexOutOfBoundsException("失败了");
}
public ResultMessage<Boolean> checkFeign() {
return sentinelBpFeign.check();
}
}
4、sentinel + feign 使用
配置feign允许sentinel
feign:
sentinel:
enabled: true
编写feign客户端,SentinelBpFeign
@RequestMapping(ApiConstant.BP_CHECK_ENDPOINT)
@FeignClient(name = "eagle-sentinel-bp", fallbackFactory = SentinelBpFeignFallback.class)
public interface SentinelBpFeign {
/**
* feign 远程调用测试sentinel
*
* @return Boolean 成功失败
*/
@GetMapping("")
ResultMessage<Boolean> check();
}
SentinelBpFeignFallback.java, sentinel使用feign时必须使用FallbackFactory
public class SentinelBpFeignFallback implements FallbackFactory<SentinelBpFeign> {
@Override
public SentinelBpFeign create(Throwable cause) {
return new SentinelBpFeign() {
@Override
public ResultMessage<Boolean> check() {
return ResultMessage.error("S300", "服务异常");
}
};
}
}
SentinelBpController.java, feign 里面设置了fallback主要是为了捕获所有的异常 ,而SentinelBpController有设置了blockHandlerClass和blockHandler是为了捕获系统容灾功能被触发,有些为了简单,SentinelBpController 只添加@SentinelResource(value = "sentinel-feign-check")也可以。但是这种方法无法区分是是容灾被触发还是方法里面的异常被触发
@RestController
@RequiredArgsConstructor
@Api(value = ApiConstant.BP_CHECK_ENDPOINT, tags = "sentinel 测试 模块")
public class SentinelBpController implements SentinelBpFeign {
private int degradeStatus = 0;
@Override
@ApiOperation(value = "checkFeign bp")
@SentinelResource(value = "sentinel-feign-check",
blockHandlerClass = SentinelCheckServiceHandler.class, blockHandler = "checkBlockException")
public ResultMessage<Boolean> check() {
if (degradeStatus == 0) {
degradeStatus = 1;
return ResultMessage.success(true);
}
if (degradeStatus == 1) {
degradeStatus = 2;
throw new NullArgumentException("抛出异常");
}
if (degradeStatus == 2) {
degradeStatus = 0;
throw new NullArgumentException("抛出异常");
}
return ResultMessage.success(true);
}
}
注意:当前方法如果有参数一定要和blockHandler一一对应,不然blockHandler注解无效。
三、@SentinelResource 属性说明
注意:注解方式埋点不支持 private 方法。
注解介绍
@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。
@SentinelResource 注解包含以下属性:
1.value:资源名称,必需项(不能为空)
2.entryType:entry 类型,可选项(默认为 EntryType.OUT)
3.blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
4.fallback/fallbackClass:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了exceptionsToIgnore里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
- 返回值类型必须与原函数返回值类型一致;
- 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
- fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
5.defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了exceptionsToIgnore里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:
- 返回值类型必须与原函数返回值类型一致;
- 方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
- defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
5.exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
1.8.0 版本开始,defaultFallback 支持在类级别进行配置。
注:1.6.0 之前的版本 fallback 函数只针对降级异常(DegradeException)进行处理,不能针对业务异常进行处理。
特别地,若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。若未配置 blockHandler、fallback 和 defaultFallback,则被限流降级时会将 BlockException 直接抛出(若方法本身未定义 throws BlockException 则会被 JVM 包装一层 UndeclaredThrowableException)。
SentinelResource参考地址:https://developer.51cto.com/art/202103/652073.htm
git地址:eagle-example: 项目例子集合 eagle-sentinel 项目