如图应用 A 和应用 B 是上下游关系,它们对等部署在单元 1 和单元 2 两个部署单元。应用 B 将自己的地址注册到注册中心。应用 A 通过注册中心发现应用 B 的地址,然后发起 RPC 调用,调用收敛在单元内。单元 2 内应用 B 的 MOSN 根据切流规则将来自上游的流量转发到单元 1 的应用 B。单应用引流的方式可用于多种场景,如:
灰度发布:当应用 B 需要做新的迭代发布,可以先将流量都 100% 切到单元 1,然后完成单元 2 集群的发布,再将单元 1 的流量逐量回切回来,中间有问题随时回切。
容灾:当应用 B 的其中一个单元因为代码配置变更或其它原因导致长时间不可用时,可将流量都切到其它部署单元。
当你给别人转账,这笔流量其实会经过一条具有 n 个应用的链路的处理。微服务的架构带来了诸多好处,也会带来如稳定性的一些挑战。如这笔转账流量所涉及到链路中的 n 个应用,任意一个应用出现了不可用,就会导致这笔支付失败。是否可以让这些应用都识别出如支付这样重要的链路,为其提供高可用的保证。基于 MOSN 的引流能力我们做到了业务链路隔离的方案。
如图有 A,B,C 三个应用,A->B->C 的链路承担了一笔转账的完整处理,另外还有应用 X,Y,Z 等应用和用户会向 A,B 应用发起调用。A,B,C 应用被分为了 GROUP_1 和 GROUP_2 两个分组,各自分组的机器在向注册中心注册自己地址时会将该分组信息带上,上游在发起调用时因此而能区分出下游不同分组的集群。再根据流量的标识而选择将流量路由到哪一个集群。所以平台下发给 MOSN 的规则如下:Match: type = transfer Action: Group = Group_2请求头中含有 transfer 的流量始终路由到 GROUP_2 分组,其它流量都路由到 GROUP_1 分组。这样就可以将重要流量隔离于其它流量,避免被其它流量导致的限流熔断等影响。在机器资源,发布策略,灰度策略上会有更优先的考虑。当重要分组的集群出现不可用时,还可将流量切换到其它分组集群以容灾。
以上只是例举的几个能力建设,实际上还有许多能力和落地场景这里就不再一一展开。Service Mesh 在蚂蚁落地之后,我们的基础组件能力得到了飞速的发展。这得益于 Service Mesh 将业务和基础设施解耦之后所带来的红利。 例如上文中讲到的“业务链路隔离”,其实在很早之前我们有这个方案,可是受制于“上游系统难以推动升级”而一直未落地。在蚂蚁的应用规模之下,绝大部分系统的上游数量都是巨大的,技术栈是多样的,基础组件版本是参差不齐的。再例如“自适应限流”和“服务自愈”,这两项技术存在一定的复杂性,它在有效性和稳定性上都存在一定的挑战。需要在足够多的真实场景下不断去验证,去试错和迭代。而在 Mesh 之前的时代,全集群的基础组件升级一年不过一两次。一个新能力没有把握好一次机会也许就得再等一年。而今天当我们拥有 MOSN 之后,它具备在不打扰业务的情况下将一个基础能力快速覆盖到全集群的能力。这些基础能力在未有 MOSN 的时候其实也能实现,但是在现实中却因其落地时打扰业务,推进困难,迭代缓慢,版本碎片化严重等各种原因而无法真正实现。所以 Service Mesh 的价值得以体现。今年应用系统因基础设施升级而发布的次数大大减少,而我们的技术设施却得到了前所未有的演进速度。
小结
在过去的一年多时间里,蚂蚁在 Service Mesh 上建设了大量能力,这些能力在性能,效能,安全,稳定性和可用率等多个方面为业务带来了帮助,也为基础设施带来了快速的演进。而这些最终正是得益于 Service Mesh 将业务和基础设施的解耦。 在 Service Mesh 落地之后,我们曾设想过 Service Mesh 再向前探索可能会遇到的种种困难,包括资源利用率,性能损耗等等,但是未曾想到其中最先到来也是过去一年中最大的挑战竟然是它。这里先留个悬念,待下期文章进行分享。 - END -