一、Sentinel是什么?
Sentinel是分布式系统的流量防卫兵!
什么意思呢? 在分布式系统中,各个节点之间往往会存在调用关系。比如电商系统中,订单节点A需要调用库存节点B的减库存接口,但是在库存节点B挂掉了,或者库存节点B负载极高,短时间内无法response,就可能导致订单节点也跟着异常或停滞。
为了防止这种,节点B挂掉(或停滞)导致节点A挂掉(或停滞),又进一步导致其他节点一同发生连锁反应,Hystrix闪亮登场。
嗯……说好的Sentinel,Hystrix是个什么鬼?
在SpringCloud的家族里面,Netflix公司开源的Hystrix才是老牌选手,具有“熔断、服务降级、近实时服务监控”的能力。Sentinel则是随着新生代(SpringCloud Alibaba)一同登场的“QPS可控、支撑近十年阿里巴巴双11”的强劲新人(对两者区别有兴趣可以看看这里)。
为了更好的理解Sentinel,我们先来看一下Sentinel最基本的功能——限流。
二、Sentinel Dashboard
Sentinel可视化控制台,我们可以在上面看到已连接服务的一些监控信息。
下载Sentinel dashboard包。
https://github.com/alibaba/Sentinel/releases 可见所有版本的jar包。启动dashboard。
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.1.jar

访问localhost:8080,用户名密码全部默认sentinel。

进入dashboard,可以看到这里有某个服务的QPS数据(图中是Sentinel Dashboard自身的服务接口),左侧菜单栏里面可以配置流量控制规则、服务降级规则、热点数据规则。

三、Sentinel 接入端
dashboard是一个便捷的页面管理工具,真正的Sentinel功能还是依赖在业务项目之中,我们继续在之前的Demo基础上进行扩充。
- 添加依赖。
1
2
3
4<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency> - 添加配置。(上一章我们介绍了可以在Nacos配置中心添加yml或properties配置,但是这里为了代码完整保存,仍然写在了bootstrap.properties中)。
1
2spring.cloud.sentinel.transport.port=8121
spring.cloud.sentinel.transport.dashboard=localhost:8080 - 添加接口并配置Sentinel资源名称:test。
1
2
3
4
5
6
7
8
9
10
11
12
13import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
public class TestController {
public String test(){
return "test";
}
} - 启动application,页面访问测试接口(注意:必须先访问过该接口,才能在dashboard上看到该接口的信息)。

- 查看dashboard,可以看到order项目已经被sentinel dashboard监控到了。我们可以直接在页面上配置流量限制(注意:页面配置不是持久化的,之后章节我们会介绍sentinel规则持久化的方法)。

6. 测试 流量限制,设置test接口的QPS 单机阈值为1.

7. 测试 流量限制,连续访问test接口两次,发现第二次接口不可达,测试成功。


四、热点规则/服务降级规则
除了流量控制,sentinel还支持热点流量控制、服务降级规则配置等
热点规则
热点规则是对接口规则的更细化的控制,可以通过对参数进行流量控制,比如将test方法改造为带参数的方法(如下代码),然后配置热点规则的参数索引、单机阈值、统计窗口长度(如下图),则可以按照参数限制。
限制规则:按照索引下标选择限制的参数,如test接口限制第一个参数name,若该参数为某值的方法连续被调用n次(如name=”asd”在窗口长度时间内调用超过单机阈值次数),则接下来的name=”asd”的访问请求将无法访问。
1 |
|

降级规则
降级规则则是从 服务响应时间、接口异常次数、接口异常频率来评估接口,若响应过慢,或异常次数过多,则对接口进行降级。
如:test接口被限制为1分钟内异常2次就进行服务降级,服务降级3秒。测试代码及dashboard配置如下。
1 |
|

五、Sentinel的主要功能就是容错,主要体现为下面这个三个:
1.流量控制
流量控制在网络传输中是一个常用的概念,它用于调整网络包的数据。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel作为一个调配器,可以根据需要吧随机的请求调整成合适的形状。
2.熔断降级
当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联故障。
Sentinel对这个问题采取了两种手段:
通过并发线程数进行限制
Sentinel通过限制资源并发线程的数量,来减少不稳定资源对其他资源的影响。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接受请求。
通过响应时间对资源进行降级
除了对并发线程数进行控制以外,Sentinel还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。
Sentinel和Hystrix的区别
两者的原则是一致的,都是当一个资源出现问题时,让其快速失败,不要波及到其它服务但是在限制的手段上,确采取了完全不一样的方法:
Hystrix采用的是线程池隔离的方式,优点是做到了资源之间的隔离,缺点是增加了线程切换的成本。
Sentinel采用的是通过并发线程的数量和响应时间来对资源做限制。
3.系统负载保护
Sentinel同时提供系统维度的自适应保护能力。当系统负载较高的时候,如果还持续让请求进入可能会导致系统崩溃,无法响应。在集群环境下,会把本应这台机器承载的流量转发到其他的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,Sentinel提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。
总之一句话:我们需要做的事情,就是在Sentinel的资源上配置各种各样的规则,来实现各种容错的功能。Sentinel的功能很强大,不只是可以对接口进行限制,还可以让超出限制的请求去调用本地的‘失败专用接口’。而后续的‘失败专用接口’则是关乎用户体验的命脉,这一部分以及规则持久化我们下一章再来介绍。