目录
雪崩问题
在微服务调用链路中的某个服务故障,引起整个链路中的所有服务都不可用
例如服务A调用服务D,D出现故障,不会返回响应信息,tomcat一直等待响应,不会断开AD的连接,导致A的Tomcat资源耗尽,导致整个链路上的服务都不可用
解决方式
- 超时处理:请求超过一定时间没有响应就返回错误信息,不会无休止等待;只能缓解,如果进入该服务的请求大于释放的速度,还是会出现问题
- 舱壁模式:限定每个业务能使用的线程数,避免整个tomcat资源耗尽,因此也叫线程隔离;资源仍会损耗,一个服务挂了还分配线程给他
- 熔断降级:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求
- 流量控制:限制业务访问的QPS,避免服务因流量突增而故障(预防)
搭建
安装sentinel
https://github.com/alibaba/Sentinel/releases/tag/1.8.1
下载sentinel-dashboard-1.8.1.jar
- 控制台
cd Program Files
java -jar sentinel-dashboard-1.8.1.jar
- 访问
localhost:8080
账号密码:sentinel
如果需要可改配置:
微服务整合sentinel
-
在子pom引入sentinel依赖
<!--引入sentinel--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
-
配置服务地址
spring: cloud: sentinel: transport: dashboard: localhost:8080 #sentinel服务地址
-
向服务发起请求,sentinel实施监控
限流规则
添加限流
流控模式
直接
对当前资源限流
关联
写优先级大于读,当写操作达到一定阈值时,对读限流
链路
针对从指定链路访问到本地资源的请求限流
比如 查询订单 和 创建订单 都要查商品,此时就是两个链路访问同一资源,就可以对其中一条链路(查询订单)限流
流控效果
快速失败
超出阈值的请求会被立即拒绝并抛出异常
预热模式
超出阈值的请求立即拒绝抛异常,但是阈值会动态变化、不断增加
针对服务器冷启动。初始阈值为最大三分之一,可设置预热时长,逐渐增加到最大
排队等待
让所有的请求按先后顺序排队执行,可设置两个请求间最大时长,超过这个最大时间就直接拒绝;实现流量整形
热点参数限流