• Sentinel 概述


    什么是Sentinel

    Sentinel也是Spring Cloud Alibaba的组件

    Sentinel英文翻译"哨兵\门卫"

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

    官网地址

    home

    下载地址

    Releases · alibaba/Sentinel · GitHub

    为什么需要Sentinel

    • 丰富的应用场景

      双11,秒杀,12306抢火车票

    • 完备的实时状态监控

      可以支持显示当前项目各个服务的运行和压力状态,分析出每台服务器处理的秒级别的数据

    • 广泛的开源生态

      很多技术可以和Sentinel进行整合,SpringCloud,Dubbo,而且依赖少配置简单

    • 完善的SPI扩展

      Sentinel支持程序设置各种自定义的规则

    基本配置和限流效果

    我们找一个相对简单的模块测试和观察限流效果

    以csmall-stock-webapi模块为例

    添加pom依赖如下

    1. <dependency>
    2. <groupId>com.alibaba.cloud</groupId>
    3. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    4. </dependency>

    application-dev.yml修改配置如下

    1. spring:
    2. sentinel:
    3. transport:
    4. dashboard: localhost:8080 # 配置Sentinel仪表台的位置
    5. port: 8721 # 真正执行限流的端口也要设置一下,注意这个端口其他微服务项目不能相同

    sentinel.transport.port每个微服务项目不能相同

    下面进行限流操作

    Sentinel限流针对控制层方法也就是说

    我们要到Controller类中的方法上去做设置

    1. @PostMapping("/reduce/count")
    2. @ApiOperation("减少商品库存业务")
    3. // @SentinelResource标记的方法会被Sentinel监控
    4. // ()里面的内容是这个监控的名称,我们可以在"仪表台"中看到
    5. // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    6. @SentinelResource("减少库存方法(控制器)")
    7. public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
    8. stockService.reduceCommodityCount(stockReduceCountDTO);
    9. return JsonResult.ok("商品库存减少完成!");
    10. }

    流控与降级

    使用Sentinel实现QPS或并发线程数进行流控的操作

    但是被流控的请求只有一个错误,没有错误提示,不方便给用户反馈

    应该在开发时,对于被流控的请求给与相关提示

    StockController中编写代码如下

    1. @Autowired
    2. private IStockService stockService;
    3. @PostMapping("/reduce/count")
    4. @ApiOperation("减少商品库存业务")
    5. // @SentinelResource标记的方法会被Sentinel监控
    6. // value的值是这个监控的名称,我们可以在"仪表台"中看到
    7. // blockHandler的值指定了请求被限流时运行的方法名称
    8. @SentinelResource(value = "减少库存方法(控制器)",blockHandler = "blockError")
    9. public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
    10. stockService.reduceCommodityCount(stockReduceCountDTO);
    11. return JsonResult.ok("商品库存减少完成!");
    12. }
    13. // Sentinel 限流方法应该满足如下要求
    14. // 1.必须是public修改
    15. // 2.返回值类型必须和控制方法一致(JsonResult)
    16. // 3.方法名称要和控制器方法限流注解中规定的名称一致(blockError)
    17. // 4.参数列表必须和控制器一致,可以在所以参数后声明BlockException来获得限流异常
    18. public JsonResult blockError(StockReduceCountDTO stockReduceCountDTO,
    19. BlockException e){
    20. return JsonResult.failed(ResponseCode.BAD_REQUEST,"服务器忙,请稍后再试");
    21. }

    上面方法定义了被Sentinel限流时运行的方法

    下面要了解降级的功能

    降级功能和统一异常处理类有相似的地方

    但是降级是Sentinel的功能

    1. @PostMapping("/reduce/count")
    2. @ApiOperation("减少商品库存业务")
    3. // @SentinelResource标记的方法会被Sentinel监控
    4. // value的值是这个监控的名称,我们可以在"仪表台"中看到
    5. // blockHandler的值指定了请求被限流时运行的方法名称
    6. @SentinelResource(value = "减少库存方法(控制器)",blockHandler = "blockError",
    7. fallback = "fallbackError")
    8. public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
    9. // 生成随机出触发降级流程
    10. if(Math.random()<0.5){
    11. throw new
    12. CoolSharkServiceException(ResponseCode.INTERNAL_SERVER_ERROR,"异常");
    13. }
    14. stockService.reduceCommodityCount(stockReduceCountDTO);
    15. return JsonResult.ok("商品库存减少完成!");
    16. }
    17. // 这个方法是Sentinel注解中fallback属性指定的降级方法
    18. // 当前控制器方法运行发生异常时,Sentinel会运行下面的降级方法
    19. // 降级方法中,可以不直接结束请求,而去运行一些代替代码或者补救措施
    20. // 让用户获得最低限度的响应,这个方法也可以添加异常参数
    21. public JsonResult fallbackError(StockReduceCountDTO stockReduceCountDTO){
    22. return JsonResult.failed(ResponseCode.BAD_REQUEST,"因为运行异常,服务降级");
    23. }

    blockHandler和fallback的区别

    两者都是不能正常调用资源返回值的顶替处理逻辑.

    blockHander只能处理BlockException 流控限制之后的逻辑.

    fallback处理的是资源调用异常的降级逻辑.

     

  • 相关阅读:
    每日三题 9.29
    Dubbo+Zookeeper入门实例
    Vue2实现图片预览功能 -- v-viewer:图片查看器
    正确主动关闭websocket,异常关闭处理
    JDK8新特性:Stream流
    Java项目-苍穹外卖-Day11-Apache ECharts数据统计
    大数据讲课笔记1.1 安装配置CentOS
    OpenText Exceed TurboX 通过安全远程访问高性能图形化应用程序和桌面保证业务连续性
    实体对齐模型训练知识储备
    shell脚本将执行结果重定向到指定路径指定文件对应的变量
  • 原文地址:https://blog.csdn.net/ClearDream__/article/details/125465905