1.雪崩
微服务链路上某个服务出现了问题,结果导致整个微服务调用链上所有服务都出现了问题,这就是雪崩。
2.解决雪崩问题的常见方式有四种
1.超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待
2.舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat资源,因此也叫线程隔离
3.熔断降级:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。
4.流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。QPS:每秒钟处理的请求的数量
注意:
1.流量控制可以避免因瞬间高并发流量而导致服务故障。
2.超时处理,线程隔离,熔断降级避免因服务故障引起的雪崩问题
3.超时处理只是缓解了雪崩问题。(比如在1个请求的超时时间过程中又来了其他请求,随着时间推移,还是会耗尽服务的资源)
4.线程隔离由于会创建很多的线程,会造成一定的资源浪费。
5.只有流量控制是预防雪崩,其他三种都是防止已有服务故障,然后又传递到其他的服务中去。
3.线程保护技术
![](https://i-blog.csdnimg.cn/blog_migrate/90b4aee40ff252a548ef9ecc9e56ec22.jpeg)
注意:
1.线程池隔离:
一个业务请求进入tomcat中的时候,给每一个被隔离的业务创建独立的线程池,所以比直接的方式会多出很多很多线程,虽然隔离性好,但是由于线程的数量增多,会造成更多的CPU上下文切换的消耗,所以整个服务性能会下降。
2.信号量隔离:
当业务请求进入tomcat后,不会创建独立线程池,而是统计当前业务已经使用了几个线程了,限定线程的数量,当业务请求数量超过了这个量就会拒绝,限制每个业务能使用的线程数量,减少了线程的创建,在隔离的基础上并没有影响性能。
4.Sentinel
阿里巴巴开源的一款微服务流量控制组件: https://sentinelguard.io/zh-cn/index.html
在GitHub下载,使用时直接启动jar包即可: java -jar sentinel-dashboard-1.8.1.jar
然后账号密码都默认为 sentinel
1.微服务整合Sentinel
1.引入sentinel依赖
<!--sentinel,整合Sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.配置控制台地址
spring:
cloud:
sentinel:
transport:
#配置控制台地址
dashboard: localhost:8080
3.访问微服务的任意端口,触发sentinel监控
5.限流规则
1.簇点链路
就是 项目内的调用链路(请求->springmvc->controller->service->mapper->),链路中被监控的每个接口就是一个资源。 默认情况下sentinel会监控SpringMvc的每一个端点(Endpoint)(可以理解成controller中的方法),因此SpringMVC的每一个端点就是调用链路中的一个资源。流控,熔断等都是针对簇点链路中的资源来设置的。
![](https://i-blog.csdnimg.cn/blog_migrate/0ebdc5a704dea03fb2b8c49fd6208d2d.jpeg)
2.流控模式
在添加限流时,点击高级选项,可以选择三种流控模式:
直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式。
关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流。
链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流。
1.关联模式
关联模式使用