服务容错

Author Avatar
丁起男 08月 22,2021
  • 在其它设备中阅读本文章

服务容错

服务雪崩

在分布式系统中,由于网络原因或自身的原因,服务一般无法保证100%可用。如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若是有大量的请求涌入,就会出现多条线程阻塞等待,进而导致服务瘫痪

由于服务于服务之间的依赖性,故障会传播,会对整个微服务系统造成严重后果,这就是服务故障的”雪崩效应“

我们无法杜绝雪崩源头的发生,只有做好足够的容错,保证在一个服务发生问题,不好影响到其它服务的正常运行,也就是”雪落而不雪崩“

常见容错方案

隔离

将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖。当有故障时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体的系统服务

常用方式:线程池隔离和信号量隔离

超时

在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放掉线程

限流

限制系统的输入和输出流量已达到包含系统的目的。为了保证系统的稳固运行,一旦达到的需要限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的

熔断

当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可用暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施叫做熔断

服务熔断的状态:

  • 熔断关闭状态(closed):服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制
  • 熔断开启状态(open):后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法
  • 半熔断状态(half-open):尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率
    • 如果成功率达到预期,说明服务已恢复,进入熔断关闭状态
    • 如果成功率依旧很低,则从新进入熔断开启状态

降级

降级其实就是为服务提供一个托底方案,一旦服务无法正常调用,就使用托底方案

sentinel

sentinel是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性

组成

  • 核心库(java客户端):不依赖任何框架,能够运行于所有java运行环境,同时对dubbo/spring cloud等框架也有较好的支持
  • 控制台(dashboard):基于spring boot开发,打包后可以直接运行,不需要额外的tomcat等应用容器

核心库使用

添加依赖

		<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

控制台使用

控制台通过下载jar文件,后执行

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.0.jar
  • -Dserver.port=8080 :用于指定控制台端口8080
  • -Dcsp.sentinel.dashboard.server=localhost:8080 :控制台的地址和端口
  • -Dproject.name=sentinel-dashboard:项目名称

然后通过 http://localhost:8080/#/login 登录(默认账号密码:sentinel)

项目中控制台配置:

spring:
  cloud:
    sentinel:
      transport:
        port: 跟控制台交流端口
        dashboard: 控制台主机:端口号

sentinel控制台其实就是一个springboot编写的程序。我们需要将我们的微服务程序注册到控制台上,即在微服务中指定控制台的地址,而且还需要开启一个跟控制台传递数据的端口,控制台也可以通过此端口调用微服务中的监控程序获取微服务的各种信息