一、什么是sentinel

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

二、Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

Sentinel 的主要特性:在这里插入图片描述
Sentinel 的开源生态:
在这里插入图片描述

三、sentinel与Hystrix 对比

Sentinel 和 Hystrix 都是基于熔断器模式。都支持基于异常比率来进行熔断,但 Sentinel 更强大,可以基于响应时间、异常比率和异常数来进行熔断降级。

1、隔离设计上对比

Hystrix
Hystrix 提供两种隔离策略,线程池隔离和信号量隔离。

Hystrix 中最推荐的也是最常用的是线程池隔离。线程池隔离的好处是隔离度很高,不会影响其他资源,但是线程本身也有自己的问题,线程上下文切换时比较耗 CPU 资源的,如果对低延时要求比较高,影响还是挺大的,而且创建线程是需要分配内存的,创建的线程越多,需要分配的内存也会更多。而且如果对每个资源都创建一个线程池,那线程切换会带来更大的损耗。

而 Hystrix 的信号量隔离,可以对某个资源调用的并发数进行限制,轻量级的,不用显式创建线程池,但缺点是不能对慢调用进行自动降级,只能等客户端那边超时,还是有可能出现级联阻塞的情形。

Sentinel
Sentinel 可以通过并发线程数模式的流量控制来提供信号量隔离的功能,而且它还具备响应时间的熔断降级模式,防止过多的慢调用占满并发数而影响整个系统。

2、熔断降级的对比

Sentinel 和 Hystrix 都是基于熔断器模式。都支持基于异常比率来进行熔断,但 Sentinel 更强大,可以基于响应时间、异常比率和异常数来进行熔断降级。

3、实时统计的对比

Sentinel 和 Hystrix 都是基于滑动窗口进行实时统计,但 Hystrix 是基于 RxJava 的事件驱动模型,在服务调用成功/失败/超时的时候发布响应的事件,通过一系列的变换和聚合最终得到实时的指标统计数据流,可以被熔断器或 Dashboard 消费。而 Sentinel 是基于 LeapArray 的滑动窗口。

Sentinel Hystrix
隔离策略 信号量隔离 线程池隔离/信号量隔离
熔断降级策略 基于响应时间或失败比率 基于失败比率
实时指标实现 滑动窗口 滑动窗口(基于 RxJava)
规则配置 支持多种数据源 支持多种数据源
扩展性 多个扩展点 插件的形式
基于注解的支持 支持 支持
限流 基于 QPS,支持基于调用关系的限流 不支持
流量整形 支持慢启动、匀速器模式 不支持
系统负载保护 支持 不支持
控制台 开箱即用,可配置规则、查看秒级监控、机器发现等 不完善
常见框架的适配 Servlet、Spring Cloud、Dubbo、gRPC Servlet、Spring Cloud Netflix

四、部署sentinel dashboard

sentinel dashboard 官网说明

docker hub地址

我这里启动镜像是

docker pull bladex/sentinel-dashboard:1.8.0

端口如下图查看
在这里插入图片描述

docker run --name sentinelDashboard -d -p 8858:8858 镜像id

在这里插入图片描述
官网配置说明地址

部署成功后:http://localhost:8858,帐号密码登陆
在这里插入图片描述

五、Springcloud项目配置

  • jar包

    • 父工程引入alibaba cloud
      <!-- 版本根据cloud版本来决定 -->
      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-alibaba-dependencies</artifactId>
          <version>${spring.cloud.alibaba.version}</version>
          <type>pom</type>
          <scope>import</scope>
      </dependency>
      
      版本对应关系
      在这里插入图片描述
    • 子工程
      <!-- 阿里巴巴流量卫兵 -->
      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
      </dependency>
      
  • 配置文件,直接配置dashboard项目地址

    spring:
      cloud:
        sentinel:
          transport:
            dashboard: localhost:8858
    
  1. 实时监控:时时显示qps信息
    在这里插入图片描述
  2. 簇点链路:所有接口信息,及常用规则设置
    在这里插入图片描述
  3. 规则需要在对应的方法上设置后才会限制到规则列表中
    在这里插入图片描述

六、sentinel保护说明

  • sentinel starter 依赖默认情况下就会为所有的HTTP服务提供埋点,就是把请求的url 加入到sentinel监控中所以在springboot 中的Controller都可以受到Sentinel的保护;

  • 可以通过如下配置关闭对微服务的保护:

    #关闭sentinel对controller的url的保护
    spring.cloud.sentinel.filter.enabled=false

  • 可以通过@SentinelResource(value = “app”)注解保护应用;

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

官网

更多内容请关注下一章节

!!!!SpringCloudAlibaba项目集成代码示例!!!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