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是什么

分布式系统的防卫兵。面对分布式服务架构的流量控制组件,他主要从限流、熔断降级、系统的负载保护、热点防护等多维度帮助我们保证系统的稳定性。

一般用在双一大促或者秒杀场景。

提供了一些实时监控和规则配置都可以在控制台里面去做。

springClouddubbogRPCserviceMesh都有很高的扩展点。通过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

7ClusterBuilderSlot

存储资源的统计信息以及调用者的信息,作为多维度限流降级的依据。

 

 

8statisticSlot

核心功能插槽之一,记录和统计不同维度runtime的字表。监控指标信息,统计实时调用数据。有一些标注,clusternode的实时统计,originnode不同调用者的统计信息,defaultNode根据上下文区分的资源idruntime的统计。

底层采用滑动窗口数据结构leapArray来统计实时的秒级指标数据。

 

根据这些请求达到多少的QPS,根据这些统计做一些限流策略。

9flowSlot

主要时是做流量控制,根据预设的资源去统计信息,按着固定的次序依次生效。

10degradeSlot

熔断降级,主要是根据上面的统计信息做一个熔断降级。根据资源的平均响应时间、异常比来决定是否被熔断。

11systemSlot

对入口资源进行一个动态的配比,它的原理是让入口流量和当前系统预计的流量达到一个平衡。只对入口流量起作用。

 

12、流量控制

监控资源的QPS、并发线程数等指标,当达到指定的阈值对流量进行控制,保障应用的稳定性。根据预设的规则以及ClusterBuilderSlotstatisticSlot统计出来的实时信息,进行流量的控制。

限流的最直接表象就是在执行时,抛出一个flowException,而flowExceptionblockException的子类。

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/

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-06-13 15:35  majingyun  阅读(1688)  评论(0编辑  收藏  举报