当前位置:网站首页>Sentinel服务熔断和降级
Sentinel服务熔断和降级
2022-07-31 14:05:00 【Leon_Jinhai_Sun】
还记得我们前所说的服务降级吗,也就是说我们需要在整个微服务调用链路出现问题的时候,及时对服务进行降级,以防止问题进一步恶化。

那么,各位是否有思考过,如果在某一时刻,服务B出现故障(可能就卡在那里了),而这时服务A依然有大量的请求,在调用服务B,那么,由于服务A没办法再短时间内完成处理,新来的请求就会导致线程数不断地增加,这样,CPU的资源很快就会被耗尽。
那么要防止这种情况,就只能进行隔离了,这里我们提两种隔离方案:
- 线程池隔离
线程池隔离实际上就是对每个服务的远程调用单独开放线程池,比如服务A要调用服务B,那么只基于固定数量的线程池,这样即使在短时间内出现大量请求,由于没有线程可以分配,所以就不会导致资源耗尽了。
- 信号量隔离
信号量隔离是使用Semaphore类实现的(如果不了解,可以观看本系列 并发编程篇 视频教程),思想基本上与上面是相同的,也是限定指定的线程数量能够同时进行服务调用,但是它相对于线程池隔离,开销会更小一些,使用效果同样优秀,也支持超时等。
Sentinel也正是采用的这种方案实现隔离的。
好了,说回我们的熔断和降级,当下游服务因为某种原因变得不可用或响应过慢时,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务而是快速返回或是执行自己的替代方案,这便是服务降级。

整个过程分为三个状态:
- 关闭:熔断器不工作,所有请求全部该干嘛干嘛。
- 打开:熔断器工作,所有请求一律降级处理。
- 半开:尝试进行一下下正常流程,要是还不行继续保持打开状态,否则关闭。
那么我们来看看Sentinel中如何进行熔断和降级操作,打开管理页面,我们可以自由新增熔断规则:

其中,熔断策略有三种模式:
- 慢调用比例:如果出现那种半天都处理不完的调用,有可能就是服务出现故障,导致卡顿,这个选项是按照最大响应时间(RT)进行判定,如果一次请求的处理时间超过了指定的RT,那么就被判定为
慢调用,在一个统计时长内,如果请求数目大于最小请求数目,并且被判定为慢调用的请求比例已经超过阈值,将触发熔断。经过熔断时长之后,将会进入到半开状态进行试探(这里和Hystrix一致)
然后修改一下接口的执行,我们模拟一下慢调用:
@RequestMapping("/borrow2/{uid}")
UserBorrowDetail findUserBorrows2(@PathVariable("uid") int uid) throws InterruptedException {
Thread.sleep(1000);
return null;
}
重启,然后我们创建一个新的熔断规则:

可以看到,超时直接触发了熔断,进入到阻止页面:
- 异常比例:这个与慢调用比例类似,不过这里判断的是出现异常的次数,与上面一样,我们也来进行一些小测试:
@RequestMapping("/borrow2/{uid}")
UserBorrowDetail findUserBorrows2(@PathVariable("uid") int uid) {
throw new RuntimeException();
}
启动服务器,接着添加我们的熔断规则:

现在我们进行访问,会发现后台疯狂报错,然后就熔断了:
- 异常数:这个和上面的唯一区别就是,只要达到指定的异常数量,就熔断,这里我们修改一下熔断规则:

现在我们再次不断访问此接口,可以发现,效果跟之前其实是差不多的,只是判断的策略稍微不同罢了:
那么熔断规则如何设定我们了解了,那么,如何自定义服务降级呢?之前在使用Hystrix的时候,如果出现异常,可以执行我们的替代方案,Sentinel也是可以的。
同样的,我们只需要在@SentinelResource中配置blockHandler参数(那这里跟前面那个方法限流的配置不是一毛一样吗?没错,因为如果添加了@SentinelResource注解,那么这里会进行方法级别细粒度的限制,和之前方法级别限流一样,会在降级之后直接抛出异常,如果不添加则返回默认的限流页面,blockHandler的目的就是处理这种Sentinel机制上的异常,所以这里其实和之前的限流配置是一个道理,因此下面熔断配置也应该对value自定义名称的资源进行配置,才能作用到此方法上):
@RequestMapping("/borrow2/{uid}")
@SentinelResource(value = "findUserBorrows2", blockHandler = "test")
UserBorrowDetail findUserBorrows2(@PathVariable("uid") int uid) {
throw new RuntimeException();
}
UserBorrowDetail test(int uid, BlockException e){
return new UserBorrowDetail(new User(), Collections.emptyList());
}接着我们对进行熔断配置,注意是对我们添加的@SentinelResource中指定名称的findUserBorrows2进行配置:

