微服务 Sentinel 基础知识及应用

什么是Sentinel

官网地址:链接: link
Sentinel是Spring Cloud Alibaba的组件,英文翻译"哨兵\门卫"

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

为什么需要Sentinel

为了保证服务器运行的稳定性,在请求数到达设计最高值时,将过剩的请求限流,保证在设计的请求数内的请求能够稳定完成处理

  • 丰富的应用场景

    双11,秒杀,12306抢火车票

  • 完备的实时状态监控

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

  • 广泛的开源生态

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

  • 完善的SPI扩展

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

基本配置

下面展示 Sentinel的pom依赖

<!--    Sentinel 依赖    -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

下面展示 yml配置

cloud:
  sentinel:
    transport:
      dashboard: localhost:8080 # 配置sentinel仪表台的位置
      # 执行限流的端口号,每个项目唯一(别的项目例如cart模块,再设置的话就不能用8721)
      port: 8721
  nacos:
    discovery:
      # 配置Nacos所在的位置,用于注册时提交信息
      server-addr: localhost:8848
Sentinel启动

启动之后:打开浏览器http://localhost:8080/
账号和密码都是:sentinel
微服务 Sentinel 基础知识及应用_第1张图片
如果不运行knife4j测试,sentinel的仪表盘不会有任何信息

在第一次运行了减少库存方法之后,sentinel的仪表盘才会出现nacos-stock的信息
微服务 Sentinel 基础知识及应用_第2张图片
微服务 Sentinel 基础知识及应用_第3张图片
选中这个信息点击"簇点链路" ,找到我们编写的"减少库存的方法"点 “+流控”

设置流控规则

  • QPS:是每秒请求数

    单纯的限制在一秒内有多少个请求访问控制器方法

  • 并发线程数:是当前正在使用服务器资源请求线程的数量

    限制的是使用当前服务器的线程数

我们先设置QPS为1也就是每秒请求数超过1时,进行限流

然后我们可以快速双击knife4j减少库存的方法,触发它的流控效果

Sentinel原理

Sentinel的流量管理是在控制器层面的(Controller)
原理是当收到请求时,先让请求经过配置文件中
spring.cloud.sentinel.transport.port设置的端口(每个项目必须唯一)
从Sentinel过一圈,再到自己的代码逻辑内运行,如流量过大,
按照限流规则,可能Sentinel会直接拦截请求,执行快速失败或其他,不再进入原来的代码里

自定义限流方法测试

下面展示 自定义限流方法测试

Controller类中***@SentinelResource***注解中,可以定义处理限流、降级等情况的方法

// @SentinelResource注解标记的控制层方法,会在运行时被Sentinel进行管理
// 在这个控制层方法第一次运行后,可以在Sentinel仪表台界面中设置限流规则
// "减少库存的方法"设置了当前方法在仪表台显示的名称
// blockHandler是指定限流时运行方法的配置
@SentinelResource(value = "减少库存的方法",blockHandler = "blockError")
public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
    // 调用业务逻辑层
    stockService.reduceCommodityCount(stockReduceCountDTO);
    return JsonResult.ok("库存减少已执行!");
}
// Sentinel 自定义限流方法规则
// 1.访问修饰符必须是public
// 2.返回值类型必须和控制器方法一致
// 3.方法名称必须匹配控制器方法blockHandler配置的名称
// 4.参数列表,前面必须和控制器方法一致,后面添加BlockException类型的参数,表示限流方法
public JsonResult blockError(StockReduceCountDTO stockReduceCountDTO,
                             BlockException e){
    // 进这个方法就是被限流的请求,直接返回限流信息即可
    return JsonResult.failed(ResponseCode.INTERNAL_SERVER_ERROR,
                                "服务器忙,请稍后再试");
}
自定义降级方法测试

所谓降级就是正常运行控制器方法的过程中
控制器方法发生了异常,Sentinel支持我们运行别的方法来处理异常,或运行别的业务流程处理
我们也学习过处理控制器异常的统一异常处理类,和我们的降级处理有类似的地方
但是Sentinel降级方法优先级高,而且针对单一控制器方法编写

下面展示 自定义降级方法测试

// @SentinelResource注解标记的控制层方法,会在运行时被Sentinel进行管理
// 在这个控制层方法第一次运行后,可以在Sentinel仪表台界面中设置限流、降级等规则
// "减少库存的方法"设置了当前方法在仪表台显示的名称
// blockHandler是指定限流时运行方法的配置
// fallback 是指当控制器方法运行发生异常时,运行的降级方法的名称
@SentinelResource(value = "减少库存的方法",blockHandler = "blockError",
                    fallback = "fallbackError")
public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){

    // 测试Sentinel降级
    if(Math.random()<0.5){
        // 随机抛出异常,抛出的异常会被降级方法处理
        throw new CoolSharkServiceException(ResponseCode.BAD_REQUEST,"随机异常");
    }
    // 调用业务逻辑层
    stockService.reduceCommodityCount(stockReduceCountDTO);
    return JsonResult.ok("库存减少已执行!");
}

// 限流方法略.....

// 降级方法:上面@SentinelResource中fallback指定的降级方法
// 声明格式:基本和限流方法相同,方法参数不需要添加异常类型
// 当控制器方法运行发送异常时,Sentinel会自动调用这个方法
// 实际业务中,可以是新版的业务发生异常,然后转而运行老版代码的机制
public JsonResult fallbackError(StockReduceCountDTO stockReduceCountDTO){
    // 因为没有老版本代码可用,所以也是返回错误信息
    return JsonResult.failed(ResponseCode.INTERNAL_SERVER_ERROR,
                "运行发生异常,服务降级!");
}
当发生随机异常时,就运行降级方法

当没有发生随机异常时,就正常运行!

你可能感兴趣的:(sentinel,微服务,java)