1.雪崩效应
B服务发往A的请求,A服务挂了,那么这个请求就会强制等待,直到请求超时
java 程序中 一个请求往往代表一个线程,线程就会被强制阻塞,如果是高并发服务,阻塞的线程会越来越多,线程代表服务器的资源,比如:内存 CPU 这样B服务会慢慢被A拖垮,导致B服务也会挂掉 基础服务故障导致上层服务故障,并且不断放大,称之为雪崩效应。
2.探讨容错方案
2.1 超时
设置超时时间,比如设置一秒钟超时时间,不管请求是否成功,线程就会被释放。
2.2 限流
微服务被拖死的前提,这是一个高并发的应用系统,才可能有大量的线程阻塞。
如果经过评估,这个服务最大承载的QPS 是 1000 可以为该服务设置个800的QPS
如果达到这个阈值,后面的服务会被限流
2.3 仓壁模式
略 不同线程池
2.4 断路器模式
例子:五秒以内的错误率,错误次数 达到阈值就不去调用其它API
2.5 总结服务容错思想
- 超时(只要释放够快,不容易挂)
- 限流(只吃一碗饭,给我三碗也只吃一碗)
- 仓壁模式(不同线程池)
- 断路器模式(监控+开关)
3.使用Sentinel 实现容错
3.1 Sentinel 是什么?
轻量级的流量控制,熔断降级Java库
3.2 整合Sentinel
// 添加依赖,版本根据自己情况
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
4. Sentinel 控制台
4.1 搭建Sentinel控制台
github地址 下载控制台jar包
// 启动 控制台
java -jar sentinel-dashboard-1.8.1.jar
// 访问 localhost:8080 账号 默认 :sentinel 密码 默认 :sentinel
4.2 整合应用&控制台
应用接入控制台,application.yml 文件修改如下:
server:
port: 8081
spring:
application:
name: lxc-demo
cloud:
sentinel:
transport:
dashboard: localhost:8080
port: 8719
ps: sentinel 是懒加载的,只有请求过才能加载出来