服务容错-Sentinel

一、雪崩效应

雪崩效应也叫cascading failure、级联失效、级联故障;如同下图一样,一个微服务坏掉就会将整个系统造成宕机;
在这里插入图片描述

二、微服务常见容错方案

1.超时:时间一过,直接返回错误,不拖泥带水

2.限流:当一个实例的请求数量达到阈值时,后面所有的请求直接返回失败,等到请求数量降低到阈值以下才能再次调用成功;

3.仓壁模式:每个接口设置一个线程池,就算当前这个接口的线程池满了也不会影响其他接口的调用;(感觉不太好,设置累死人,当所有的接口线程池都满的时候压力一样很大,只是鸡蛋没有放在同一个篮子里了而已,参考泰坦尼克号,下水时号称永不沉没,就是因为使用了舱壁模式,轮船最大可承受两个主仓进水,结果忽略了大自然的力量,撞到冰山之后三个主仓都进水了,直接GG)下图为仓壁模式图解:
在这里插入图片描述
4.断路器模式:类似于电闸,当一段时间内一个接口的错误率或者错误次数达到了阈值,那么就会判断是该即可欧调用的远程微服务API出了问题,那么就不再去调用该远程微服务API,“电闸”此时就被关闭了,过了一段时间后,又会把“电闸”半打开,重新去调用这个远程微服务API一次,查看该远程微服务是否修复,如果成功了,那么就将“电闸”直接全开,否则继续关闭;下图为断路器模式图解:
在这里插入图片描述

三、项目中导入Sentinel

只需要在pom文件中导入sentinel依赖即可:
在这里插入图片描述

四、整合Sentinel控制台

1.下载地址:

https://github.com/alibaba/Sentinel/releases (正式环境上请务必使用和项目中sentinel版本相同的控制台)

2.项目配置文件中,添加注册的sentinel控制台地址即可:
在这里插入图片描述
由于sentinel是懒加载,所以需要调用接口之后才能在控制台上看到微服务信息。

五、Sentinel流控规则

在这里插入图片描述
资源名:不一定是路径,只是一个唯一的名称;

针对来源:针对不同微服务有不同的流控规则,default代表所有微服务

流控模式:

1.直接:当QPS或线程数达到阈值时就直接根据设置的流控效果进行限流(下文用限流表示);

2.关联:当关联资源达到设置的阈值时,则对自己也就是资源名为“/shares/1”的接口进行限流;如下图:
在这里插入图片描述
3.链路:对资源名为“/shares/2”的接口调用自己(即“/shares/1”)时添加限流;如下图:
在这里插入图片描述
流控效果:
1.快速失败:直接抛异常,返回错误信息;
相关源码:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController
在这里插入图片描述
2.Warm Up:冷加载,使用阈值100/3(默认冷加载因子)作为初始阈值,经过预热时长10秒达到阈值100,避免QPS在瞬间提高,对服务器造成巨大压力,适用于各种秒杀项目中;

官方原理分析文档:https://github.com/alibaba/Sentinel/wiki/%E9%99%90%E6%B5%81—%E5%86%B7%E5%90%AF%E5%8A%A8

下图是编辑页面:
在这里插入图片描述
3.排队等待:即在超时时间内未调用成功的再去抛异常;排队等待的阈值类型只能选择QPS,如果选择线程数将无效;

官方原理分析文档:https://github.com/alibaba/Sentinel/wiki/%E9%99%90%E6%B5%81—%E5%8C%80%E9%80%9F%E5%99%A8

下图是编辑页面:
在这里插入图片描述

六、降级规则

降级分为三个规则,分别是RT、异常比例、异常数;

RT:秒级别统计,RT默认最大值为4900ms,如果需要修改可通过-Dcsp.sentinel.statistic.max.rt=xxx进行修改;以下是RT原理和编辑图示:
在这里插入图片描述
在这里插入图片描述
异常比例:秒级别统计;以下是异常比例原理和编辑图示:
在这里插入图片描述
在这里插入图片描述
异常数:分钟级别统计,时间窗口最好>60,否则可能会出问题;以下是异常数原理和编辑图示:
在这里插入图片描述
在这里插入图片描述
降级相关源码:com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule#passCheck

对于降级的判断都在该方法中完成,所以该源码还是很值得去研究的;

七、热点规则

要配置热点规则,需要先在接口中添加上@SentinelResource(“cold”),value可随意填写:
在这里插入图片描述
之后在Sentinel控制台上就能看到名为cold的资源了:
在这里插入图片描述
点击热点,开始设置热点规则:

参数索引:指该url的参数索引,0为第一个参数
在这里插入图片描述
新增完成后在左侧菜单栏热点规则即可看到刚刚添加的名为cold的热点规则,点击编辑->高级设置,可对url的参数进行更加细致的热点规则设置:

参数类型:只能为String或者其他基本类型;

如下图表示cold资源接口对第一个参数值为5的请求设置的限流阈值为1000,其他均为1,统计窗口时长相同;
在这里插入图片描述
热点规则相关源码:

com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowChecker#passCheck

八、系统规则

系统规则总共有4种,其中load只对linux或者unix-like机器有效,windows无效;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
系统规则相关源码:

com.alibaba.csp.sentinel.slots.system.SystemRuleManager@checkSystem

九、授权规则

流控应用:微服务名称,下图表示/share/1接口将名为test的微服务添加到白名单(或黑名单)中;
在这里插入图片描述

