充换电企业开迈斯低成本提升线上应用稳定性的最佳实践
业务稳定性挑战大
Aliware
2023 年,开迈斯将继续致力于以用户为中心的整合创新,致力打造智能电动出行。截止今年 5 月底,开迈斯充电网络覆盖国内 180 城,建设 1,198 座充电站和 10,490 个充电终端,积累用户超 196 万。从建设滞后到“适度超前”,未来三年充电桩产业将迎来大发展,市场规模达千亿级。现在全国各地很多城市在对充电桩的增设和利用上在不断升级加码,随着新能源汽车的发展,充电用户群体的诉求飞速增长,开迈斯伴随着业务的快速增长,对其架构的稳定性以及可用性也提出了前所未有的挑战。
开迈斯采用传统的 SpringBoot 方式进行应用开发,应用间通过 Http 请求方式进行互通互联,也正是 SpringBoot 架构的简单性,有效帮助到开迈斯的业务以及微服务数量进行快速扩张。但是随着微服务规模的增大,逐渐发现应用在发布、运行等各个阶段的都存在一些稳定性与效率上的问题。随着用户与的增多,相应的需求也越来越多,业务场景也越来越复杂。在这个时候仅依靠内部测试很难保证可以覆盖到所有的场景,每次应用的发布都需要进行充分的测试与足够的灰度验证。为了满足快速迭代的业务诉求,如何可以做到低成本地进行多个迭代在开发环境并行,并且保证每次业务发版的稳定,成了提效的关键。
在大规模之下,再小的问题都会牵一发而动全身。一方面,我们面对的流量是随机的、无法预测的,当激增流量超出服务承载上限时,可能会使服务变慢、负载飙高,导致服务崩溃。另一方面,分布式微服务架构是复杂的网状架构,调用链路错综复杂,这时候任何一个服务(包括依赖的外部服务)出现不稳定因素(如慢调用或异常)时,都有可能把上游调用方拖垮,进而形成级联影响。因此,在微服务治理中,我们需要一些手段来预防这些不稳定的情况。
面对持续演进增长的微服务架构,开迈斯架构同学也意识到需要引入微服务治理能力对当前的微服务进行恰当的治理,从而进一步提升微服务的稳定性与效率。同样的,业务依旧面临快速发展的诉求,如果将原先的 Spring Boot 框架升级成 Spring Cloud 并且引入各种高阶的服务治理能力,对于目前面对业务快速发展的开迈斯研发同学来说,需要投入成本过于太大。
无感实现微服务架构升级
Aliware
服务间的流量转发与治理
Aliware
既然思路敲定了,大家评估完了稳定性、安全与成本之后,那么就快速开始方案的实践与探索了。我们首先面临的问题是原先通过域名调用 K8s Service 的方式,我们如何将流量转发至 Higress 并且通过 Higress 再转发给真实对应的 Pod 呢?并且在这个过程中我们需要考虑方案的稳定性。
直接想到的方式就是修改 K8s 中的 Service 跟 Endpoints 配置,利用 coreDNS 能力将流量转发至 Higress。
apiVersion: v1kind: Servicemetadata:name: providerspec:type: ClusterIPclusterIP: None---apiVersion: v1kind: Endpointsmetadata:name: providerspec:subsetS:ip: ${higress-slb}port: 80
出于商业化稳定性的考虑 CoreDNS,可以使用同类型产品 privatelinkZone DNS 进行替代,同时可以配置 CNAME 类型的 DNS 记录批量将服务间访问的域名 *.camsnet.com 切换至云原生网关上。
到目前为止我们完成了 Order 的流量被先转发至内部网关 Higress 上,接下来我们需要配置 Higress 路由规则,将流量转发至真实的目标服务中。
我们在 MSE 云原生网关(Higress 商业版)中同步容器服务的 Service 至网关,并且配置对应的路由规则,实现流量转发。
流量经过 MSE 云原生网关转发之后,我们就可以做更多的治理能力了。
这个过程中我们直接可以配置标签路由实现灰度发布的能力,再结合链路追踪实现全链路灰度的能力。 这个过程中我们可以在路由上配置 JWT 鉴权规则,从而达到服务间的安全调用。
可观测与全链路追踪
Aliware
开迈斯通过接入应用实时监控服务 ARMS -应用监控,无需修改一行代码就可以实现应用的监控诊断能力,可以快速了解应用最关键的响应时间,吞吐量,错误率这黄金三指标,同时根据指标的异常利用调用链能力对整个微服务进行快速跟踪。
全链路流量标签透传
Aliware
借助 Tracing Baggage 机制在全链路中传递对应染色标识,因为大部分 Tracing 框架都支持 Baggage 概念及能力,如:OpenTelemetry、Skywalking、Jaeger 等等。当然 ARMS Tracing 能力也是符合这个标准的,我们通过实现 Higress WASM 插件,在 Higress outbound Filter 中将指定的透传 key 如 x-mse-tag 从 Tracing 协议指定位置的 Baggage 中读出 x-mse-tag 对应的值,并塞入到 Http 的 Header 中,供 Higress 进行路由。从而实现自定标签全链路透传的能力。
在微服务架构下,有一些需求开发,涉及到微服务调用链路上的多个微服务同时发生了改动,通常每个微服务都会有灰度环境或分组来接受灰度流量,我们希望通过进入上游灰度环境的流量,也能进入下游灰度的环境中,确保 1 个请求始终在灰度环境中传递,即使这个调用链路上有一些微服务没有灰度环境,这些应用请求下游的时候依然能够回到灰度环境中。如果一次发布涉及到链路中的多个微服务,我们可以顺滑地进行全链路灰度发布,并且不用担心灰度流量乱窜的风险。
流量防护能力
Aliware
流量控制
熔断降级
更多的探索与实践
Aliware
不需要改代码,我们也能快速具备完整、体系化的微服务治理能力。目前开迈斯基于 Higress 实现了全链路灰度、全链路追踪与可观测、流量防护等一系列能力,使得开迈斯当前的架构可以更加从容地面对快速增长业务带来的挑战。