Sentinel
Sentinel
一、sentinel背景概述
Sentinel是阿里开源的熔断断流框架
1、传统的微服务架构
服务架构的好处:所有服务都在一个架构里面,部署起来比较方便。
弊端:流量较大时需要扩容,扩容多台机器挂在nginx上,需要部署多台容器并维护他们之间的映射关系。
2、微服务架构
双十一,订单服务需要扩展,就扩展订单服务,随着云原生和docker的出现,根据流量对服务进行弹性的伸缩,比如你的服务伸缩后告诉注册中心少了一台服务或者多了一台服务,注册中心和网关有一个通信,这样对服务就能动态的添加和移除。
弊端就是:现在服务多了,拆在不同的容器,跨容器之间的调用存在事务的问题或者其它问题,服务间的调用失败如何处理。
3、springCloud组件
4、雪崩效应常见的场景
1)硬件故障
如服务器宕机、机房断电、光纤被挖等
2)流量激增
如异常流量,重试加大流量等
3)缓存穿透
一般发生在应用重启和缓存失效时,以及短时间内大量缓存失效时。大量的缓存不命中,使请求直击后端服务,造成服务超负荷运行,引起服务不可用。
4)程序bug
如程序逻辑导致内存泄漏,JVM长时间fullGC等。
5)同步等待
服务间采用的同步调用,同步等待造成的资源耗尽。
5、雪崩场景应对策略
1)硬件故障
多机房容灾、异步多活等
2)流量激增
服务自动扩充、流量控制(限流、关闭重试等)等
3)缓存穿透
缓存预加载,缓存异步加载等。
4)程序bug
修改bug及时释放资源。
5)同步等待
资源隔离、MQ解耦、不可用服务调用快速失败等。资源隔离是指不同服务之间的调用采用不同的线程池;不可用服务快速失败一般采用熔断器模式结合超时机制实现。
二、断流器框架sentine
1、断流器框架对比
2、Sentinel是什么
分布式系统的防卫兵。面对分布式服务架构的流量控制组件,他主要从限流、熔断降级、系统的负载保护、热点防护等多维度帮助我们保证系统的稳定性。
一般用在双一大促或者秒杀场景。
提供了一些实时监控和规则配置都可以在控制台里面去做。
对springCloud、dubbo、gRPC、serviceMesh都有很高的扩展点。通过spi扩展接口,定义自己的业务逻辑。
Sentinel主要分两部分,一部分是核心库,核心库不依赖任何框架;
另一部分是控制台,jar包下载下来直接运行。
所有的规则可以通过sentinel控制台设定。设计理念,自由的选择控制的角度。
3、Sentinel入门
流量控制
1)主程序
2)初始化流控规则
3)查看输出
~/logs/csp/${appName}-metrics.log.xxx 里看到下面的输出
4、流量控制
Hytix是通过线程池隔离的方式对资源进行隔离,好处:资源和资源之间最彻底的隔离。确定是:增加了线程切换成本。需要对每个资源做线程池大小的配置,不然会导致Hytix里面的线程池数量特别多。
Sentinel实现有两种手段,一种是并发线程数进行限制,限制资源并发的数量,减少不稳定资源对资源的影响,这样既没有线程切换的资源损耗,也不需要配置线程池的大小。直接影响就是造成线程数的堆积,当堆积到一定程度就会抛出blockexception的异常;另外一种就是通过响应时间快速降级。还提供了自我保护功能,当系统负载较高时,如果还让请求持续的进入需要限流控制。
5、Sentinel工作流程
Sentinel插槽,创建entry时同时创建插槽。
6、NodeSelectorSlot
负责收集资源的路径,把调用路径以树状结构存储起来,用于根据调用路径进行限流的降级。
不同的服务可以有不同的入口:
可以通过命令查询树状结构
Curl http://localhost:8719/tree?type=root
7、ClusterBuilderSlot
存储资源的统计信息以及调用者的信息,作为多维度限流降级的依据。
8、statisticSlot
核心功能插槽之一,记录和统计不同维度runtime的字表。监控指标信息,统计实时调用数据。有一些标注,clusternode的实时统计,originnode不同调用者的统计信息,defaultNode根据上下文区分的资源id和runtime的统计。
底层采用滑动窗口数据结构leapArray来统计实时的秒级指标数据。
根据这些请求达到多少的QPS,根据这些统计做一些限流策略。
9、flowSlot
主要时是做流量控制,根据预设的资源去统计信息,按着固定的次序依次生效。
10、degradeSlot
熔断降级,主要是根据上面的统计信息做一个熔断降级。根据资源的平均响应时间、异常比来决定是否被熔断。
11、systemSlot
对入口资源进行一个动态的配比,它的原理是让入口流量和当前系统预计的流量达到一个平衡。只对入口流量起作用。
12、流量控制
监控资源的QPS、并发线程数等指标,当达到指定的阈值对流量进行控制,保障应用的稳定性。根据预设的规则以及ClusterBuilderSlot、statisticSlot统计出来的实时信息,进行流量的控制。
限流的最直接表象就是在执行时,抛出一个flowException,而flowException是blockException的子类。
resource:资源名,即限流规则的作用对象。
count:限流阈值
grade:限流阈值类型(QPS和并发线程数)
limitAPP:流控针对的调用来源,若为default则不区分调用来源。
strategy:调用关系限流策略。
controlBehavior:流量控制效果(直接拒绝、warm up、匀速排队)
13、并发线程数的demo
用于保护业务线程池不被慢调用耗尽,当一个资源调用比较慢,耗时比较长,导致系统不稳定、吞吐量下降。导致线程数的占用,极端情况下导致容器的线程池被耗尽。
14、warm up
预热冷启动,系统长时间处于低水位的状态,突如其来的流量会把系统拉入高水位,有可能使系统垮掉。这样就使用冷启动的方式,让它在一定时间内让流量缓慢增加,给冷系统一个预热的时间,避免系统被压垮。
15、集群的流控
ClusterFlowConfig
集群配置。可以运行jar包或者依赖到应用里面。
16、熔断降级
不同服务之间的调用,组成复杂的调用链路。如何保证它的稳定性。Sentinel提供了一些熔断策略。
三、sentine实战
1、配置文件pom.xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
</dependency>
2、注解
3、配置vm镜像
4、启动成功后,多访问几次接口,在sentinel控制台
https://sentinelguard.io/zh-cn/