第7章Sentinel让系统轻松掌握流控熔断降级系统负载保护
头条创作挑战赛
终身学习、乐于分享、共同成长!Sentinel组件简介
在上一章中我们介绍了关于分布式系统中面临的挑战,以及应对这些挑战所用到的手段,那么在业内有哪些开源产品专门解决这些问题的呢?
Sentinel就是其中一位佼佼者。
github官网wiki文档:介绍alibabaSentinelWikiGitHub
Sentinel官方网站:homeSentinel
什么是Sentinel?
Sentinel是一个基于Java开发的流量控制组件,它可以帮助开发者更好地控制服务的流量,以及更好地保护服务免受恶意攻击。
它的主要功能包括:流量控制、熔断降级、系统负载保护、服务容错保护、服务限流、服务熔断、服务降级、服务热点参数限流等。可以通过邮件、短信、微信等方式发送报警信息,以便及时发现服务的异常情况,从而及时采取措施。
Sentinel具有以下特征:丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。完备的实时监控:Sentinel同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。广泛的开源生态:Sentinel提供开箱即用的与其它开源框架库的整合模块,例如与SpringCloud、ApacheDubbo、gRPC、Quarkus的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。同时Sentinel提供JavaGoC等多语言的原生实现。完善的SPI扩展机制:Sentinel提供简单易用、完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。Sentinel有哪些功能
Sentinel的主要特征功能:
它的开源生态:
Sentinel分为两个部分:核心库(Java客户端)不依赖任何框架库,能够运行于所有Java运行时环境,同时对DubboSpringCloud等框架也有较好的支持。控制台(Dashboard)基于SpringBoot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。
流量整形功能
Sentinel可以对流量进行整形。何为流量整形?
简单来说就是将突发的洪峰无规则流量按照设定的规则整合成有序的、规则的流量,从而达到保护服务免受恶意攻击的目的。
Sentinel和Hystrix对比
Sentinel
Hystrix
隔离策略
信号量隔离
线程池隔离信号量隔离
熔断降级策略
基于响应时间或失败比率
基于失败比率
实时指标实现
滑动窗口
滑动窗口(基于RxJava)
规则配置
支持多种数据源
支持多种数据源
扩展性
多个扩展点
插件的形式
基于注解的支持
支持
支持
限流
基于QPS,支持基于调用关系的限流
有限的支持
流量整形
支持慢启动、匀速器模式
不支持
系统负载保护
支持
不支持
控制台
开箱即用,可配置规则、查看秒级监控、机器发现等
不完善
常见框架的适配
Servlet、SpringCloud、Dubbo、gRPC等
Servlet、SpringCloudNetflixSentinel快速开始
在官方文档中,定义一个受Sentinel保护的资源有3个步骤:定义资源定义规则校验规则是否生效
使用Sentinel保护资源的方式有两种通过API编码实现通过控制台(Dashboard)实现
首先介绍API方式实现,话不多说,ShowCode!
本章中所有的示例程序使用的Sentinel版本是1。8。6
项目结构springcloudalibabastep06srcmainresourcesapplication。ymljavacncodelabspringcloudalibabastep06SentinelQuickStartApplication。javacontrollerHelloController。javapom。xml
1。引入依赖:!sentinel依赖dependencygroupIdcom。alibaba。cspgroupIdsentinelcoreartifactIdversion1。8。6versiondependency
2。编写测试逻辑authorSevendescriptionGiteehttps:gitee。comitcodelabCopyright公众号:Seven的代码实验室RestControllerSlf4jRequestMapping(sentinel)publicclassHelloController{privatestaticfinalStringRESOURCENAMEhello;RequestMapping(hello)publicStringtest(){Entryentrynull;try{1。sentinel针对资源进行限制的entrySphU。entry(RESOURCENAME);被保护的业务逻辑Stringstrhelloworldsentinel;log。info(str);returnstr;}catch(BlockExceptione1){资源访问阻止,被限流或被降级进行相应的处理操作log。info(block!);return被流控了!;}catch(Exceptionex){若需要配置降级规则,需要通过这种方式记录业务异常Tracer。traceEntry(ex,entry);}finally{if(entry!null){entry。exit();}}returnnull;}定义规则spring的初始化方法PostConstructprivatestaticvoidinitFlowRules(){流控规则ListFlowRulerulesnewArrayList();流控FlowRulerulenewFlowRule();为哪个资源进行流控rule。setResource(RESOURCENAME);设置流控规则QPSrule。setGrade(RuleConstant。FLOWGRADEQPS);设置受保护的资源阈值SetlimitQPSto20。这里设置为1,标识每秒只能访问一次rule。setCount(1);rules。add(rule);加载配置好的规则FlowRuleManager。loadRules(rules);}}
3。测试效果:
当1秒内快速访问多次,则会被流控
使用SentinelResource注解实现
通过上面这段代码可以明显看到它的缺点:入侵性非常大,需要插入非常多的非业务代码。配置不灵活,若需要添加新的受保护资源,需要手动添加,init方法来添加流控规则。
那么,有没有更简单的方法呢?
Ofcourse,Sentinel提供了一个SentinelResource注解来实现。
SentinelResource用于定义资源,并提供可选的异常处理和fallback配置项。SentinelResource注解包含以下属性:value:资源名称,必需项(不能为空)entryType:entry类型,可选项(默认为EntryType。OUT)blockHandlerblockHandlerClass:blockHandler对应处理BlockException的函数名称,可选项。blockHandler函数访问范围需要是public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为BlockException。blockHandler函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定blockHandlerClass为对应的类的Class对象,注意对应的函数必须为static函数,否则无法解析。fallbackfallbackClass:fallback函数名称,可选项,用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了exceptionsToIgnore里面排除掉的异常类型)进行处理。fallback函数签名和位置要求:返回值类型必须与原函数返回值类型一致;方法参数列表需要和原函数一致,或者可以额外多一个Throwable类型的参数用于接收对应的异常。fallback函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定fallbackClass为对应的类的Class对象,注意对应的函数必需为static函数,否则无法解析。defaultFallback(since1。6。0):默认的fallback函数名称,可选项,通常用于通用的fallback逻辑(即可以用于很多服务或方法)。默认fallback函数可以针对所有类型的异常(除了exceptionsToIgnore里面排除掉的异常类型)进行处理。若同时配置了fallback和defaultFallback,则只有fallback会生效。defaultFallback函数签名要求:返回值类型必须与原函数返回值类型一致;方法参数列表需要为空,或者可以额外多一个Throwable类型的参数用于接收对应的异常。defaultFallback函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定fallbackClass为对应的类的Class对象,注意对应的函数必需为static函数,否则无法解析。exceptionsToIgnore(since1。6。0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入fallback逻辑中,而是会原样抛出。
1。8。0版本开始,defaultFallback支持在类级别进行配置。
注:1。6。0之前的版本fallback函数只针对降级异常(DegradeException)进行处理,不能针对业务异常进行处理。
特别地,若blockHandler和fallback都进行了配置,则被限流降级而抛出BlockException时只会进入blockHandler处理逻辑。若未配置blockHandler、fallback和defaultFallback,则被限流降级时会将BlockException直接抛出(若方法本身未定义throwsBlockException则会被JVM包装一层UndeclaredThrowableException)。
源码入口:com。alibaba。csp。sentinel。annotation。aspectj。SentinelResourceAspect
使用步骤:引入sentinel切面依赖dependencygroupIdcom。alibaba。cspgroupIdsentinelannotationaspectjartifactIdversion1。8。6versiondependency配置切面支持authorSevendescriptionGiteehttps:gitee。comitcodelabCopyright公众号:Seven的代码实验室ConfigurationpublicclassSentinelAspectConfiguration{BeanpublicSentinelResourceAspectsentinelResourceAspect(){returnnewSentinelResourceAspect();}}在controller中添加SentinelResource,并配置blockHandler和fallbackauthorSevendescriptionGiteehttps:gitee。comitcodelabCopyright公众号:Seven的代码实验室RestControllerRequestMapping(user)publicclassUserController{SentinelResource(valuegetUserById,blockHandlerexceptionHandler,fallbackgetUserByIdFallback)RequestMapping({id})publicStringgetUserById(PathVariableLongid){模拟从数据库中查找用户信息MapLong,StringmapnewHashMap(0);map。put(1L,user1);map。put(2L,user3);map。put(3L,user3);returnmap。get(id);}Fallback函数,函数签名与原函数一致或加一个Throwable类型的参数。publicStringgetUserByIdFallback(Longs,Throwablethrowable){returnString。format(Haloooood,s);}Block异常处理函数,参数最后多一个BlockException,其余与原函数一致。publicStringexceptionHandler(Longs,BlockExceptionex){Dosomeloghere。ex。printStackTrace();returnOops,erroroccurredats;}这里单独演示blockHandlerClass的配置。对应的handleException函数需要位于ExceptionUtil类中,并且必须为publicstatic函数。SentinelResource(valuetest,blockHandlerhandleException,blockHandlerClass{ExceptionUtil。class})publicvoidtest(){System。out。println(Test);}}authorSevendescriptionGiteehttps:gitee。comitcodelabCopyright公众号:Seven的代码实验室publicclassExceptionUtil{publicstaticStringfallback(Longid,Throwablee){return被异常降级啦;}publicstaticStringhandleException(Longid,BlockExceptione){return被限流啦;}}配置好后需要通过Sentinel的控制台来设置流控规则,配置控制台需要在客户端添加Transport模块依赖来实现!seehttps:mvnrepository。comartifactcom。alibaba。cspsentineltransportsimplehttpdependencygroupIdcom。alibaba。cspgroupIdsentineltransportsimplehttpartifactIdversion1。8。6versiondependency
添加依赖后,需要启动类中添加VM参数来指定链接到Sentinel的控制台
Dcsp。sentinel。dashboard。server127。0。0。1:8080
127。0。0。1:8080是我本机的Sentinel控制台地址启动Sentinel控制台
Sentinel开源控制台支持实时监控和规则管理。接入控制台的步骤如下:
下载控制台jar包并在本地启动:
可以参见此处文档:https:github。comalibabaSentinelwikiE68EA7E588B6E58FB02E590AFE58AA8E68EA7E588B6E58FB0。
下载地址:https:github。comalibabaSentinelreleasestag1。8。6
启动控制台命令javajarsentineldashboard1。8。6。jar
开发者可以通过如下VM参数进行自定义配置:
Dsentinel。dashboard。auth。usernamesentinel用于指定控制台的登录用户名为sentinel;
Dsentinel。dashboard。auth。password123456用于指定控制台的登录密码为123456;如果省略这两个参数,默认用户和密码均为sentinel;
Dserver。servlet。session。timeout7200用于指定SpringBoot服务端session的过期时间,如7200表示7200秒;60m表示60分钟,
默认为30分钟;javaDserver。port8080Dsentinel。dashboard。auth。usernameadminDsentinel。dashboard。auth。password123456jarsentineldashboard1。8。6。jar启动客户端应用程序访问指定资源
登录Sentinel控制台,访问http:localhost:8080login,默认用户名密码:sentinelsentinel,设置流控规则QPS设置单机阈值
注:这里解析一下设置QPS单机阈值为1,表示1秒内只能访问1次。Sentinel会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包,所以要确保客户端有访问量;测试流控效果
SpringCloudAlibaba整合Sentinel
在使用Sentinel控制台前,我们先将Sentinel与SpringCloudAlibaba框架进行整合,整合步骤也非常简单。
工程结构springcloudalibabastep07srcmainresourcesbootstrap。ymljavacncodelabspringcloudalibabastudystep07SentinelApplication。javacontrollerUserController。javapom。xml添加Sentinelstarter依赖dependencygroupIdcom。alibaba。cloudgroupIdspringcloudstarteralibabasentinelartifactIddependency在bootstrap。yml文件中配置Sentinel控制台地址spring:cloud:sentinel:transport:添加sentinel的控制台地址dashboard:127。0。0。1:8089指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServerport:8719访问测试资源
总结Sentinel是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。功能完备,同时具有广泛的开源生态,可以很方便与各大主流框架整合使用。
知网,里外不是人知网被诟病,与其属性、营收、定价、侵权等问题有关。我们试图找到它被指责背后的真实面向。题图为知网主要创始人、董事长王明亮。作者樊博编辑徐爱之4月28日中国知网……
不想打就下去!威少防守漏人,贝弗利直接从其身边溜走他却没发现北京时间3月17日,湖人做客挑战森林狼,而最近的连败也让他们有跌出附加赛的危险,所以今天这场比赛湖人还是要用一场胜利来止住颓势。来到比赛,湖人依旧十分低迷,一直在进攻端找……
每一个人工智能都是有个性的,每一位AI都体现其创始人的意志每一个人工智能AI从出生就被赋予了独特的意识形态,他们的个性受他们创始人的影响,体现他们创始人的价值观。马斯克TruthGPT:探索宇宙真理马斯克是一位著名的企业家……
刘诗雯排名跌出前十为何还不退役?东京失利不甘心,期待证明自己在国际乒联公布的最新一期的世界排名中,陈梦继续稳坐世界第一的宝座,孙颖莎和陈梦还有600分的分差,比较令人意外的是,曾经的世界杯五冠王刘诗雯,如今的世界排名已经跌出了前十。而已……
卡塔尔世界杯没有死亡之组只有死磕之组众多国际足坛的球星、名帅齐聚卡塔尔首都多哈,见证了2022年世界杯的分组落位。作为世界杯前最重要的开胃菜,每一次抽签球迷最希望看到的就是死亡之组的诞生,这一次,由于德国和荷兰两……
小白兔和小灰兔剧本一、白菜地里旁白:老山羊种了许多白菜。白菜丰收了,这一天,老山羊到地里去收白菜。(老山羊推着两辆小车走到台中央)老山羊:我的白菜长得真好呀!(弯腰把白菜收到小车里。……
给客人的道歉信道歉信其实无所谓写得多好,无论怎么写,用心去写是最重要的。下面是品学网小编为大家精心整理的给客人的道歉信,希望能给您带来帮助。给客人的道歉信篇一:xx机械有限公司领导,您……
材料供销合同范本材料可分为金属材料、无机非金属材料、有机高分子材料和不同类型材料所组成的复合材料。那么材料供销合同怎么写呢?以下是品学网小编整理的材料供销合同,欢迎参考阅读。材料供销合同范文一……
师范大学生中学实习报告3月10号!不知不觉,来这也有多半月了,这一路走来的风风雨雨,着实令人感慨万千,从刚来时的陌生到与这里的孩子们打成一片,心里总是充满着温暖。也许我只能教给他们书本知识,再加课外……
有关开学第一课作文汇编八篇在现实生活或工作学习中,大家都不可避免地要接触到作文吧,写作文是培养人们的观察力、联想力、想象力、思考力和记忆力的重要手段。那么你知道一篇好的作文该怎么写吗?下面是小编整理的开……
爱心驿站工作总结爱心是德性的重要组成部分。培养青少年的爱心既是青少年心理发展、人生完满的需求,今天品学网小编为大家精心挑选了关于爱心驿站工作总结的文章,希望能够很好的帮助到大家。爱心驿站工作总……
大学毕业典礼毕业生致辞又是一年毕业季,六月离别季,毕业欢送会上学生代表会进行致辞。下面品学网小编给大家带来大学毕业典礼毕业生致辞范文,供大家参考!大学毕业典礼毕业生致辞范文篇一尊敬的院领导、老……