概述
在分布式系统下,微服务之间不可避免地会发生相互调用,但是没有一个系统能够保证自身运行的绝对正确。微服务在调用过程中,很可能会面临依赖服务失效的问题,这些问题的发生有很多原因:
- 微服务之间的网络通信出现较大的延迟;
- 被调用的微服务发生了调用异常;
- 依赖的微服务负载过大无法及时响应请求等。
因此希望有一个公共组件能够在服务通过网络请求访问其他微服务时,对延迟和失败提供强大的容错能力,为服务问调用提供保护和控制。
Hystrix Netflix 一个开源项目,它能够在依赖服务失效的情况下,通过以下两种方式来处理: - 隔离系统依赖服务的方式,防止服务级联失败;
- 提供失败回滚机制,使系统能够更快地从异常中恢复。
Hystrix基础能力
Spring对Hystrix 进行封装和适配,使 Hystrix 能够更好地运行于Spring Cloud 环境中,为微服务间的调用提供强有力的容错机制。Hystrix提供如下的能力:
- 通过第三方客户端访问(一般是网络)依赖服务出现高延迟或者失败时,为系统提供保护和控制
- 在复杂的分布式系统中防止级联失败(服务雪崩效应)。
- 快速 Fail fast 同时能快速恢复。
- 提供失败回滚 Fallback 和优雅的服务降级机制。
- 提供近实时的监控和运维控制。
Hystrix原理
断路器为隔断服务调用者和异常服务提供者防止服务雪崩的现象,提供了一种保护措施。
1. 服务雪崩
服务雪崩效应是一 种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程。
2.断路器
在分布式系统中,不同服务之间经常互相调用,当服务提供者不可用时就很有可能发生服务雪崩效应,导致整个系统的不可用 所以为了预防这种情况的发生,可以使用断路器模式进行处理。
断路器将远程方法调用包装在断路器对象中,用于监控方法调用过程的失败。一旦该方法调用发生的失败次数达到一定的阀值,那么这个断路器将会跳闸,在接下来时间里再次调用该方法将会被断路器 直接返回异常,而不再发生该方法的真实调用。这样就避免了服务调用者在服务提供者不可用时发送请求,从而减少线程池中资源的消耗,保护了系统 。
3.服务降级操作
而服务降级是为了在整体资源不够的时候,适当放弃部分服务,将主要的资源投放到核心服务中,待渡过难关之后,再开启已关闭的服务,保证了系统核心服务的稳定。
- 当调用发生问题时,采用备用的Fallback 方法代替主方法执行并返回结果,对失败服务进行了服务降级。
- 当调用服务失败次数超过了断路器的阀值时,断路器将打开,不再进行调用,而是快速失败 ,直接执行Fallback 逻辑进行服务降级,减少资源消耗,保护线程资源。
4.资源隔离
在 Hystrix 中采用了舱壁模式,将系统中的服务提供者隔离起来, 某个服务提供者延迟升高或者失败,并不会导致整个系统失败,同时也能够控制调用这些服务的并发度。
-
线程与线程池
Hystrix 通过将调用服务线程与服务访问的执行线程分隔开来,调用线程能够空出来做其他的工作而不至于因为服务调用的执行阻塞过长时间。
Hystrix将使用独立的线程池对应每一个服务提供者,用于隔离和限制这些服务。
于是,某个服务提供者的高延迟或者饱和资源受限只会发生在该服务提供者对应的线程池中。如果服务提供者的线程池被占满,对该服务提供者的调用会被 Hystrix 直接进入回滚逻辑,快速失败,保护服务调用者的资源稳定。
信号量
除了线程池外, Hystrix 还可以通过信号量(计数器)来限制单个服务提供者的并发量。如果通过信号量来控制系统负载,将不再允许设置超时控制和异步化调用,这就表示在服务提供者出现高延迟时,其调用线程将会被阻塞,直至服务提供者的网络请求超时。如果对服务提供者的稳定性有足够的信心,可以通过信号量来控制系统的负载。
总结:Hystrix高可用系统架构
hystrix 提供了这些功能功能实现高可用系统架构:
- 资源隔离:
让某一刻服务在故障的情况下,不会耗尽系统所有资源。通过资源隔离限制只能使用 10 个线程,那么这个服务出问题,也不会影响整个系统。 - 限流:
高并发流量涌入,比如突然间一秒钟 100万 QPS,系统完全承受不住会直接崩溃。 限流可以只对 10 万 QPS 进行服务,其他的都拒绝。 - 熔断:
服务发生连续故障,导致在一段时间内直接拒绝服务。 - 降级:
如 mysql 挂了,系统发现了就会自动降级。从内存里存的少量数据中,去提取一些数据出来。 - 运维监控:
监控 + 报警 + 优化,各种异常的情况,有问题就及时报警,然后自动化处理。