OK,可以看到熔断之后,服务降级之后的效果:

最后我们来看一下如何让Feign的也支持Sentinel,前面我们使用Hystrix的时候,就可以直接对Feign的每个接口调用单独进行服务降级,而使用Sentinel,也是可以的,首先我们需要在配置文件中开启支持:
feign:
sentinel:
enabled: true之后的步骤其实和之前是一模一样的,首先创建实现类:
@Component
public class UserClientFallback implements UserClient{
@Override
public User getUserById(int uid) {
User user = new User();
user.setName("我是替代方案");
return user;
}
}然后直接启动就可以了,中途的时候我们吧用户服务全部下掉,可以看到正常使用替代方案:

这样Feign的配置就OK了,那么传统的RestTemplate呢?我们可以使用@SentinelRestTemplate注解实现:
@Bean
@LoadBalanced
@SentinelRestTemplate(blockHandler = "handleException", blockHandlerClass = ExceptionUtil.class,
fallback = "fallback", fallbackClass = ExceptionUtil.class) //这里同样可以设定fallback等参数
public RestTemplate restTemplate() {
return new RestTemplate();
}这里就不多做赘述了。
边栏推荐
- ML、DL、CV常见的问题整理
- 纸质说明书秒变3D动画,斯坦福大学吴佳俊最新研究,入选ECCV 2022
- [QNX Hypervisor 2.2用户手册]9.13 rom
- 49.【拷贝构造函数与重载】
- 新款现代帕里斯帝预售开启,安全、舒适一个不落
- C# using NumericUpDown control
- The latest complete code: Incremental training using the word2vec pre-training model (two loading methods corresponding to two saving methods) applicable to various versions of gensim
- AWS实现定时任务-Lambda+EventBridge
- BigDecimal 简介,常用方法
- el-tooltip的使用
猜你喜欢

百度网盘安装在c盘显示系统权限限制的解决方法

DELL SC compellent 康贝存储系统怎么抓取配置信息

All-round visual monitoring of the Istio microservice governance grid (microservice architecture display, resource monitoring, traffic monitoring, link monitoring)

AWS implements scheduled tasks - Lambda+EventBridge

Miller_Rabin 米勒拉宾概率筛【模板】

232层3D闪存芯片来了:单片容量2TB,传输速度提高50%

多智能体协同控制研究中光学动作捕捉与UWB定位技术比较

Introduction to the PartImageNet Semantic Part Segmentation dataset

深度剖析 Apache EventMesh 云原生分布式事件驱动架构

A detailed explanation of the usage of Async and Await in C#
随机推荐
搭建私有的的Nuget包服务器教程
Even if the image is missing in a large area, it can also be repaired realistically. The new model CM-GAN takes into account the global structure and texture details
Solution for browser hijacking by hao360
MySQL 23道经典面试吊打面试官
技能大赛训练题: 子网掩码划分案例
49. The copy constructor and overloaded 】
20.nn.Module
AWS实现定时任务-Lambda+EventBridge
leetcode:2032. Values that appear in at least two arrays
【Pytorch】F.softmax()方法说明
The batch size does not have to be a power of 2!The latest conclusions of senior ML scholars
ERROR: Failed building wheel for osgeo
Shell脚本经典案例:探测批量主机是否存活
Asynchronous processing business using CompletableFuture
小试牛刀:Go 反射帮我把 Excel 转成 Struct
1-hour live broadcast recruitment order: industry leaders share dry goods, and enterprise registration is open丨qubit · point of view
go使用makefile脚本编译应用
Linux bash: redis-server: 未找到命令
leetcode:485.最大连续 1 的个数
C# Get network card information NetworkInterface IPInterfaceProperties

