这里先介绍一下雪崩问题,雪崩问题就是当一台服务器发生阻塞导致资源耗尽,导致其他的服务器也不能用,从而一大片联级的服务器都不能用雪崩就发生了。处理雪崩问题的常见方法有四种:超时处理,仓壁模式,降级熔断,流量控制。这里介绍sentinel框架的微服务保护技术。 Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址:https://sentinelguard.io/zh-cn/index.html ,sentinel官方提供了UI控制台,方便我们对系统做限流设置。大家可以在GitHub下载。将jar包放到任意非中文目录,执行命令: java -jar sentinel-dashboard-1.8.1.jar 默认端口是8080,可以通过java -Dserver.port=端口号 -jar sentinel-dashboard-1.8.1.jar 来修改端口号,访问http://localhost:8080页面,就可以看到sentinel的控制台了:需要输入账号和密码,默认都是:sentinel。进入后是一片空白,要你在idea上和微服务进行整合
1)引入sentinel依赖
<!--sentinel--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
2)配置控制台
修改application.yaml文件,添加下面内容:
server:
port: 8088
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
3)访问微服务的端口节点
其中流量控制起预防作用。超时处理,线程隔离、降级熔断是在部分服务故障时,将故障控制在一定范围,避免雪崩,是一种补救措施。
流控模式有三种
直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式。
关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流。
链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流。
流控效果也有三种
快速失败:QPS(信号量隔离)超过阈值时,拒绝新的请求
warm up: QPS超过阈值时,拒绝新的请求;QPS阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机。
排队等待:请求会进入队列,按照阈值允许的时间间隔依次执行请求;如果请求预期等待时长大于超时时间,直接拒绝
超时处理是设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待。
线程隔离是通过限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离 线程隔离有两种方式实现:
线程池隔离:给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果特点是基于线程池模式,有额外开销,但隔离控制更强 ;
信号量隔离:不创建线程池,而是计数器模式,记录业务使用的线程数量,达到信号量上限时,禁止新的请求。特点是基于计数器模式,简单,开销小。
熔断降级是在调用方这边加入断路器,统计对服务提供者的调用,如果调用的失败比例过高,则熔断该业务,不允许访问该服务的提供者了。