当前位置:网站首页>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();
}
这里就不多做赘述了。
边栏推荐
猜你喜欢
技能大赛训练题:交换机的远程管理
uniapp微信小程序引用标准版交易组件
An article makes it clear!What is the difference and connection between database and data warehouse?
20.nn.Module
Install the latest pytorch gpu version
C# control ToolStripProgressBar usage
jvm 一之 类加载器
Resnet&API
Solution for browser hijacking by hao360
49. The copy constructor and overloaded 】
随机推荐
Four ways to clear the float and its principle understanding
How to quickly split and merge cell data in Excel
八大排序汇总及其稳定性
Resolved (pymysqL connect to the database error) pymysqL. Err. ProgrammingError: (1146, "Table" test. Students' doesn 't exist ")
Detailed guide to compare two tables using natural full join in SQL
Unity学习笔记 关于AVPro视频跳转功能(Seeking)的说明
Introduction to the PartImageNet Semantic Part Segmentation dataset
ERROR: Failed building wheel for osgeo
Small test knife: Go reflection helped me convert Excel to Struct
The 232-layer 3D flash memory chip is here: the single-chip capacity is 2TB, and the transmission speed is increased by 50%
232层3D闪存芯片来了:单片容量2TB,传输速度提高50%
The magic of SQL MERGE statement (detailed instructions)
Spark Learning: Add Custom Optimization Rules for Spark Sql
All-round visual monitoring of the Istio microservice governance grid (microservice architecture display, resource monitoring, traffic monitoring, link monitoring)
hyperf的启动源码分析(二)——请求如何到达控制器
MySQL [aggregate function]
Shell脚本经典案例:文件的备份
Node version switching management using NVM
A detailed explanation of the usage of Async and Await in C#
AI cocoa AI frontier introduction (7.31)