十、使用代码配置规则

除了可以使用控制台配置规则,也可以使用java代码来添加规则,详见:

http://www.imooc.com/article/289345

十一、Sentinel与控制台通信原理

微服务会将自己注册到控制台上,并定时向控制台发送心跳,控制台也会通过API接口来调用微服务相关信息;可以通过通信ip+端口/api查看到相关api(是通信的ip+端口,并不是tomcat的ip+端口),可在控制台上机器列表中查看:
在这里插入图片描述
下图为原理图:
在这里插入图片描述
相关源码:

注册/心跳发送:com.alibaba.csp.sentinel.transport.heartbeat.SimpleHttpHeartbearSender

通信API:com.alibaba.csp.sentinel.command.CommandHandler的实现类

十二、控制台相关配置项

应用连接控制台配置项:
在这里插入图片描述
控制台端配置项:如果需要修改控制台的登陆密码,则需在控制台jar包启动时添加相关参数,例如
java -jar -Dsentinel.dashboard.auth.username=admin -Dsentinel.dashboard.auth.password=admin jar包名称.jar

下图为可配置的内容,其中标注1.6的表示控制台版本1.6以上才支持:
在这里插入图片描述
在这里插入图片描述

十三、Sentinel API

三大核心api

Sphu:定义资源,让资源受到监控,保护资源(最核心)

Tracer:对想要的异常进行统计

ContextUtil:实现调用来源,可以自定义调用微服务的来源

Sentinel官方文档:https://github.com/alibaba/Sentinel/wiki/如何使用

十四、SentinelResource注解详解

参考该手记:http://www.imooc.com/article/289384

相关源码:

com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect

com.alibaba.csp.sentinel.annotation.aspectj.AbstractSentinelAspectSupport

十五、Sentinel整合RestTemplate

只需要在将RestTemplate添加到Spring容器时添加上@SentinelTestTemplates注解即可:
在这里插入图片描述
如果想要关闭可以在配置文件中如下配置:
在这里插入图片描述
想要修改限流或降级返回的异常信息,可以在@SentinelTestTemplates添加相应的参数:
在这里插入图片描述
下图中为resttemplate拦截的资源:
在这里插入图片描述
相关源码:
org.springframeword.cloud.alibaba.sentinel.custom.SentinelBeanPostProcessor(强烈建议研究)

十六、Sentinel整合Feign

Sentinel整合Feign只需配置文件中添加以下内容即可:
在这里插入图片描述
当被限流或降级时会直接抛异常,这时有两种方式可以修改返回的结果,不让程序直接返回错误信息;

1.在@FeignClient注解中使用fallback参数,其中UserCenterFeignClientFallback类必须实现该当前@FeignClient注解修饰的接口;(该方法无法看到异常信息)

以下为代码示例:
在这里插入图片描述
在这里插入图片描述
2.在@FeignClient注解中使用fallbackfactory参数,其中UserCenterFeignClientFallbackFactory类必须实FallbackFactory接口;(该方法可以看到异常信息,所以更加强大)

以下为代码示例:
在这里插入图片描述
在这里插入图片描述
相关源码:

org.springframeword.cloud.alibaba.sentinel.feign.SentinelFeign

十七、Sentinel使用姿势总结

在这里插入图片描述

十八、规则持久化

因为微服务每次重启之后,sentinel的流控规则都会被清空,没次都要去配置规则就比较麻烦,所以进行码达到规则持久化的效果;

1.使用拉模式进行持久化操作:

详见该手记:http://www.imooc.com/article/289402

2.使用推模式进行持久化操作(基于Nacos)(推荐使用):

详见该手记:http://www.imooc.com/article/289464

十九、扩展Sentinel-错误页优化

设置规则被拦截之后,sentinel会直接报出“Blocked by Sentinel (flow limiting)”错误,并且错误信息无法知道是什么规则造成的,也没有错误信息,不利于排查,我们需要新增一个类实现UrlBlockHandler接口,重写blocked方法即可,不多逼逼,直接上代码:
在这里插入图片描述

二十、扩展Sentinel-实现区分来源

sentinel对于来源也有一个用来区分来源的接口,那就是RequestOriginParser,只要实现该接口并重写parseOrigin方法就可以自定义来源规则啦,这个就不贴代码了,大家自己动动脑筋想一下吧;

二十一、扩展Sentinel-RESTful URL支持

“/share/1”和“/share/2”这两个url只有参数不一致,接口地址是一致的,那么他们在sentinel控制台中是一条簇点链路还是两条呢,答案是两条,因为sentinel是不支持占位符的,那么造成的一个影响就是每个接口对应不同的参数都要重复设置对应的规则,这是不显示的,所以sentinel提供了UrlClear,直接上图:
在这里插入图片描述

二十二、扩展Sentinel-透过现象看本质

在上面三个小节我们讲了三种接口用来自定义个性化需求,其实这三种接口本质上是被CommonFilter过滤器所调用的,感兴趣的同学可以去看看源码,如果不满意该过滤器的处理方式,可以将该过滤器关掉,自己写一个过滤器,关掉过滤器的方式也非常的简单,只要在配置文件上进行以下配置即可:
在这里插入图片描述

二十三、配置项总结

详见该手记:http://www.imooc.com/article/289562

PS:本博客所有手记均转载自慕课网大目老师;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值