Sentinel 通过@SentinelResource实现流控

@SentinelResource注解实现

在定义了资源点之后,我们可以通过Dashboard来设置限流和降级策略来对资源点进行保护。同时还能 通过@SentinelResource来指定出现异常时的处理策略。

@SentinelResource用于定义资源,并提供可选的异常处理和fallback 配置项。其主要参数如下:

value资源名称
entryTypeentry类型,标记流量的方向,取值IN/OUT,默认是OUT
blockHandler处理BlockException的函数名称,函数要求:<br>1.必须是public<br/>2.返回类型 参数与原方法一致<br/>3.默认需和原方法在同一个类中。若希望使用其他类的函数,可配置blockHandlerClass,并指定blockHandlerClass里面的方法。
blockHandlerClass存放blockHandler的类,对应的处理函数必须static修饰。
fallback用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。函数要求:<br/>1.返回类型与原方法一致<br/>2.参数类型需要和原方法相匹配<br/>3.默认需和原方法在同一个类中。若希望使用其他类的函数,可配置fallbackClass ,并指定fallbackClass里面的方法。
fallbackClass存放fallback的类。对应的处理函数必须static修饰。
defaultFallback用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求:<br/>1.返回类型与原方法一致<br/>2.方法参数列表为空,或者有一个Throwable类型的参数。<br/>3.默认需要和原方法在同一个类中。若希望使用其他类的函数,可配置fallbackClass ,并指定 fallbackClass 里面的方法。
exceptionsToIgnore指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出。
exceptionsToTrace需要trace的异常

创建新的Model

1.引入依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>1.8.1</version>
</dependency>

2.切面支持

其实通过切面的方式,实现代码api的流控
这个必须有,否则统一异常处理策略无法调用

@Configuration
public class SentinelAspectConfiguration {

    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}

3.代码编写

@Slf4j
@RestController
public class SentionelController {

    @GetMapping("/getResouce/{id}")
    @SentinelResource(value = "testResource",
            fallback = "fallback",fallbackClass = CommonException.class,
            blockHandler = "blockHandler",blockHandlerClass = CommonException.class)
    public Result testResource(@PathVariable("id") Integer id){
if (Integer.compare(id,Integer.parseInt("3")) == -1){
    throw new IllegalStateException("参数异常");
}
        log.info("业务代码");
        return Result.ok(0,"测试注解流控");
    }


    /**
     * 定义流控规则
     */
    @PostConstruct
    private static void initFlowRules(){
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        //设置受保护的资源
        rule.setResource("testResource");
        // 设置流控规则 QPS
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 设置受保护的资源阈值
        rule.setCount(1);
        rules.add(rule);
        // 加载配置好的规则
        FlowRuleManager.loadRules(rules);
    }
}
public class CommonException {

    public static Result fallback(Integer id,Throwable throwable){
        return  Result.error(1,"业务异常返回");

    }

    public static Result blockHandler(Integer id, BlockException exception){
        return  Result.error(2,"流控返回");

    }
}

4.结果测试

正常请求

在这里插入图片描述

流控测试

在这里插入图片描述

业务异常

在这里插入图片描述

5.整合到springBoot

5.1添加依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
5.2添加配置
server:
  port: 8001
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        service: msb-sentinel
    sentinel:
      transport:
        port: 8719 #用来跟控制台交互的地址,随意一个未使用的都可以
        dashboard: localhost:8080 # 指定控制台服务的地址
  application:
    name: msb-sentinel

在这里插入图片描述

5.3 引入控制台

Sentinel 提供一个轻量级的控制台, 它提供机器发现、单机资源实时监控以及规则管理等功能。

第1步 下载jar包,解压到文件夹

https://github.com/alibaba/Sentinel/releases

第2步 启动控制台

直接使用jar命令启动项目(控制台本身是一个SpringBoot项目)
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar

把dashboard自己也当成一个资源加入到了dashboard中来进行监控,如果不想把dashboard自己加入控制台监控可以使用简单启动指令如下:

java -Dserver.port=8080 -jar sentinel-dashboard-1.8.1.jar

第3步: 访问控制台
用户可以通过如下参数进行配置:

  • Dsentinel.dashboard.auth.username=sentinel 用于指定控制台的登录用户名为 sentinel;

  • Dsentinel.dashboard.auth.password=123456 用于指定控制台的登录密码为 123456;如果省略这两个参数,默认用户和密码均为 sentinel;

  • Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;

访问http://localhost:8080/#/login ,默认用户名密码: sentinel/sentinel

Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包,所以要确保客户端有访问量

在这里插入图片描述
补充:了解控制台的使用原理

Sentinel的控制台其实就是一个SpringBoot编写的程序。我们需要将我们的微服务程序注册到控制台上, 即在微服务中指定控制台的地址, 并且还要开启一个跟控制台传递数据的端口, 控制台也可以通过此端口调用微服务中的监控程序获取微服务的各种信息。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值