Istio从入门到精通—— 流量治理的原理 —— 服务熔断
流量治理的原理 —— 服务熔断
一、服务熔断的概念
在分布式系统架构中,高可用三大利器之一服务熔断是一个重要的概念,是用于提高分布式系统的韧性和可靠性的重要手段。
1.1、服务熔断的定义
服务熔断:是一种控制服务访问速率的机制,用于防止系统过载和故障扩散。当某个服务出现故障、延迟过高或者达到预设的阈值时,熔断机制会介入,暂时中断该服务的调用链路,以减少故障的影响范围,并给系统一个恢复的机会。熔断的操作类似于电路中的保险丝,一旦系统出现异常,熔断器会断开电路,以保护整个系统免受进一步的损害。
1.2、服务熔断诞生的由来
服务熔断的概念最早是在分布式系统架构中由 Michael T. Nygard 在其著作《Release It!》中提出的。 Nygard 是一位在分布式系统领域具有丰富经验的架构师和咨询师,他在实践中遇到了许多由于服务故障引发的系统瘫痪问题。通过对这些问题的深入研究,他提出了熔断模式作为解决方案。
Nygard在其著作中详细描述了熔断模式的原理和应用。他指出,在分布式系统中,服务之间的调用链路构成了系统的复杂性,当一个服务出现故障时,如果没有适当的保护措施,故障会迅速传播到其他服务,导致整个系统的瘫痪。为了解决这个问题,他提出了熔断模式的概念。
熔断模式的基本思想是在服务调用链路中引入一个断路器,当某个服务出现故障或延迟过高时,断路器会断开该服务的调用链路,从而隔离故障的影响。其他服务在调用该故障服务时,将收到一个特定的错误响应或降级处理结果,以保证整个系统的稳定性和可靠性。
熔断模式在实际应用中得到了广泛的推广和应用。许多大型分布式系统,如微服务架构、云计算平台等,都采用了熔断模式来提高系统的韧性和可靠性。熔断模式被认为是保护分布式系统免受级联故障影响的有效手段之一。
1.3、服务熔断的应用场景
在分布式系统架构中,以下场景通常会使用服务熔断机制:
- 下游服务故障:当下游服务出现故障、延迟过高或者不稳定时,上游服务为了保护自己以及整个系统的可用性,可以使用熔断机制暂时切断对下游服务的调用。这样,即使下游服务出现问题,上游服务也能够继续正常运行,并提供一定的容错能力。
- 高并发场景:在高并发场景下,如果某个服务的处理能力达到极限,继续接收请求可能导致服务崩溃或性能下降。为了防止这种情况发生,可以使用熔断机制来限制对该服务的请求速率,确保服务在高负载情况下仍然能够稳定运行。
- 关键服务保护:分布式系统中,一些关键服务对于整个系统的正常运行至关重要。为了确保这些关键服务的稳定性和可靠性,可以使用熔断机制来优先保护它们。通过配置熔断策略,可以限制对这些关键服务的请求速率,防止它们在高负载或故障情况下受到影响。
- 防止雪崩效应:当系统中某一服务出现问题时,如果没有熔断机制,可能会导致多个关联服务都出现问题,进而引发整个系统的崩溃。熔断机制可以通过快速地关闭有问题的服务接口,防止这种雪崩效应的发生。
- 流量波动:分布式系统中的流量经常会发生波动,特别是在电商网站、社交媒体等场景下。当流量突然增加时,如果没有适当的限流措施,可能导致系统过载和故障。使用熔断机制可以根据流量的实时情况动态调整服务的访问速率,确保系统在流量波动时仍然能够稳定运行。
1.4、服务熔断解决的痛点
熔断机制主要解决以下问题:
- 防止故障扩散:当一个服务出现故障时,如果没有熔断机制,其他服务可能会继续调用该故障服务,导致故障的连锁反应。熔断机制可以断开故障服务的调用链路,阻止其他服务继续调用,从而防止故障的扩散。
- 保护关键服务:在分布式系统中,一些关键服务对于整个系统的正常运行至关重要。通过配置熔断策略,可以优先保护这些关键服务,确保它们在面临高负载或故障时仍然能够正常运行。
- 提高系统韧性:熔断机制可以使系统在面临压力、故障或高负载时具备一定的自我保护和恢复能力,从而提高系统的韧性和可靠性。
1.5、服务熔断的机制是如何解决问题的
熔断机制通过以下方式解决上述问题:
- 熔断阈值:Hystrix 根据服务的实际情况和性能要求,设置合理的熔断阈值。当服务的请求量、响应时间或其他指标超过阈值时,触发熔断操作。
- 熔断状态:一旦触发熔断操作,将服务标记为熔断状态,并断开其调用链路。其他服务在调用该服务时,将收到一个特定的错误响应或降级处理结果。
- 熔断恢复:在熔断状态持续一段时间后,系统会尝试恢复该服务。这可以通过定期检查服务的状态、重新建立连接或采用其他恢复策略来实现。如果服务恢复正常,则将其从熔断状态中移除,恢复其正常的调用链路。
- 监控和日志记录:对熔断操作进行监控和日志记录,以便及时发现和处理潜在的问题。通过收集和分析相关数据,可以调整熔断阈值、优化恢复策略并持续改进系统的韧性。
1.6、服务熔断的状态流转是怎么样的
在分布式服务系统架构中,服务熔断器有三种主要状态,分别是:关闭(Closed)、开启(Open)和半开启(Half-Open)。这些状态之间的转换是根据服务的健康状况和设定的阈值来决定的。以下是一个表格,展示了服务熔断器的状态流转过程:
状态
|
描述
|
触发条件
|
后续操作
|
关闭(Closed)
|
熔断未开启,正常状态
|
当前健康状况高于设定阈值
|
允许请求通过
|
开启(Open)
|
熔断开启,请求立即返回错误或失败
|
当前健康状况低于设定阈值
|
禁止请求通过,设置超时阀值,等待进入半开启状态
|
半开启(Half-Open)
|
允许少量请求通过,探测服务状态
|
达到超时阀值后,从开启状态转入
|
如果请求符合预期,修复熔断,进入关闭状态;否则再次进入开启状态并重新计算超时
|
二、基于 Hystrix 的服务熔断
https://github.com/Netflix/Hystrix/ Hystrix 音标:英 [hɪst'rɪks] 美 [hɪst'rɪks]
服务熔断在现代微服务架构中起到了至关重要的作用,尤其是当我们考虑到系统的稳定性、可用性和弹性时。提及这一领域的实际应用,Hystrix 无疑是其中最受瞩目的明星。作为 SpringCloud 生态体系中的核心成员,Hystrix 已经为众多企业提供了坚实的容错机制和故障保护功能。
但 Hystrix 的出色之处并不仅仅局限于此。它的设计理念强调低延迟和容错,特别是当系统面临外部远程服务、其他系统或第三方库的访问时。这种隔离策略确保了即使某个服务出现问题,也不会波及其他部分,从而有效地防止了系统的全面崩溃。
需要注意的是,虽然 Hystrix 在业界享有盛誉,但其官方网站已宣布停止维护,并推荐使用 resilience4j这一新的库。对于国内的开发者,SpringCloud Alibaba 也提供了一个很好的替代选择。
深入探索 Hystrix 的工作原理,我们可以发现其背后的哲学是基于隔离、延迟和容错的机制来对抗服务雪崩的场景。简单的来说,如果某个服务因为某些原因变得响应缓慢或根本无响应,Hystrix 可以确保这种延迟或失败不会影响到其他的服务。同时,它还为开发者提供了一个备选方案(fallback),确保在主要服务不可用时,系统仍然能够提供一些基本的功能或数据。
除了上述的核心功能外,Hystrix还为我们提供了以下的价值:
- 对网络延迟及故障进行容错:在分布式系统中,网络问题是常见的。Hystrix 能够识别这些问题,并在短时间内自动恢复,确保系统的平稳运行。
- 阻断分布式系统雪崩:通过隔离策略,Hystrix 确保了一个服务的故障不会导致整个系统的崩溃,从而维护了系统的整体健康。
- 服务降级:在某些极端场景下,为了保证核心功能的正常运行,我们可能需要对非核心服务进行降级。Hystrix 为这样的操作提供了支持。
- 实时监控和警报:Hystrix 还提供了一个实时监控和警报的功能,帮助开发者和运维团队实时了解系统的健康状况,并在出现问题时迅速得到通知。
下面这张图引自于:https://zhuanlan.zhihu.com/p/624860413,该图是其作者根据 Sprintg Cloud 官网示例理解翻译过来的。我在 https://spring.io/projects/spring-cloud 和 https://github.com/Netflix/Hystrix/ 没有找到 Hystrix 这块的图,所以引用了该作者的图。图见下方
不管是直接使用 Netflix 的工具集还是使用 Spring Cloud 包装的框架,他们都建议在代码中写熔断处理逻辑,有针对性地进行处理,但这对业务代码有入侵,这也是与 Istio 较大的差别。
行业内一直以 Histrix 作为熔断的实现模版,尤其是 Spring Cloud。但遗憾的是 Hystrix 在 https://github.com/Netflix/Hystrix/archive/refs/tags/v1.5.18.tar.gz 后就停止维护更新了。还是建议国内程序员使用 Spring Cloud Alibaba。
三、基于 SpringCloudAlibaba Sentinel 的服务熔断
https://sentinelguard.io/zh-cn/
https://github.com/alibaba/Sentinel
四、基于 Istio 的服务熔断
云原生场景中的服务调用关系更加复杂,Istio 提供了一套非侵入的熔断能力来应对这种挑战。
与 Hystrix 类似,在 Istio 中也提供了连接池和故障实例隔离的能力,只是概念和术语稍有不同,比如,前者在 Istio 的配置中叫做连接池管理,后者叫做异常点检查,分别对应 Envoy 的熔断和异常点检查。
Istio 的服务熔断在提高系统的稳定性和可用性,降低故障发生的风险和影响范围方面起着重要作用。从连接池管理和异常点检查两个方向对上文进行分类和详细说明如下。
4.1、连接池管理
Istio 的连接池机管理机制为 TCP 提供了对最大连接数、连接超时时间等的管理方式,为 HTTP 提供了对最大请求数、最大等待请求数、最大重试次数、每次连接的最大请求数等的管理方式,控制客户端对目标服务的连接和访问,在超过配置时快速拒绝。
- 防止服务过载:连接池管理有助于限制对服务的并发请求。当面临大量请求时,Istio 可以限制请求的数量,从而避免服务过载。这实际上是通过管理和控制与服务建立的连接数来实现的,确保服务不会因过多的并发请求而崩溃。
- 减轻系统压力:在服务出现大量请求或故障时,通过管理连接池,Istio 可以熔断部分请求,从而减轻系统的压力。这意味着它会智能地断开或限制某些请求,以确保关键业务可以正常运行,而不会受到非关键业务的影响。
4.2、异常点检查
Istio 提供的异常检查机制动态地将异常实例从负载均衡池中移除,保证了服务的总体访问成功率。
当连续的错误数超过配置的阈值时,后端实例会被移除,异常点检查在实现上对每个上游服务都进行检查,记录服务访问情况。
另外,被移除的实例在一段时间之后,还会被加回来再次尝试访问,如果访问成功,则认为实例正常;如果访问不成功,则认为实例不正常,重新逐出,后面逐出的时间等于一个基础时间乘以驱逐次数。
同时,在 Istio 中可以控制驱逐比例,即有多少比例的服务实例在不满足要求被驱逐。当有太多实例被移除时,这时会忽略负载均衡池上实例的健康标记,仍然会向所有实例发送请求,从而保持一个服务的整体可用性。
- 快速响应故障:Istio 的异常点检查机制使其能够持续监测服务的健康状况。当服务出现故障征兆(例如延迟增加、错误率上升等)时,Istio 可以迅速熔断该服务,从而防止故障的进一步扩散。
- 隔离异常实例:在服务集群中,Istio 利用异常点检查来识别并隔离那些频繁超时或出错的服务实例。这样,即使某些服务实例出现问题,也不会影响整个服务的正常运行。通过隔离这些异常实例,可以确保整个服务的高可用性。
- 控制故障传播范围:当某个服务出现故障时,如果不加以控制,该故障可能会影响到其他与之交互的服务,甚至可能导致整个系统的瘫痪。Istio 通过熔断机制来限制故障的传播范围,确保只有受影响的服务被隔离或限制,从而避免整个系统受到影响。
4.3、和 Hystrix 熔断区别是什么?
- 实现方式:Hystrix 需要在应用程序中嵌入相关库来实现熔断功能,而 Istio 则是通过代理来实现的,无需更改应用程序代码。
- 语言支持:Hystrix 主要针对Java应用程序,而 Istio 的服务熔断机制对应用程序的语言没有特定要求,可以广泛用于各种语言和服务框架。
- 监控和报告:Istio 提供了统一的监控和报告界面,使开发人员能够直观地查看服务的健康状况、流量和熔断状态。而 Hystrix 可能需要与其他监控工具集成才能达到类似的效果。
4.2、和 Hystrix 相比,优点是什么?
- 语言无关性:Istio 的服务熔断机制适用于各种编程语言和服务框架,为开发人员提供了更大的灵活性。
- 易于集成和管理:Istio 的服务熔断功能可以在不修改应用程序代码的情况下实施,可以通过配置来实现,简化了集成和管理的工作。
- 强大的监控和报告功能:Istio 提供了统一的界面进行丰富的监控、流量管理、熔断和报告功能,简化了运维和开发工作。
- 全局视角的熔断管理:Istio 提供了统一的界面和工具,使开发人员和运维人员能够全局地管理和监控服务的熔断状态。
4.3、和 Hystrix 相比,缺点是什么?
- 增加系统复杂性:引入 Istio 会增加系统的复杂性,因为需要在每个服务旁边部署一个代理来实现熔断和其他功能。
- 学习成本:对于不熟悉 Istio 的开发人员和运维人员来说,需要一定的学习成本来掌握和使用 Istio 的服务熔断功能。
- 可能影响性能:虽然 Istio 的服务熔断可以提高系统的稳定性和可用性,但在某些情况下,引入代理和额外的网络跳数可能会对系统性能产生一定的影响。