前言:
虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障。而要将这些故障控制在一定范围避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了,不管是线程隔离还是熔断降级,都是对客户端(调用方)的保护。
一、FeignClient整合Sentinel
Feign整合Sentinel的步骤:
1、在application.yml中配置:feign.sentienl.enable=true
feign:
httpclient:
enabled: true # 支持HttpClient的开关
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 单个路径的最大连接数
sentinel:
enabled: true # 开启了feign对sentinel的支持
2、给FeignClient编写FallbackFactory并注册为Bean
@Slf4j
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
@Override
public UserClient create(Throwable throwable) {
return new UserClient() {
@Override
public User findById(Long id) {
log.info("查询用户异常",throwable);
return new User();
}
};
}
}
3、将FallbackFactory配置到FeignClient
@FeignClient(value = "userservice",fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
二、线程隔离(舱壁模式)
在Sentinel中,线程池隔离和信号量隔离都是用于保护应用程序免受外部资源访问过载的影响,但它们之间有一些关键区别:
-
线程池隔离(Thread Pool Isolation):
- 线程池隔离通过为每个资源调用分配一个独立的线程池来实现隔离。每个资源调用都在自己的线程池中执行,因此当一个资源调用出现问题时,它不会影响到其他资源调用,提高了系统的稳定性。
- 每个线程池都有自己的线程限制、队列大小等配置参数,这些参数可以根据资源的特性和负载情况进行调整。
-
信号量隔离(Semaphore Isolation):
- 信号量隔离通过为每个资源调用分配一个信号量来实现隔离。当资源调用达到指定的并发访问限制时,新的资源调用将被限制或阻塞,直到有可用的资源许可为止。
- 信号量隔离更适用于对资源的并发访问进行限制的场景,而不是将资源调用隔离到不同的线程池中。
关键区别:
- 资源隔离级别: 线程池隔离将资源调用隔离到不同的线程池中,而信号量隔离则将资源调用隔离到并发访问受限的信号量中。
- 资源分配方式: 线程池隔离使用线程池来执行资源调用,而信号量隔离使用信号量来限制资源的并发访问。
- 适用场景: 线程池隔离更适用于需要将资源调用完全隔离开的场景,而信号量隔离更适用于需要限制资源的并发访问的场景。
三、熔断降级
熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。
3.1、 熔断降级的策略:
3.2、断路器熔断策略有三种:慢调用、异常比例、异常数
3.2.1、慢调用:业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。例如:
解读:RT超过500ms的调用是慢调用,统计最近10000ms内的请求,如果请求量超过10次,并且慢调用比例不低于0.5则触发熔断,熔断时长为5秒。然后进入half-open状态,放行一次请求做测试。
3.2.2异常比例或异常数:统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值(或超过指定异常数),则触发熔断。例如:
解读:统计最近1000ms内的请求,如果请求量超过10次,并且异常比例不低于0.5,则触发熔断,熔断时长为5秒。然后进入half-open状态,放行一次请求做测试。
3.3、总结:
Sentinel熔断降级的策略有哪些?
- 慢调用比例:超过指定时长的调用为慢调用,统计单位时长内慢调用的比例,超过阈值则熔断
- 异常比例:统计单位时长内异常调用的比例,超过阈值则熔断
- 异常数:统计单位时长内异常调用的次数,超过闽值则熔断