摘要:Sentinel是阿里巴巴公司开源的一套面向分布式服务架构的限流和熔断组件,其以流量为切入点,可以为微服务提供流量控制、熔断降级和系统负载保护等功能,使微服务更稳定、更有保障。
Sentinel是阿里巴巴公司开源的一套面向分布式服务架构的限流和熔断组件,其以流量为切入点,可以为微服务提供流量控制、熔断降级和系统负载保护等功能,使微服务更稳定、更有保障。
sentinel诞生于2012年,当时主要用于入口流量控制。经过几年的发展及其在阿里巴巴集团内部的生产实践,Sentinel基本上已经覆盖了阿里巴巴内部的所有核心业务场景。2018年,Sentinel进行了开源,2019年推出了C++版本,2020年推出了Go语言版本。
在Sentinel中有两个基本概念:资源和限流规则。其中,资源是最关键的,Sentinel最终要保护的就是资源。资源可以是应用程序中的任何内容,如由应用程序提供的接口,或由应用程序调用的其他第三方提供的服务,也可以是一段代码或一个方法等。规则可以包括限流的规则、熔断降级的规则及系统保护规则,所有规则可以在管理界面动态并实时地调整。
Sentinel提供的功能如下:
1. 流量控制
一个服务处理请求的能力是有限制的,但是请求到来的时间是随机的。Sentinel根据系统的处理能力,通过灵活组合资源调用关系、系统运行指标(QPS、线程池、系统负载)及控制的效果(直接限流、Warm Up和排队),达到对流量控制的目的。
2. 熔断降级
微服务调用关系复杂,如果某一个链路中的依赖资源出现不稳定的情况,有可能会引发级联故障。Sentinel与Hystrix的熔断原则基本上是一样的,即在链路中某个请求响应时间过长或异常比例上升时,就需要对这个资源进行熔断,让请求快速失败,避免导致级联故障。
Sentinel通过两种手段进行熔断处理,第一种是控制并发线程数,当线程数在特定资源上堆积到一定数量后,则直接拒绝新的请求;第二种是通过响应时间进行降级,当依赖的资源出现响应时间过长时,则拒绝对资源的访问。
3. 系统自适应保护
Sentinel同时提供系统维度的自适应保护能力。当应用服务负载较高的时候,如果还有请求进入,可能会导致系统崩溃,无法响应。
针对这种情况,Sentinel提供了响应的保护机制,让系统的入口流量和负载达到平衡,保证系统在能力范围之内处理最多的请求。为了减少开发的复杂度,Sentinel对当前主流框架如Spring Boot、SpringCloud和Spring WebFlux等都做了适配,可以很方便地整合。
Sentinel主要包括核心库与管理后台。核心库可以单独依赖,但是配合管理后台效果更佳。在使用Sentinel时,需要定义资源,Sentinel提供了定义资源的很多方式,在与Spring Boot结合时,采用了注解@SentinelResource的方式。定义规则可分为限流控制规则(如表6.3所示)、熔断降级规则(如表6.4所示)、系统保护规则(如表6.5所示)、来源访问规则和热点参数规则等。
规则制定后,可以配合Nacos进行持久化,Sentinel提供了统一的API进行规则查询。总的来说,Sentinel具有以下特性:
广泛的实战演练,多次承接阿里巴巴“双十一”大促销的流量场景。
提供了控制面板,可提供完善的实时监控功能。
开源生态,与流行框架容易整合。
slot自定义扩展。
Sentinel的主要工作流程是对每一个资源(Resource)创建一个Entry对象,并且在创建Entry对象的同时创建一系列的插槽(Slot)。不同的插槽有不同的功能。各个插槽的功能如下:
NodeSelectorSlot:通过收集资源路径,将调用路径以树状结构存储起来,然后根据调用路径进行限流降级。
ClusterBuilderSlot:存储资源的统计信息及调用者信息,主要包括该资源的RT、QPS和并发线程数等,这些信息将作为限流和降级的依据。
StatisticSlot:统计运行时指标的监控信息。
FlowSlot:根据制定的限流规则及前面的Slot统计的信息进行限流。
AuthoritySlot:根据配置的黑白名单和调用来源信息进行黑白名单控制。
DegradeSlot:根据制定的降级规则和统计信息进行熔断降级。
SystemSlot:通过系统的状态控制总的入口流量。
如图6.6所示为Sentinel的总体运行流程。同时Sentinel还支持自定义Slot,灵活指定执行顺序,对Slot Chain进行扩展。
FlowSlot(流量控制)主要通过QPS/并发线程数进行限流。对于QPS限流,当请求超过某个阈值时则进行流量控制,主要包括直接拒绝、Warm Up和匀速排队3种方式。直接拒绝方式会抛出FlowException异常;Warm Up是预热/冷启动方式,通过该种方式可以让流量缓慢地增加,最终达到阈值上限,给系统一个预热时间,避免被流量压垮;
匀速排队方式是控制请求的时间间隔,让请求匀速地通过,也就是漏桶算法。
DegradeSlot(熔断策略)主要分为慢调用比例策略、异常比例策略和异常数策略。慢调用比例策略是选用这个比例作为阈值,同时需要设置慢调用响应时间,当达到阈值时自动熔断,经过熔断时长后进入探测恢复状态;异常比例策略则是按照系统出现异常的比例进行熔断;异常数策略是直接统计异常数量,当超过阈值时进行熔断。
Sentinel为使用者提供了开源控制台,主要功能如下:
登录鉴权;
规则管理与发布;
监控应用信息;
查看机器列表与健康状态。
搭建控制台时要先获取控制台的GitHub工程或下载最新的JAR包,
启动命令如下:
java -Dserver.port=8080 -
Dcsp.sentinel.dashboard.server=localhost:
8080 -Dproject.name=sentinel-dashboard -jar sentinel
dashboard.jar
图6.7 控制台登录页面
登录之后,进入某个应用可以看到管理菜单,如图6.8所示。
图6.8 控制台管理菜单
选择“实时监控”选项可以看到资源的QPS监控页面,如图6.9所示。
图6.9 实时监控页面
选择“簇点链路”选项可以看到资源链路信息及最主要的几个规则设置,如流控规则、降级规则、热点规则和系统规则。其中,流控规则设置页面如图6.10所示。阈值类型可以选择QPS或线程数,然后设置阈值,流控效果可以选择快速失败、Warm Up或排队等待。
图6.10 流控规则设置页面
“降级规则”设置页面如图6.11所示。其中,降级策略可以选择RT、异常比例或异常数,然后设置时间窗口。
图6.11 降级规则设置
“热点规则”设置页面如图6.12所示。在其中可以对某些热点参数进行限流控制,或者通过添加参数属性进行限流控制。
图6.12 热点规则设置
“系统规则”设置页面如图6.13所示。首先选择阈值类型,如LOAD、RT、线程数、入口QPS和CPU使用率,然后设置阈值进行系统自适应保护。
图6.13 系统规则设置页面
“集群流控”选项可以设置整个集群的流控规则,“机器列表”选项提供了服务发现功能,可以监控注册机器的健康状态。
Sentinel提供了对Spring Cloud的整合,使用起来非常方便。
(1)在pom.xml文件中添加对Sentinel的依赖,具体如下:
org.springframework.cloud
spring-cloud-starter-alibaba
sentinel
(2)新建bootstrap.yml配置文件,配置Sentinel控制台,代码如下:
spring:
cloud:
sentinel:
enabled: true
transport:
dashboard: localhost:8080
(3)使用注解@SentinelResource定义资源,提供可选的异常处理与fallback配置。@SentinelResource注解包含以下属性:
value:资源名。
entryType:entry类型。
blockHandler/blockHandlerClass:限流类与方法。限流方法需要与资源方法参数相同且增加BlockException参数。
fallback/fallbackClass:熔断类与方法。熔断方法需要增加Throwable参数。
(4)配置SentinelResourceAspect类,代码如下:
//声明Sentinel切面
@Configuration
public class SentinelConfig {
@Bean
public SentinelResourceAspect sentinelResourceAspect {
return new SentinelResourceAspect;
}
}
Sentinel的配置规则都是存储到内存中,并没有持久化,因此需要提供一个持久化的解决方案。通过和Nacos整合可以将Sentinel配置规则推送到Nacos上进行存储。具体步骤如下:
(1)在应用中添加依赖包sentinel-datasource-nacos,具体代码如下:
com.alibaba.csp
sentinel-datasource-nacos
(2)在配置文件中添加Nacos属性配置,具体代码如下:
spring:
cloud:
sentinel:
datasource:
flow:
nacos:
server-addr: 127.0.0.1:8848
dataId: test-flow-rules
groupId: test
rule-type: flow
degrade:
nacos:
208 server-addr: 127.0.0.1:8848
dataId: test-degrade-rules
groupId: test
rule-type: degrade
system:
nacos:
dataId: test-system-rules
groupId: test
rule-type: system
authority:
nacos:
dataId: test-authority-rules
groupId: test
rule-type: authority
param-flow:
nacos:
dataId: test-param-flow-rules
groupId: test
rule-type: param-flow
完成以上配置后,重新启动Nacos管理后台即可看到配置的Sentinel规则数据信息。
来源:大数据架构师