Spring Cloud框架集之Sentinel(哨兵/守卫)

Sentinel是Spring Cloud Alibaba的组件,用于服务稳定性的保护,包括流量控制、熔断降级和系统负载保护。适用于高并发场景如秒杀、抢购。Sentinel提供实时监控、丰富的应用场景、开放的生态和SPI扩展。基本配置涉及添加依赖和配置端口,限流在Controller层设置。此外,Sentinel的熔断降级基于并发线程数,控制台可进行规则管理和推送,动态规则扩展支持集成多种数据源。

什么是Sentinel

Sentinel也是Spring Cloud Alibaba的组件

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

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

官网地址

https://sentinelguard.io/zh-cn/

下载地址

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

默认端口号8080

 

为什么需要Sentinel

  • 丰富的应用场景

    双11,秒杀,12306抢火车票

  • 完备的实时状态监控

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

  • 广泛的开源生态

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

  • 完善的SPI扩展

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

 基本配置

添加pom依赖如下

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

application-dev.yml修改配置如下

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        dashboard: localhost:8080 # 配置Sentinel仪表台的位置
        port: 8721 # 真正执行限流的端口也要设置一下,注意这个端口其他微服务项目不能相同

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

下面进行限流操作

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

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

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

限流

流量控制有以下几个角度:

  • 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
  • 运行指标,例如QPS、线程池、系统负载等;
  • 控制的效果,例如直接限流、冷启动、排队等。
  • @Autowired
    private IStockService stockService;
    @PostMapping("/reduce/count")
    @ApiOperation("减少商品库存业务")
    // @SentinelResource标记的方法会被Sentinel监控
    // value的值是这个监控的名称,我们可以在"仪表台"中看到
    // blockHandler的值指定了请求被限流时运行的方法名称
    @SentinelResource(value = "减少库存方法(控制器)",blockHandler = "blockError")
    // Sentinel 限流方法应该满足如下要求
    // 1.必须是public修改
    // 2.返回值类型必须和控制方法一致(JsonResult)
    // 3.方法名称要和控制器方法限流注解中规定的名称一致(blockError)
    // 4.参数列表必须和控制器一致,可以在所以参数后声明BlockException来获得限流异常
    public JsonResult blockError(StockReduceCountDTO stockReduceCountDTO,
                                 BlockException e){
        return JsonResult.failed(ResponseCode.BAD_REQUEST,"服务器忙,请稍后再试");
    }

熔断降级

Sentinel采用了与Hystriⅸ不一样的方法:

  • 通过并发线程数进行限制(HySⅸ采用线程池隔离,需要预先创建线程池);
  • 通过响应时间对资源进行降级。
  • @PostMapping("/reduce/count")
    @ApiOperation("减少商品库存业务")
    // @SentinelResource标记的方法会被Sentinel监控
    // value的值是这个监控的名称,我们可以在"仪表台"中看到
    // blockHandler的值指定了请求被限流时运行的方法名称
    @SentinelResource(value = "减少库存方法(控制器)",blockHandler = "blockError",
                        fallback = "fallbackError")
    public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
        // 生成随机出触发降级流程
        if(Math.random()<0.5){
            throw new 
              CoolSharkServiceException(ResponseCode.INTERNAL_SERVER_ERROR,"异常");
        }
        stockService.reduceCommodityCount(stockReduceCountDTO);
        return JsonResult.ok("商品库存减少完成!");
    }
    // 这个方法是Sentinel注解中fallback属性指定的降级方法
    // 当前控制器方法运行发生异常时,Sentinel会运行下面的降级方法
    // 降级方法中,可以不直接结束请求,而去运行一些代替代码或者补救措施
    // 让用户获得最低限度的响应
    public JsonResult fallbackError(StockReduceCountDTO stockReduceCountDTO){
        return JsonResult.failed(ResponseCode.BAD_REQUEST,"因为运行异常,服务降级");
    }

控制台

Sentinel控制台基于Spring Boot开发,打包后可直接运行。它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。

动态规则扩展

Sentinel提供两种方式修改规则:

  • 通过API直接修改(loadRules),这种方式只修改内存数据,一股线上环境不推荐;
  • 通过DataSource适配不同数据源修改,例如集成Nacos、.Apoo、Zookeeper等,这样一来控制台便可以将变更的规测推送到统一的规则中心做持久化存储。

---------------------------------------

blockHandler和fallback的区别

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙慧德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值