前言在家休息的时候,小勇突然打电话问农哥,你知道Sentinel吗?我(清了清嗓子):是啊,怎么了?小勇(小声):最近面试了一个,问我Sentinel是什么,具体用法,项目中用的那个。没复习过,记不太清了,但是很痛。我(该开始倒杯了):没关系,我们先擦,不就是(Sentinel)只是阿里的一个开源项目吗,主要提供流量控制,断路器降级,系统负载保护等多个维度等保证服务之间的稳定性邢小勇:。....您是否有任何可以在该领域查看的材料或文章?我:不说了,刚写了一篇关于Sentinel的介绍和使用的文章。你想看看吗?小勇:对,内容是什么?算教科书级别的内容吧?我:嗯……为什么不呢?小勇:。....老六我真的很佩服你!!!学习技术的第一步是要知道官网地址在哪里。官网永远是第一手资料:https://github.com/alibaba/Sentinel/wiki。接下来,我们先来了解一下什么是Sentinel。Sentinel始于分布式系统中的流量卫士:随着微服务的普及,服务调用的稳定性变得越来越重要。在续航方面,保证服务的可靠性。Sentinel具有以下特点:丰富的应用场景:Sentinel承担了近10年阿里巴巴双十一流量大促的核心场景,如秒杀(即突发流量控制在系统容量可承受的范围内)、消息削峰填谷、集群流控、下游不可用应用的实时熔断等。完备的实时监控:Sentinel也提供了实时监控功能。在控制台可以看到应用连接的单机秒级数据,甚至可以看到500以下规模集群的聚合运行状态。-box与其他开源框架/库的集成模块,例如与SpringCloud、ApacheDubbo、gRPC和Quarkus的集成。您只需要引入相应的依赖,进行简单的配置,即可快速接入Sentinel。同时,Sentinel提供了Java/Go/C++等多语言原生实现。完善的SPI扩展机制:Sentinel提供了简单易用、完备的SPI扩展接口。您可以通过实现扩展接口来快速自定义逻辑。比如自定义规则管理,动态数据源的适配等等。在某个时候失败。比如我们调用D\F\K这些服务,如果其中一个服务出现问题,可能会导致系统整体效率下降,严重的甚至会出现服务雪崩。当多个微服务相互调用时,如果D调用K和F,K和F调用其他微服务,就会形成fan-out。如果某个链接上的微服务调用超时或者响应缓慢,微服务D会占用越来越多的系统资源,从而导致系统崩溃,即服务雪崩。对于高流量的应用,单一的后端依赖可能会导致服务器上的资源在极短的时间内耗尽,也可能导致这些应用服务、队列、线程和其他系统资源之间的响应时间增加稀缺,导致整个系统之间出现更多的二次故障。如果我们隔离和控制单个应用服务的故障处理和延迟,当单个依赖发生故障时,不会对系统和资源造成影响。当一个模块实例发生故障后,如果此时服务还能接收到请求和流量访问,同时服务又调用了其他模块,这样的级联故障就会导致雪崩。相比其他砍掉的产品(Hystrix),它不需要我们手动搭建监控平台,并且有自己的一套web接口,可以对各种指标进行流量控制和熔断,提供实时监控控制面板更强大。Sentinel使用下载地址:https://github.com/alibaba/Sentinel/releases。Sentinel分为两部分:核心库:不依赖任何框架/库,只需要Java运行环境,对Dubbo\SpringCloud等框架也有很好的支持。Console:基于SpringBoot开发,打包后直接运行,无需额外的应用容器。注意:jdk1.8环境/8080端口不能被占用。启动命令:java-jarsentinel-dashboard-1.8.4.jar。访问地址:http://localhost:8080/。账号密码:sentinel/哨兵。至此,我们的Sentinel就安装成功了。有的同学可能在界面上什么都看不到,也没有找到监控服务。这是因为我们还没有启动项目,Sentinel本身采用的是懒加载模式。所以我们需要先访问服务对应的接口,然后Sentinel才会工作,然后我们再构建我们的测试工程。构建项目Sentinel官方参考文档:https://sentinelguard.io/zh-cn/docs/quick-start.html。注意:这里我们使用的是Nacos。不了解Nacos的朋友可以看我之前的文章有详细的介绍。其实只需要启动一个8848端口的Nacos即可。导入依赖:com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discoverycom.alibaba.cloudspring-cloud-starter-alibaba-sentinel配置属性:服务器:端口:8006spring:application:name:cloudalibaba-sentinel-servicecloud:nacos:discovery:server-addr:localhost:8848sentinel:transport:#配置Sentinel地址,也就是我们的WEB界面dashboard:localhost:8080#Sentinel配置默认8719端口,占用的端口会自动从+1增加,直到找到未占用的端口port:8719management:endpoints:web:exposure:include:'*'testclass:importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;导入java.util.concurrent.TimeUnit;@RestControllerpublicclassTestController{@GetMapping("/playA")publicStringplayA(){return"你好,我叫playA,我是男孩";}@GetMapping("/playB")publicStringplayB(){return"himynameisplayB,megirl";}}最后在我们的启动类中添加:@EnableDiscoveryClient,点击开始,然后我们就访问我们的测试地址:http://localhost:8006/playAhttp://localhost:8006/playB,访问完成后,能够在Sentinel上看到我们的监控信息,如下图:好了,你看Sentinel到这里是不是解释完了?哎~怎么可能,我继续滚,我宁可累死你,我也要弄死你!虽然基本的操作已经完成了,但是不说他的流控规则,我们怎么会有印象呢?没错,你又漂亮又聪明。Sentinel流控规则首先我们来看一张图:上图包含了我们要说明的所有内容,主要分为以下几点:资源名称:流控规则中的唯一名称,默认就是我们的request小路。对于来源:Sentinel限制调用者的当前流量,填写我们的微服务名称,默认为default,不区分来源。阈值类型/单机阈值:QPS(requestspersecond),使用这种类型时,QPS达到我们设置的单机阈值,限流。线程数:使用该类型时,线程数达到我们设置的单机阈值,限流。是否集群:默认否,如果是集群则勾选。限流方式:Direct:当API达到限流条件时,直接限流。如果我们将QPS设置为1,如果大于这个数量,会直接返回错误。关联:关联资源达到阈值时,自己限流,比如A调用B,B达到阈值,A限流。Link:只记录链路上的流量,指定对应的链路路径,从入口开始,达到阈值就限流。流控效果:先添加一条流控规则,有两种操作方式。因为方便,我们通常选择在聚类点链接中添加。我们先试试QPS的操作:failfast:直接抛出异常。WarmUp:根据冷负载因子codeFactor,达到设定的QPS阈值所需要的warm-up时间。队列等待:匀速排队,允许匀速发出请求。阈值类型需要设置为QPS,否则无效。添加在流量控制规则中。添加到集群链接中。这里我们将单机阈值设置为1,所以playA的接口每秒只能访问一次。如果超过,则进行限流操作以进行阻塞操作。我们可以直接看到这个效果。当我们不断刷新播放A时,会出现如下信息,但如果没有设置播放B,则不会。如果我们这里设置成线程数呢?让我们来看看。这里要注意:如果项目重启了,需要重新访问修改后的playA,重新添加流控规则。同时,我们需要在代码中设置延时执行。如果处理得太快,我们将看不到实际效果。有兴趣的可以自己启动线程运行。这里我们设置playA延迟一秒。时间操作。@GetMapping("/playA")publicStringplayA(){try{//阻塞1秒TimeUnit.MILLISECONDS.sleep(1000);}catch(Exceptione){e.printStackTrace();}return"你好,我叫playA,我是男孩";}这里我们需要使用两个不同的浏览器运行,同一个浏览器使用同一个线程,先请求某首歌再请求某首歌的效果如下:QPS和并发线程数规则如下:总结虽然最终效果一样,但是规则不同。您可以针对不同的业务场景合理使用。我们的Sentinel到这里就结束了,后面还会有更多相关内容。Sentinel的原理及介绍。