1.服务雪崩
分布式系统环境下, 通常有多层的服务调用,当由于网络原因或者自身的原因,导致服务不可用,调用这个服务就会出现线程阻塞的情况,若有大量请求涌入,导致服务瘫痪。
由于服务与服务的依赖性,故障会传播,不可用请求调用链向上传递,导致整个微服务系统瘫痪。
1.1常见的容错方案
隔离、超时、限流、熔断、降级
隔离:将系统按照一定原则划分为若干个服务模块,各个模块相互独立,无强依赖。当发生故障,将问题和影响隔离在某个模块内部,不影响整体的系统服务。
线程池隔离和信号量隔离
超时:设置一个最大响应时间,若服务调用超出响应时间则断开请求,释放线程。
限流:限定阈值,请求超过阈值则抛弃或者排队处理。
熔断:当下游服务因访问压力过大而响应慢或失败时,上游服务暂时切断对下游服务的调用,以免影响其他服务的运行
降级:为服务提供一个备用方案,一旦服务无法正常调用就执行备用方案。
2.Sentinel
Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
2.1Sentinel 的特征
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 提供了实时的监控功能。通过控制台可以看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 SpringCloud、Dubbo、gRPC 的整合。只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。
- 完善的扩展点:Sentinel 提供简单易用、完善的扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
2.2Sentinel 的组成
核心库(Java 客户端):不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo /Spring Cloud 等框架也有较好的支持。
控制台(Dashboard):基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
3.OpenFeign整合Sentinel
3.1引入sentinel的依赖
<!--服务容错-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
3.2开启Sentinel支持
feign:
sentinel:
enabled: true
3.3创建容错类
@Service
@Slf4j
public class OssFileServiceFallBack implements OssFileService {
@Override
public R test() {
return R.error();
}
@Override
public R removeFile(String url) {
log.info("熔断保护");
return R.error();
}
}
3.4指定容错类
@Service
@FeignClient(value = "service-oss", fallback = OssFileServiceFallBack.class)
public interface OssFileService {