隔离和降级:
虽然限流可以避免因高并发引起的服务故障,但服务还会因为其他原因而故障。而要将这些故障控制在一定范围,避免雪崩,就要靠线程隔离(船舱模式)和熔断降级手段了。
不管时线程隔离还是熔断降级,都是对客户端(调用方)的保护。
Feign整合sentinel:
SpringCloud中,微服务调用都是通过Feign来实现的,因此做客户端保护必须整合Feign和Sentinel。
1.修改需要做保护客户端xxService的application.yml文件,开启Feign的Sentinel功能。
server: port: 8088 spring: datasource: url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false username: root password: Liqi@1997^05*14 driver-class-name: com.mysql.jdbc.Driver application: name: orderservice cloud: nacos: server-addr: localhost:8848 # nacos服务地址 sentinel: transport: dashboard: localhost:8080 # sentinel控制台地址
feign:
httpclient:
enabled: true # 支持HttpClient的开关
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 单个路径的最大连接数
sentinel:
enabled: true # 开启feign对sentinel的支持
2.给FeignClient编写失败后的降级规则
①方法一:FallBackClass,无法对远程调用的异常做处理
②方法二:FallbackFactory,可以对远程调用的异常做处理
步骤一:在feign-api项目中实现定义类,实现FallbackFactory
@Slf4j public class UserClientFallbackFactory implements FallbackFactory{ @Override public UserClient create(Throwable throwable) { return new UserClient() { @Override public User findById(Long id) { log.error("查询用户异常", throwable); return new User(); } }; } }
步骤二:在feign-api项目中的DefaultFeignConfiguration将UserClientFallbackFactory注册为一个bean
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
@Bean
public UserClientFallbackFactory userClientFallbackFactory(){
return new UserClientFallbackFactory();
}
}
步骤三:在feign-api项目中的UserClient接口中使用UserClientFallbackFactory
@FeignClient(value = "userservice", fallbackFactory = UserClientFallbackFactory.class) public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
Sentinel支持的雪崩解决方案:
线程隔离(舱壁模式)
熔断降级
Feign整合Sentinel的过程:
在application.yml中配置 feign.sentinel.enable=true
给FeignClient编写FallbackFactory并注册为bean
将FallbackFactory配置到FeignClient
线程隔离
线程隔离有两种实现方式:
·线程池隔离
在添加限流规则时,可以选择两种阈值模式:
QPS:就是每秒的请求数
线程数:是该资源能使用的tomcat线程数的最大值。也就是通过限制线程数量,实现舱壁模式;
·信号量隔离(Sentinel默认采用)
两者的对比:
优点 | 缺点 | 场景 | |
线程池隔离 |
支持主动超时 支持异步调用 |
线程的额外开销比较大 | 低扇出 |
信号量隔离 |
轻量级 无额外开销 |
不支持主动超时 不支持异步调用 |
高频调用 高扇出 |
熔断降级:
熔断降级是处理雪崩问题的重要手段。其思路是由断路器统计服务调用异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。
断路器的三种状态:closed,open,half-Open
熔断策略:
断路器熔断策略有三种:慢调用、异常比例、异常数
·慢调用:业务响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。例如:
解读:RT超过500ms的调用是慢调用,统计最近10000ms内的请求,如果请求量超过十次,并且慢调用比例不低于0.5,则触发熔断,熔断时长为5s。然后进入half-open状态,放行一次请求做测试。
·异常比例、异常数
异常比例或异常数:统计指定时间内的调用,如果调用次数超过指定请求数,并且出现的异常比例达到设定的比例阈值(或超过指定异常数),则触发熔断。例如:
解读:统计最近1000ms内的请求,如果请求量超过10次,并且异常比例不低于0.4,则触发熔断,熔断时长为5s,然后进入half-open状态,放行一次请求做测试。