【sentinel】sentinel 使用

目录

一、介绍

二、如何使用

1、准备工作

sentinel-dashboard

nacos

2、项目结构

3、sentinel 直接使用

4、sentinel + feign 使用

三、@SentinelResource 属性说明

注解介绍


本版本的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 项目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值