作者 | 宿何
导读:前几篇我们主要站在应用发布的场景,描述在发布过程中会遇到的灰度、监控、回滚、优雅上下线等保障发布能顺利进行的注意事项。作为一个程序员 GG,可灰度的发布顺利上线往往意味着准点下班。而我们今天要分享的内容则关系到我们能否拥有一个高质量的休息时间,即线上的高可用保障。
前言
阿里巴巴十多年的 双11,锤炼出来了一套业界领先的高可用技术,有一些已经商业化(云产品 PTS、AHAS),也有的开源了如:Sentinel、ChaosBlade。我们这一系列的高可用章节也主要介绍这方面的内容。今天介绍熔断部分,即开源产品 Sentinel 的核心能力。
问题定义
在一个常见的分布式应用中,一个请求先通过终端到达 Gateway,再经过防火墙和网络负载均衡,其中还包括调用下游的其它服务和第三方应用,才能到达前端网络服务;如下图所示:
和这样一个架构一样,大家可能也会遇到如下的一些熟悉的 Case :
- 瞬间洪峰流量导致系统超出最大负载,load 飙高,系统崩溃导致无法正常提供服务;
- “黑马”热点数据击穿缓存,DB 被打垮,挤占正常流量;
- 调用端被不稳定服务拖垮,线程池被占满,导致整个调用链路卡死甚至系统雪崩;
- ......
这些不稳定的场景可能会导致严重后果。大家可能想问:如何做到均匀平滑的用户访问?如何预防流量过大或服务不稳定带来的影响?这时候我们就要请出微服务稳定性的法宝 —— 高可用流量防护,其中重要的手段就是流量控制和熔断降级,它们是保障整个系统稳定性重要的一环。
1. 流量控制
流量是非常随机性的、不可预测的。前一秒可能还风平浪静,后一秒可能就出现流量洪峰了(例如 双11 零点的场景)。然而我们系统的容量总是有限的,如果突然而来的流量超过了系统的承受能力,就可能会导致请求处理不过来,堆积的请求处理缓慢,CPU/Load 飙高,最后导致系统崩溃。因此,我们需要针对这种突发的流量来进行限制,在尽可能处理请求的同时来保障服务不被打垮,这就是流量控制。
2. 熔断降级
一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
Spring Cloud 中如何做熔断?
在原来的 Spring Cloud 产品族中,有自带的熔断组件 Hystrix ,是 Netflix 公司提供的一个开源的组件,提供了熔断、隔离、降级的这些特性,不过 Hystrix 在 2018 年 11 月份开始,就不再迭代开发,进入维护的模式。不过好消息是也就是这一年开源了 Spring Cloud for Alibaba 产品族,其中的 Sentinel 完美的对 Hystrix 做了补充,下面针对 Sentinel 做一些基本介绍。
Sentinel 工作原理
Sentinel 以资源流量(URL、线程、本地函数、Dubbo 服务等)为切入点,根据用户输入的规则,自适应的做到流量控制、熔断降级、系统负载保护等多个维度,全方位的保障系统的稳定性。并提供了一套具备丰富的应用场景、完备的实时监控、广泛的开源生态、完善灵活的 SPI 扩展点的完美的高可用解决方案产品,一个基本的原理介绍图如下,详细介绍请参考官方文档。
在使用上,针对主流框架默认提供自动适配的能力来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。同时,Sentinel 也提供开放的接口,方便您自定义并改变规则。
快速使用 Sentinel 的方式
除了在开源提供的方案之外,Sentinel 已经以多种形态进入到了各种云产品的组合解决方案中,列举如下:
1. 在 AHAS 中使用
Sentinel 现在已经是阿里云云产品 AHAS 的重要能力,使用方式请参考官方文档,相比开源的方式接入,云产品主要省去了繁琐的配置,提供了更快的接入方式,以及更友好的产品管控界面,以及更强大的能力;当然除此之外,最重要的是在接入和运行的过程中,都可以获得原厂同学的直接的支持。
2. 在容器服务 Kubernetes 集群中使用
在容器服务中我们目前做到了纯白屏和云原生的方式进行安装,使用方式请参考官方文档来安装所需的 pilot,在集群中安装完 pilot 之后,会自动选择集群中打上了相应 AHAS 注解的 POD 进行 Sentinel Agent 的挂载,配置如下:
annotations:
# 是否开启 AHAS 应用流控插件, on、true 表示开启, off、false表示关闭
ahasPilotAutoEnable: "on"
# 服务名称,会显示在 AHAS 控制台上
ahasAppName: "<your-service-name>"
3. 在 EDAS 中使用
在 EDAS 中,如果选择的是部署在容器服务 K8s 集群或 Serverless K8s 集群中的应用支持通过重新部署来接入 AHAS,并可在 EDAS 内嵌的监控页面中实时监控流量规则,所有的配置能力都能通过一个控制台白屏化操作完成,全面可视化地保障您的应用可用性,使用方式可以参考文档。
结尾
本文简单介绍了高可用流量防护的背景和手段,在熔断的场景下,我们理解十年的积累打磨了高可用产品 AHAS 来为 Kubernetes Spring Cloud 应用保驾护航。除此之外,AHAS 高可用防护还提供以下能力:
- 针对不稳定弱依赖的熔断降级能力,支持慢调用比例/异常比例策略,支持渐进式恢复策略;
- 机器维度的系统自适应保护,智能化调配系统流量;
- 全自动托管、高可用的集群流量控制;
- 针对 Nginx 网关及 Spring Cloud Gateway、Zuul 等 API Gateway 的网关流控;
- 针对 Istio/Envoy 集群的 Mesh 高可用防护。
需要注意的是,流控降级的配置是需要结合容量规划、依赖梳理来做的。我们可以借助阿里云 PTS 等压测工具对我们的服务进行全链路压测,了解每个服务的最大承受能力,来确定流控和熔断降级的阈值。同时,业务系统需要具备实时监控的能力,以便实时地根据流量情况做出相应的限流降级策略调整,我们下面的章节中将介绍这一利器。
相关文章推荐:
- 《SpringCloud 应用在 Kubernetes 上的最佳实践 —— 开发篇》
- 《SpringCloud 应用在 Kubernetes 上的最佳实践 — 部署篇(开发部署)》
- 《SpringCloud 应用在 Kubernetes 上的最佳实践 — 部署篇(工具部署)》
- 《SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可灰度)》
- 《SpringCloud 应用在 Kubernetes 上的最佳实践 — 诊断(线上联调)》
- 《SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可监控)》
- 《SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可回滚)》
- 《SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(优雅上下线)》
“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”