认识Sentinel

2022-09-15 14:40:00 浏览数 (1)

1、Sentinel概述

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

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

1.2、Sentinel特征

  • 丰富的应用场景:Sentinel是阿里巴巴在生产环境中使用的产品,应用在近10年来的"双十一"大促流量场景中,实现了秒杀(将突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等功能
  • 完备的实时监控:Sentinel提供了实时监控功能。在控制台中,不仅可以看到接入的单台机器的秒级数据,还可以看到500以下规模的集群的运行情况的汇总数据
  • 广泛的开源生态:Sentinel提供了"开箱即用"的、可与其他开源框架/库整合的模块,例如:可以与Spring Cloud、Dubbo、gRPC进行整合
  • 完善的SPI扩展点:Sentinel提供了SPI(Service Provider Interface 一种服务发现机制)扩展点。它可以快速地定制逻辑,例如定制规则管理、适配数据源等

1.3、Sentinel核心概念

  • 资源:Sentinel控制和保护的对象即"资源",它是Sentinel中一个关键的概念。它可以是Java应用程序中的任何内容,例如,由应用程序提供的服务、应用程序调用的其他应用提供的服务,甚至是通过Sentinel API定义的代码
  • 规则:有流量控制、熔断降级及系统保护规则,可以动态调整这些规则
  • Context:Sentinel处理的上下文
  • Node:它统计资源运行时的各种数据。一个Resource(资源)在同一个Context中有且仅有一个DefaultNode,一个Resource全局有且仅有一个ClusterNode
  • Entry:代表对资源的一次访问。每访问一个资源都会创建一个Entry
  • ProcessorSlotChain:由各个处理插槽组成的处理插槽链。每个资源在整个服务中对应一个处理插槽链
  • Rule:用户定义的各种规则
  • RuleManager:加载并管理Rule
  • Slot:插槽。Sentinel的工作流程就是围绕一个个插槽所组成的插槽链来展开的。每个插槽都有自己的职责,它们各司其职,完美地配置合,通过一定的编排顺序来达到最终限流、降级的目的

2、客户端接入控制台

客户端需要引入Transport模块来与Sentinel控制台进行通信。可以通过pom.xml引入JAR包

代码语言:javascript复制
		<dependency>
			<groupId>com.alibaba.csp</groupId>
			<artifactId>sentinel-transport-simple-http</artifactId>
		</dependency>

3、支持Zuul

Sentinel支持Zuul,但需要额外加上Sentinel对网关支持的依赖

代码语言:javascript复制
		<!--Sentinel的依赖-->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
		</dependency>
		<!--Sentinel对网关支持的依赖-->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
		</dependency>
		<!--Zull的依赖-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
		</dependency>

4、支持Spring Cloud Gateway

Sentinel支持Spring Cloud Gateway,但需要额外加上Sentinel对网关支持的依赖

代码语言:javascript复制
		<!--Sentinel的依赖-->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
		</dependency>
		<!--Sentinel对网关支持的依赖-->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
		</dependency>
		<!--Spring Cloud Gateway的依赖-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-gateway</artifactId>
		</dependency>

5、支持Endpoint

在使用Endpoint(端点)之前,需要在Maven中添加Actuator依赖,并在配置文件中开启对Endpoint的访问支持。

在Sentinel Endpoint中暴露的信息有:规则信息、日志目录、当前实例的IP地址、Sentinel Dashboard地址、应用与Sentinel Dashboard的心跳频率等。

6、安装和启动Sentinel

步骤:

1、下载Sentinel客户端

https://github.com/alibaba/Sentinel/releases

2、启动控制台

代码语言:javascript复制
java -jar sentinel-dashboard.jar

3、进入控制台

访问http://localhost:8080访问控制台,账号和密码都是sentinel

7、流控规则

进入控制台后,单击左侧导航栏中的"流控规则"按钮可以新建流控规则

流控规则的参数:

参数名

说明

资源名

限流规则的作用对象,如:@SentinelResource中Value字段的值、相对URI、其他图片文件资源名

流控应用

流控针对的调用来源(服务级别)。若为default,则不区分调用来源

阀值类型

QPS(每秒查询率)或线程数

单机阀值

限流阀值。超过这个值就执行流控规则

流控模式

直接、关联、链路

流控方式

直接拒绝、Warm Up、匀速排队

7.1、流控模式

基于调用关系的流量控制有3种模式:

  • 直接:直接对资源本身进行流量控制
  • 关联:如果多个资源之间具有资源争抢或者依赖关系,则需要设置关联模式。当关联的资源达到阀值时,会限流某个资源的使用,让出系统资源给关联的资源
  • 链路:资源通过调用关系构成一条链路

7.2、流控方式

  • 直接拒绝:当QPS或线程数超过规则的阀值后,新的请求会被拒绝,抛出FlowException。这种方式适用于已经知道系统处理能力的情况
  • Warm Up:流量突然增加可能把系统压垮。可以让通过的流量缓慢增加,在一定时间内逐渐增加到阀值上限,给系统一个预热(Warm Up)时间,避免系统突然被压垮
  • 匀速排列:严格控制请求通过的间隔时间,让请求均速通过。这种方式主要用于处理间隔性突发的流量。如果在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,则可以让这些请求在接下来的空闲期间被逐渐处理,而不是在第一秒直接拒绝多余的请求

8、降级规则

Sentinel还提供了降级规则来处理流控

重要概念:

  • RT(Response Time):当请求的时间大于阀值时,断路器打开,返回请求失败,直到时间窗口设置的时间结束后才关闭降级。RT默认上限是4900ms
  • 异常比例:资源接近1分钟的异常数目超过阀值后会进行降级。它统计时间窗口是"分钟"级别,所以时间窗口最好大于60s,异常比率的阀值范围是[0.0,1.0],代表0-100%

9、系统规则

系统保护规则是应用整体维度,而不是资源维度。它仅对入口流量生效。

阀值类型:

  • LOAD:当系统LOAD(一分钟的负载)超过阀值,且系统当前的并发线程数超过系统容量时才会触发系统保护
  • RT:所有入口流量的平均RT
  • 线程数:所有入口流量的并发线程数
  • QPS:所有入口流量的QPS

0 人点赞