🌈往期回顾
第一期:Spring Cloud Alibaba前景如何?
第二期:Spring Cloud Alibaba Nacos服务治理
前段时间,Netflix
宣布Hystrix
不再处于积极开发阶段,进入维护模式 ,而Spring Cloud
亦宣布Spring Cloud Netflix
进入维护状态,后续不再进行更新已成为事实。作为开发者的我们,如何使用极简的方式替换Hystrix
成为首要解决的问题。
一、Sentinel 是什么?
Spring Cloud Alibaba Sentinel
主要是从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性,实现消息的削峰填谷、集群的流量控制等。
1.1 Sentinel具有如下特性:
- 丰富的应用场景:承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀,可以实时熔断下游不可用应用;
- 完备的实时监控:同时提供实时的监控功能。可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况;
- 广泛的开源生态:提供开箱即用的与其它开源框架/库的整合模块,例如与
Spring Cloud
、Dubbo
、gRPC
的整合; - 完善的
SPI
扩展点:提供简单易用、完善的SPI
扩展点。您可以通过实现扩展点,快速的定制逻辑。
1.2 一张图片展示Sentinel的核心作用
具体Sentinel的底层的运作原理是怎样的,可以参考一下 How-Sentinel-Works
1.3 Sentinel核心概念
Sentinel有两个关键概念,分别是:资源、规则;
- 资源可以是任何的东西,例如:服务、方法、甚至是代码片段,一旦被Sentinel封装,它就被定义为资源,可以申请Sentinel提供的保护。
- 规则指的是,Sentinel保护资源的方式由规则定义,例如流控制、并发和断路规则,规则可以动态改变,实时生效。
二、雪崩效应
类似Hystrix
、Sentinel
限流熔断中间件,主要是用于解决高并发场景下的突发流量和服务熔断的问题,突发流量我们都知道,那什么是雪崩效应
呢? 在微服务架构中,我们将业务拆分成一个个服务,服务于服务之间通过远程调用的方式实现接口调用,但是由于网络的或者服务自身的原因,服务并不能保证100%可用,如果被调用服务出现问题,上游的调用服务就会出现网络延迟,此时若有大量的请求涌入,会导致任务线程阻塞堆积,最终导致调用服务也瘫痪,由于服务于服务之间的依赖性,故障会传播,最终会导致整一个微服务系统崩溃不可用,这就是服务故障的雪崩效应
,如下图所示:
上图的意思是:假设当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#功能对比
下面是三个组件在各个方面的对比:
Sentinel同时也提供了从Hystrix迁移到Sentinel的GuideLine指引:
目前,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 包。
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
。
启动成功,访问 http://localhost:8088 , 默认用户名和密码都是 sentinel
Spring Cloud Alibaba Sentinel Wiki: github.com/alibaba/spr…
4.5 兼容feign
在application.yml
中添加feign.sentinel.enabled=true
即可为Feign
启用Sentinel
支持:
五、Sentinel流控规则
sentinel
限流类型主要有两种:1、按QPS限流,2、按并发线程数限流。 如果选择QPS,然后设置单机阈值
为1,表示该接口每秒QPS为1,当超过阈值就会触发流控,默认Sentinel返回:Blocked By Sentinel(flow limiting)
。
sentinel
流控模式分为三种:直接、关联、链路,默认是直接,实际上关联的意思是:当关联的请求api路径存在并发调用的时候,sentinel也会对当前资源做限流。
sentinel
流控效果主要分为三种:快速失败、Warm Up、排队等待。