Spring Cloud Alibaba Sentinel - 分布式系统的流量防卫兵

282 阅读7分钟

🌈往期回顾

第一期:Spring Cloud Alibaba前景如何?

第二期:Spring Cloud Alibaba Nacos服务治理

前段时间,Netflix宣布Hystrix不再处于积极开发阶段,进入维护模式 ,而Spring Cloud亦宣布Spring Cloud Netflix进入维护状态,后续不再进行更新已成为事实。作为开发者的我们,如何使用极简的方式替换Hystrix成为首要解决的问题。

image.png

一、Sentinel 是什么?

Spring Cloud Alibaba Sentinel主要是从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性,实现消息的削峰填谷、集群的流量控制等。

1.1 Sentinel具有如下特性:

  • 丰富的应用场景:承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀,可以实时熔断下游不可用应用;
  • 完备的实时监控:同时提供实时的监控功能。可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况;
  • 广泛的开源生态:提供开箱即用的与其它开源框架/库的整合模块,例如与Spring CloudDubbogRPC 的整合;
  • 完善的SPI扩展点:提供简单易用、完善的SPI扩展点。您可以通过实现扩展点,快速的定制逻辑。

1.2 一张图片展示Sentinel的核心作用

image.png

具体Sentinel的底层的运作原理是怎样的,可以参考一下 How-Sentinel-Works

1.3 Sentinel核心概念

Sentinel有两个关键概念,分别是:资源、规则;

  • 资源可以是任何的东西,例如:服务、方法、甚至是代码片段,一旦被Sentinel封装,它就被定义为资源,可以申请Sentinel提供的保护。
  • 规则指的是,Sentinel保护资源的方式由规则定义,例如流控制、并发和断路规则,规则可以动态改变,实时生效。

二、雪崩效应

类似HystrixSentinel限流熔断中间件,主要是用于解决高并发场景下的突发流量和服务熔断的问题,突发流量我们都知道,那什么是雪崩效应呢? 在微服务架构中,我们将业务拆分成一个个服务,服务于服务之间通过远程调用的方式实现接口调用,但是由于网络的或者服务自身的原因,服务并不能保证100%可用,如果被调用服务出现问题,上游的调用服务就会出现网络延迟,此时若有大量的请求涌入,会导致任务线程阻塞堆积,最终导致调用服务也瘫痪,由于服务于服务之间的依赖性,故障会传播,最终会导致整一个微服务系统崩溃不可用,这就是服务故障的雪崩效应,如下图所示:

雪崩效应.png

上图的意思是:假设当C服务挂了,此时B服务还在不停的调用C服务接口,那么B服务发往C服务的请求就会被强制等待,知道请求超时,而在Java程序里面,一次请求往往对应一个线程,如果请求被强制等待以为了线程就会被强制阻塞,一直到请求超时的时候,这个线程才会被释放,如果是在高并发场景下,阻塞的线程就会越来越多,而线程一旦达到服务器资源的最大线程数,那边这个服务就会出现CPU飙升或者内存不足的请求,因此无法再创建线程,导致B服务也挂了。

💨因此,雪崩效应往往是服务消费者没有做好容错而导致的!

三、常见的容错方案

一般要防止雪崩效应,我们就要做好服务的容错,失败了就是保护自己不被别的服务拖垮的一下措施,下面介绍一下场常见的服务容错思路和组件。

3.1常见的容错思路

常见的容错思路有隔离、超时、限流、熔断、降级这几种,下面分别介绍一下。

  • 隔离 它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,没有强依赖,当有故障发生时,能将问题和影响隔离在某个模块内部,而不阔少风险,不波及其他模块,不影响整体的系统服务,场景的隔离方式有:线程池隔离信号量隔离

  • 超时 在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游为做出响应,就断开请求,释放掉线程。

  • 限流 限流就是限制系统的输入和输出流量从而达到保护系统的目的,为了保证系统的稳固运行,一旦达到了需要限制阈值,就需要限制流量并采取少量的措施以完成限制流量的目的。

  • 熔断 当下游服务因访问压力过大而响应变慢或者失败,上游服务为了保护系统的整体可用性,可以暂时切断对下游服务的调用,这种牺牲局部,保全整体的措施被称为熔断

  • 降级 降级其实就是为服务提供一个托底方案,一旦服务无法正常调用,就使用托底方案。(也可以理解为备用方案)

3.2常见的容错组件

  • Hystrix Hystrix是有Netflflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库。防止级联失败,从而提升系统的可用性容错性
  • Sentinel Sentinel是阿里巴巴开源的一款断路器实现,本身在阿里内部已经被大规模采用,非常稳定。
  • Resilience4J Resilience4J是一款非常轻量级、简单、并且文档非常清晰、丰富的熔断工具,这也是Hystrix官方推荐的替代产品,不仅如此,Resilience4J还原生支持Spring Boot 1.x/2.x版本,而且健康也支持和prometheus等多款主流产品进行整合。

实际上,随着Hystrix宣布停止维护,业界还有其他的同类型产品,各有优势,具体的功能差异可以参考: 从-Hystrix-迁移到-Sentinel#功能对比

下面是三个组件在各个方面的对比:

容错组件对比.png

Sentinel同时也提供了从Hystrix迁移到Sentinel的GuideLine指引:

image.png

目前,Sentinel在 Spring Cloud Alibaba中已适配Spring Cloud体系,完全可用来替代 Hystrix 的功能。不仅如此,阿里内部很多产品线都已使用Sentinel实现限流降级,Sentinel是经过生产流量大规模验证的。

四、Sentinel接入

4.1 引入pom依赖

要想使用Spring Cloud Alibaba Sentinel,需添加如下依赖:

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

4.2 获取Sentinel控制台

Sentinel提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能

可以从 release 页面 下载最新版本的控制台 jar 包。

image.png

4.3 添加配置

sentinel:
  transport:
    # 指定sentinel控制台地址
    dashboard: localhost:8080

4.4 启动sentinel

使用如下命令启动控制台:

java -Dserver.port=8088 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.3.jar

其中 -Dserver.port=8088 用于指定Sentinel控制台端口为 8088

image.png

启动成功,访问 http://localhost:8088 , 默认用户名和密码都是 sentinel

image.png

Spring Cloud Alibaba Sentinel Wiki: github.com/alibaba/spr…

4.5 兼容feign

application.yml 中添加feign.sentinel.enabled=true 即可为Feign启用Sentinel支持:

五、Sentinel流控规则

image.png

sentinel限流类型主要有两种:1、按QPS限流,2、按并发线程数限流。 如果选择QPS,然后设置单机阈值为1,表示该接口每秒QPS为1,当超过阈值就会触发流控,默认Sentinel返回:Blocked By Sentinel(flow limiting)

sentinel流控模式分为三种:直接、关联、链路,默认是直接,实际上关联的意思是:当关联的请求api路径存在并发调用的时候,sentinel也会对当前资源做限流。

sentinel流控效果主要分为三种:快速失败、Warm Up、排队等待。

参考