Spring Cloud Alibaba 系列之 Sentinel @SentinelResource 注解

1.1 简介

1.1.1 概述

  我们可以发现在之前的 Sentinel 资源名都是请求路径,我们可以使用 @SentinelResource 注解的 value 属性来自定义资源名称。第二个我们也发现我们没有写兜底方法,但是在违反 Sentinel 配置规则时,依然会有兜底方法,这个是 Sentinel 默认的。我们可以使用 @SentinelResource 注解的 blockHandler 属性来指定配置规则的兜底方法。第三个就是方法在抛出异常且未违反配置规则要求时,是不会熔断降级而是直接抛出异常,我们可以使用 @SentinelResource 注解的 fallback 属性来给异常加一个兜底方法。
在这里插入图片描述

1.1.2 相关属性

属性描述
value资源名称,必需项(不能为空)
blockHandler / blockHandlerClassblockHandler 对应处理 BlockException 的函数名称,可选项。
♞ blockHandler 函数访问范围需要是 public;
♞ 返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。
♞ blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
fallback / fallbackClassfallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
♞ 返回值类型必须与原函数返回值类型一致;
♞ 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
♞ fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
defaultFallback(1.6.0 开始)默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:
♞ 返回值类型必须与原函数返回值类型一致;
♞ 方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
♞ defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
exceptionsToIgnore(1.6.0 开始)用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
entryTypeentry 类型,可选项(默认为 EntryType.OUT)

1.8.0 版本开始,defaultFallback 支持在类级别进行配置。
注:1.6.0 之前的版本 fallback 函数只针对降级异常(DegradeException)进行处理,不能针对业务异常进行处理。





1.2 简单使用

1.2.1 仅配置 blockHandler

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/11/18
 * @description
 */
@RestController
@RequestMapping("/provider")
public class ProviderController {

    @GetMapping("/find")
    // 此种方式只会处理配置降级不会处理业务异常
    @SentinelResource(value = "providerFind", blockHandler = "blockHandler")
    public Object find() {
        return "provider";
    }

    public Object blockHandler() {
        return "配置规则降级";
    }
}

1.2.2 仅配置 fallback

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/11/18
 * @description
 */
@RestController
@RequestMapping("/provider")
public class ProviderController {

    @GetMapping("/find")
    // 此种方式配置降级使用默认降级,业务异常使用 fallback
    @SentinelResource(value = "providerFind", fallback = "fallback")
    public Object find() {
        return "provider";
    }

    public Object fallback() {
        return "有异常";
    }

}

1.2.3 同时配置 blockHandler 与 fallback

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/11/18
 * @description
 */
@RestController
@RequestMapping("/provider")
public class ProviderController {

    @GetMapping("/find")
    // 此种配置若二者同时满足,只会进入 blockHandler 处理逻辑。
    @SentinelResource(value = "providerFind", blockHandler = "blockHandler", fallback = "fallback")
    public Object find() {
        return "provider";
    }

    public Object blockHandler() {
        return "违反配置规则";
    }

    public Object fallback() {
        return "有异常";
    }

}

1.2.4 抽取

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/12/1
 * @description 以 blockHandler 为例,fallback 同理
 */
public class MyBlockHandler {

	// 注意对应的函数必需为 static 函数,否则无法解析。
    public static Object blockHandler(BlockException e) {
        e.printStackTrace();
        return "违反配置规则";
    }
}
/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/11/18
 * @description
 */
@RestController
@RequestMapping("/provider")
public class ProviderController {

    @GetMapping("/find")
    @SentinelResource(value="providerFind",blockHandlerClass=MyBlockHandler.class, blockHandler="blockHandler")
    public Object find() {
        return "provider";
    }
}





1.3 配合 feign 使用【与 Hystrix 类似】

1.3.1 配置文件

# 激活 sentinel 对 feign 支持
feign:
  sentinel:
    enabled: true

1.3.2 feign 接口

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/11/5
 * @description
 */
@Component
@FeignClient(value = "ProviderServer", fallback = FeignFallBack.class)
public interface ProviderFeign {

	// 业务类直接调用该接口即可
    @GetMapping("/provider/get/{id}")
    public String get(@PathVariable("id") Integer id);
}
/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/11/6
 * @description
 */
@Component
public class FeignFallBack implements ProviderFeign {
    @Override
    public String get(Integer id) {
        return "降级返回";
    }
}

1.3.3 启动类

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/10/29
 * @description 消费者启动类
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}





1.4 持久化

1.4.1 概述

  我们发现,重启服务之后 Sentinel 配置规则消失了,在生产环境中每次都要重新配置那么将是一个灾难,所以我们需要将配置持久化。这里我们选择将配置持久化到 Nacos 中,当然也可以选择持久化到其他地方。推荐持久化到 Nacos 毕竟 Sentinel 与 Nacos 是一家子。

1.4.2 相关依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

1.4.3 新建 Nacos 配置

在这里插入图片描述

1.4.4 配置说明

[
    {
    	// 资源名称
        "resource": "/hello",
        // 来源应用
        "limitApp": "default",
        // 阈值类型,0 表示线程数,1 表示QPS
        "grade": 1,
        // 单机阀值
        "count": 5,
        // 流控模式,0 表示直接,1 表示关联,2 表示链路
        "strategy": 0,
        // 流控效果,0 表示快速失败,1 表示 Warm Up,2 表示排队等待
        "controlBehavior": 0,
        // 是否集群
        "clusterMode": false
    }
]

1.4.5 测试

  重新启动服务,请求服务让 Sentinel 发现服务之后可以看到,在流控规则中多了一个资源名为 /hello 的规则,这个是从 Nacos 中读取过来的额配置。
在这里插入图片描述


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值