微服务保护——Sentinel
一、雪崩问题及解决方案
(一) 什么是雪崩
微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。服务D故障引起服务A故障,服务A引起其他服务故障,渐渐导致所有微服务都不可用。有人说,服务A在向服务D发送请求的时候,设置连接超时不就可以了吗?要知道,在高并发的情况下,设置连接超时是不可取的,所以还是会导致雪崩现象。
(二)解决雪崩问题:
1、超时处理:
设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止地等待。
但是这种解决方案只是缓解了雪崩问题,并不能解决雪崩问题。因为请求的超时时间设置为1s,也就是说每秒释放一个请求,但在高并发的情况下,假设每秒请求是2个,那么在一定的时间内,也会导致服务A不可用,最终导致雪崩问题的出现。所以说这种解决方案只是缓解雪崩问题。
2、舱壁模式:
限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。它是通过划分tomcat的资源,划分tomcat的线程,让每个业务最多使用n个线程,进而提高tomcat的容灾能力。但是这种模式会导致一定的资源浪费,比如,服务C已经宕机,但每次还是会尝试让服务A去向服务C发送请求。
3、熔断降级:
有断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。
请求失败占比达到阈值后,这个时候会出现熔断,此后服务A向服务D不能发送请求,请求直接在服务A给拦截。
4、流量控制:
限制业务访问的QPS,避免服务因为流量的突增而故障。这种是从预防层面来解决雪崩问题。Sentinel可以根据服务所能接收的访问频率,向服务发送请求,避免服务出现故障,就不会出现故障转移,也就避免了雪崩问题。也就是将大量的请求一点点的发送给服务,从而预防了雪崩问题。
二、服务保护技术对比
三、Sentinel介绍和安装
(一)初始Sentinel
Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址:https://sentinelguard.io/zh-cn/index.html
(二)安装Sentinel控制台
1、下载
sentinel官方提供了UI控制台,方便我们对系统做限流设置。大家可以在GitHub下载。
2、运行
将jar包放到任意非中文目录,执行命令:
java -jar sentinel-dashboard-1.8.1.jar
四、微服务整合Sentinel
1、在微服务中引入Sentinel依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、配置控制台地址:
spring:
cloud:
sentinel:
transport:
dashboard:localhost:8080