1.3 隔离和降级
一、FeignClient整合Sentinel
虽然限流可以尽量避免因高并发而引起的服务故障,单服务还会因为其他原因而故障。而要将这些故障控制在一定范围,避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了。
不管是线程隔离还是熔断降级,都是以对客户端(调用方)的保护
Feign整合Sentinel
修改yml文件,添加设置(feign与Sentinel坐标都要添加)
feign: sentinel: enable: true # 开启Feign的Sentinel功能给FeignClient编写失败后的降级逻辑
方式一:FallbackClass,对无法远程调用的异常做处理
方式二:FallbackFactory,可以对远程调用的异常做处理,可以选择这种
编写降级方法:
编写降级方法
public class UserClientFallbackFactory implements FallbackFactory<UserServiceClient> { @Override public UserServiceClient create(Throwable cause) { // 使用匿名内部类取编写 return new UserServiceClient() { @Override public User findById(Long id) { // 个人操作,输出日志,返回默认什么都可以 return new User(); } }; } }将编写的方法注册成Bean
public class UserClientConfig { @Bean public UserClientFallbackFactory userClientFallbackFactory() { return new UserClientFallbackFactory(); } }在远程调用接口(服务对外开放的接口文件)中使用降级工厂
@FeignClient(value = "user-service", fallbackFactory = UserClientFallbackFactory.class) // 只添加了这 public interface UserServiceClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
二、线程隔离(舱壁模式)
线程隔离的两种实现方式:
线程池隔离
优点
支持主动超时
支持异步调用
缺点:线程的额外开销比较大
使用场景:低扇出(调用少)
信号量隔离(Sentinel默认采用)
优点:轻量级,无额外开销
缺点:
不支持主动超时
不支持异步调用
使用场景
高频调用
高扇出
设置线程隔离
添加限流时,阈值类型选择线程数,单机阈值就是最大线程数
三、熔断降级
熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例,如果超所阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求

熔断策略
慢调用
业务的响应时长(RT)大于制定时长的请求认定为慢调用请求。在制定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断
新增降级规则,选择慢调用比例,解读如下:统计
统计时长内的最小请求数,如果,最大RT比例超过比例阈值(小数,0.及)则触发熔断,熔断时间为熔断时长
异常比例
新增降级规则,选择异常比例,解读如下:统计
统计时长内的最小请求数,如果,发生异常请求比例超过比例阈值(小数,0.及)则触发熔断,熔断时间为熔断时长
异常数
新增降级规则,选择异常数,解读如下:统计
统计时长内的最小请求数,如果,发生异常请求数量超过异常调用次数则触发熔断,熔断时间为熔断时长
最后更新于
这有帮助吗?