基于sentinel实现流控和熔断,自定义 限流异常

流控 : 当QPS >N 时候,当并发线程数>N,则限制不可以调用接口

QPS

QPS每秒查询率(Query Per Second)
  每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。

并发线程数

指定的线程5,并发超过6则开启限流

依赖

<!-- 流控熔断降级sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

配置文件

spring:
   #配置sentinel流量熔断降级
    sentinel:
      transport:
        dashboard: localhost:8080 #sentinel地址

登录sentinel 仪表盘,必须先访问接口,可以显示。

基于sentinel实现流控和熔断,自定义 限流异常

根据按钮 我们先说流控 ,1.qps ,2.线程数 设置固定阀值测试

基于sentinel实现流控和熔断,自定义 限流异常

设置阀值为1,测试 会出现 by sentinel xxxxxxx 返回语句

熔断:

慢调用 指定1秒内 10次请求 >1000ms(1秒) 比例阀值0.8 (百分之80),

异常比例 指定1秒内 10次请求 >异常比例次数 比例阀值0.8 (百分之80)

异常数:指定1秒内 10次请求>异常数

上述配置 则熔断 直接异常方法

基于sentinel实现流控和熔断,自定义 限流异常

自定义 限流异常

使用注解 @SentinelResource(value = “list”,blockHandlerClass = ArticleblockHandler.class, blockHandler = “listException”) 第一个参数 限流名称,方便sentinel配置 不能重复,第二参数指定使用限流异常类,第三个参数指定使用限流异常方法名称

/**
 * @Author: 宋忠瑾
 * @Description: 文章控制层
 * @Date: Create in 17:59 2021/7/26
 */
@RestController
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    /**
     * @param
     * @return
     * @Description 获取视频文章
     * @Method
     * @Author 宋忠瑾
     * @Date 2021/7/26 18:19
     */
    @GetMapping("/list")
    @SentinelResource(value = "list",blockHandlerClass = ArticleblockHandler.class, blockHandler = "listException")
    public Result<List<ArticlePageVO>> list() {
        return Result.data(articleService.getArticle());
    }

    /**
     * 测试方法
     * @return
     */
    @GetMapping("/hello")
    @SentinelResource(value = "hello",blockHandlerClass = ArticleblockHandler.class, blockHandler ="helloException")
    public Result<String> hello() {
        return Result.success("hello");
    }
}

限流异常类 必须是static 修饰的静态方法 参数 使用限流接口方法参数一致必须添加参数(BlockException exception),返回类型必须一致

@Slf4j
public class ArticleblockHandler {

    public static Result listException(BlockException exception) {
        log.error("查询文章服务限流异常",exception.getMessage());
        return Result.fail("查询文章服务限流异常");
    }

    public static Result<String> helloException(BlockException exception){
        log.error("查询文章服务限流异常",exception.getMessage());
        return Result.fail("查询hello方法限流异常");
    }

}

上一篇:idea启动sentinel


下一篇:5--Redis主从复制 ; 哨兵 ; 缓存穿透和雪崩