服务雪崩
微服务调用链路中的某个服务故障,引起整个链路中所有的微服务不可用,这就是雪崩
解决:
超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息
舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat资源,因此也叫线程隔离
熔断降级:由断路器统计业务执行的异常比例,如果超出阈值会熔断该业务,拦截访问该业务的一切请求
流量控制:限制业务访问的QPS(每秒钟访问数量),避免服务因流量的突增而故障
微服务整合Sentinel
引入依赖
<!--sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
修改配置文件
server:
port: 8088
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
限流规则
sentinel默认只标记Controller中的方法为资源,如果要标记其他方法,需要利用@SentinelResource注解 @SentinelResource("任意命名的资源名")
而且sentinel默认会将Controller方法做context整合,导致链路模式流控失效,需要修改application.yml,添加配置
sping:
cloud:
sentinel:
web-context-unify: false #关闭context整合
簇点链路:就是项目内的调用链路,链路中被监控的每个接口就是一个资源。默认情况下sentinel会监控SpringMVC的每一个端点,因此SpringMVC的每一个端点就是调用链路的一个资源
流控规则
阈值类型 QPS(每秒并发数量) 线程数
流控的三种模式 直接 关联 链路
直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认模式
关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
链路:统计从知道链路访问到本资源的请求,触发阈值时,对指定链路限流
流控效果 快速失败 Warm Up 排队等待
快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常,是默认处理方式
warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值
排队等待:让所有的请求按照先后次序排队执行,两个请求的间隔小于指定时长。后面的请求必须等待前面执行完成,如果请求预期的等待时长超过最大时长,则会被拒绝
热点参数限流:热点参数限流是分别统计参数值相同的请求,判断是否超过阈值(默认对
SpringMVC资源无效,需要@SentinelResource注解)
线程隔离和熔断降级,需要开启Feign的Sentinel功能
feign:
sentinel:
enabled: true
给FeignClient编写失败后的降级逻辑
方式一:FallbackClass ,无法对远程调用的异常做处理
方式二:FallbackFactory,可以对远程调用的异常做处理
线程隔离实现方式:在阈值类型中选择线程数使用信号量隔离
熔断策略有三种:慢调用、异常比例、异常数
慢调用:业务的响应时长大于指定时长的请求认定为慢调用。在指定的时间内,如果请求的数量超过设定的最小数量,慢调用比例大于设定的阈值,会触发熔断
异常比例:在指定的时间内,如果出现异常的比例大于设定的阈值,会触发熔断
授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式
白名单:来源在白名单内的调用者可以访问
黑名单:来源在黑名单的调用者不允许访问
例如,我们只允许从网关来的请求访问order-service,那么流控应用就填网关名称
sentinel是通过RequestOriginParser这个接口的ParseOrigin来获取请求来源的,我们可以实现这个接口,重写方法,尝试从request中获取一个名为origin的请求头,作为origin的值
@Component
public class HeaderOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest request) {
// 1.获取请求头
String origin = request.getHeader("origin");
// 2.非空判断
if (StringUtils.isEmpty(origin)) {
origin = "blank";
}
return origin;
}
}
我们必须让所有从gateway路由到微服务的请求都带上origin头
spring:
cloud:
gateway:
default-filters:
- AddRequestHeader=origin,gateway
资源名为路径,流控应用是值origin的值gateway,授权类型为白名单
规则管理模式
原始模式:sentinel的默认模式,将规则保存在内存,重启服务会丢失
pull模式:控制台将配置的规则推送到sentinel客户端,而客户端会将规则保存在本地文件或数据库中。以后会定时去本地文件或数据库查询,更新本地规则
push模式:控制台将配置规则推送到远程配置中心,例如nacos,sentinel客户端监听nacos,获取配置变更的推送消息,完成本地更新