一、什么是雪崩效应
高并发场景下,A挂了,B还在疯狂的请求A,B会等待A的服务调用超时,调用线程大量阻塞,浪费啊浪费!活活把CPU、内存给榨干了啊…B活活被猪队友A给拖死了。。。B宕机,C,D,也是如此。
这种情况叫服务雪崩,也叫级联故障
二、咋解决
1)超时机制:配置下超时时间,例如1s,那么请求在1s内必须返回,否则把线程掐死,释放资源
2)舱壁分离模式:(线程池隔离模式):就是各个服务,你用你的线程池 我用我们 我们互不打扰。
3)断路器模式:如果在一定时间内失败次数/失败率达到一定阈值,就跳闸,断路器打开------请求直接返回,不去调用原本的逻辑。跳闸后(例如10s后)进入一种半开状态,允许一次请求调用,如果成功断路器关闭,如果失败,继续断着吧。。
三、Sentinel流量控制,容错,降级
开始整活:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>1.7.1</>
</dependency>
这里说明一下,不用DashBoard,需要写代码,缺陷很大,具体的缺陷有:
(1)业务侵入性很大,需要在你的controoler中写入 非业务代码
(2)关于受保护的方法多了的话,blockHandler 需要写很多的代码。
(3)要么就是不能动态的添加规则.
所以玩Sentinel 还是得用上Sentinel DashBoard哈
1、添加依赖
<!--加入sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
//actuator的话,后期可以通过:http://localhost:微服务IP/actuator/sentinel查看所有你整过的限流规则,也就是暴漏端点
<!--加入actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
一切配置好后输入DashBoard ip
接下来主要讲讲一些规则,简单记录下
当你在网页发起请求后,会在簇点链路上用来显示微服务的所监控的API
点击流控按钮 这里的意思是每秒该请求可接受的QPS量为2个,超过就会报出关于流控模式:
1.直接:就是达到阈值直接抛出异常
2.关联:现在又两个API,一个是保存订单(写)一个是查询订单(读),假设我们希望优先操作保存订单也就是saveOrder达到设置的阈值,findById/id 就应该歇一歇了。限流
3.链路:低版本可用,API级别的限流
就是两个请求同时请求同一个资源,会限制某一个资源,如图
@GetMapping("/findAll")
2 public String findAll() {
3 this.orderServiceImpl.common();
4 return “findAll”;
5 }
6
7 @GetMapping("/findAllByCondtion")
8 public String findAllByCondtion() {
9 this.orderServiceImpl.common();
10 return “findAllByCondition”;
11 }
会限制findAll而不会限制findAllByCondition