阿里巴巴服务框架三位一体的选择与实践

简介: 服务框架就像铁路的铁轨一样,是互通的基础,只有解决了服务框架的互通,才有可能完成更高层的业务互通,所以用相同的标准统一,合二为一并共建新一代的服务框架是必然趋势。Dubbo3 是Dubbo2 与 HSF 融合而来,是阿里经济体面向内部业务、商业化、开源的唯一标准服务框架。

1. 阿里巴巴服务框架的选择与实践

1.1 Dubbo 和 HSF 在阿里巴巴的实践

Dubbo 和 HSF 都是阿里巴巴目前在使用的微服务 RPC 框架。

Dubbo 则在 2011 年开源后,迅速成为业界广受欢迎的微服务框架产品,在国内外均有着广泛应用。Dubbo 项目诞生于 2008 年,起初只在一个阿里内部的系统使用;2011 年,阿里 B2B 决定将整个项目开源,仅用了一年时间就收获了来自不同行业的大批用户;2014 年,由于内部团队调整,Dubbo 暂停更新;2017 年 9 月,Dubbo 3 重启开源,在 2019 年 5 月由 Apache 孵化毕业,成为第二个由阿里巴巴捐献至 Apache 毕业的项目。

image

HSF 在阿里巴巴使用更多,承接了内部从单体应用到微服务的架构演进,支撑了阿里历年双十一的平稳运行;自 2008 年 5 月发布第一个版本 1.1 后,经历数年迭代,HSF 从一个基础的 RPC 框架逐渐演变成为日支撑十万亿级别调用的易于扩展的微服务框架。内部场景中,用户既可以选择少量配置轻松接入微服务体系,获取高性能的稳定服务调用。也可以按照自身业务需求,对 HSF 进行扩展,获取整条链路的能力增强。

对于集团内的需求而言,稳定和性能是核心,因此,当时选型了在电商这种高并发场景久经考验的 HSF 做为新一代服务框架核心。随后,HSF 推出了 2.0 的版本,并针对 HSF 之前版本的主要问题进行重构改造,降低了维护成本,进一步提高了稳定性和性能。HSF2.0 解决了通讯协议支持不透明,序列化协议支持不透明等框架扩展性问题。基于 HSF2.0 的 Java 版本,集团内也演进出了 CPP/NodeJs/PHP 等多语言的客户端。由于 HSF 还兼容了 Dubbo 的协议,原有的 Dubbo 用户可以平滑地迁移到新版本上,所以 HSF 推出后很快就在集团全面铺开,部署的 server 数量达到数十万,基本完成了阿里巴巴内部微服务框架的统一,并经历了多年双十一零点流量洪峰的验证。

1.2 下一代微服务的挑战和机遇

然而,业务的发展和框架自身的迭代使得两个框架从协议层的简单兼容已经无法满足需要。随着云计算的不断发展和云原生理念的广泛传播,微服务的发展有着以下趋势:

  1. K8s 成为资源调度的事实标准,Service Mesh 从提出到发展至今已经逐渐被越来越多用户所接受。屏蔽底层基础设施成为软件架构的一个核心演进目标,无论是阿里巴巴还是其他企业用户,所面临的问题都已经从是否上云变为如何平滑稳定地低成本迁移上云。

  2. 由于上云路径的多样以及由现有架构迁移至云原生架构的过渡态存在,部署应用的设施灵活异变,云上的微服务也呈现出多元化的趋势。跨语言、跨厂商、跨环境的调用必然会催生基于开放标准的统一协议和框架,以满足互通需求。

  3. 端上对后台服务的访问呈爆炸性的趋势增长,应用的规模和整个微服务体系的规模都随之增长。

这些趋势也给 HSF 和 Dubbo 带来了新的挑战。

HSF 和 Dubbo 面临的挑战

微服务框架是基础组件,大部分公司在早期选型或业务发展到一定规模的时候都需要确定使用某一个框架。而一个稳定高效的自研框架通常需要较长时间的迭代来打磨优化。所以大部分公司初期都会倾向于使用开源组件。对阿里云而言,这就带来了一个问题:内部使用的是 HSF 框架,而云上的用户大部分都是使用的开源 Dubbo 框架,两种框架在协议、内部模块抽象、编程接口和功能支持上都存在差异。

如何能让使用了 HSF 的阿里集团内部组件的最优实践和前沿技术更简单直接地输出到云上,这是每一个做技术商业化的同学都会遇到和必须解决的问题。其实我们也有过一些探索,云上微服务最早推的是HSF框架,闭源组件在云上输出的时候,对于许多用户而言,遇到问题后无从排查,整个服务框架对于他们来说是一个黑盒的组件。我们发现这并不是一个很好的产品化方向,在云上输出的时候,我们必须选择拥抱开源的方式,主推Dubbo与Spring Cloud框架。

同时在集团内也因为同时存在HSF与Dubbo框架而导致的不少问题。原有部门或公司的技术栈如何更快地融入到现有技术体系是一个绕不开的问题。一个典型的例子就是 2019 年加入阿里巴巴的考拉。考拉之前一直使用 Dubbo 作为微服务框架,基于 Dubbo 构建了大规模的微服务应用,迁移的成本高,风险也大。需要集团和考拉的基础架构部门耗费较长的时间进行迁移前调研、方案设计,确保基本可行后再开始改动。从分批灰度上线,再到最终全量上线。这种换血式的改动不仅需要耗费大量人力,时间跨度也很长,会影响到业务的发展和稳定性。同时由于历史原因,集团内部始终存在着一定数量的 Dubbo 用户。为了更好的服务这部分用户,HSF 框架对 Dubbo 进行了协议层和 API 层的兼容。但这种兼容仅限于互通,随着 Dubbo 开源社区的多年发展,这种基础的兼容在容灾、性能和可迭代性方面,都有着较大的劣势,同时很难对齐 Dubbo 的服务治理体系。在稳定性方面也存在风险,更无法享受到集团技术发展和 Dubbo 社区演进的技术红利。

产生这些问题的根本原因是闭源的 HSF 无法直接用于广大云上用户和外部其他用户,而开源产品对闭源产品的挑战会随着开源和云的不断发展愈演愈烈。越早解决这个问题,阿里巴巴和外部企业用户的云原生迁移成本越低,产生的价值也就越大。

因此,HSF 和 Dubbo 的融合是大势所趋。为了能更好的服务内外用户,也为了两个框架更好发展,Dubbo3 和以 Dubbo3 为内核适配集团内基础架构生态的 HSF3 应运而生。

1.3 三位一体战略下服务框架的最终选择 Dubbo3

Dubbo3 在原有功能集与 API 完全兼容的前提下,同时具备了以下几大面临云原生挑战下的新特性

  • Dubbo 3 支持全新的服务发现模型,Dubbo 3 尝试从应用模型入手,优化存储结构,对齐云原生主流设计模型,避免在模型上带来的互通问题。新模型在数据组织上高度压缩,能有效提高性能和集群的可伸缩性。

  • Dubbo 3 提出了下一代 RPC 协议 —— Triple。这是一个基于 HTTP/2 设计的完全兼容 gRPC 协议的开放性新协议,由于是基于 HTTP/2 设计的,具有极高的网关友好型和穿透性;完全兼容 gRPC 协议是的天然在多语言互通方面上具有优势。

  • Dubbo 3 面向云原生流量治理,提出了一套能够覆盖传统 SDK 部署、Service Mesh 化部署、VM 虚拟机部署、Container 容器部署等场景的统一治理规则,支持一份规则治理大部分场景,大大降低流量治理成本,使得异构体系下全局流量治理变得可能。

  • Dubbo 3 将提供接入 Service Mesh 的解决方案,面向 Mesh 场景,Dubbo 3 提出了两种接入方式,一种是 Thin SDK 模式,部署模型和当前 Service Mesh 主流部署场景完全一样,而 Dubbo 将进行瘦身,屏蔽掉与 Mesh 相同的治理功能,仅保留核心的 RPC 能力;第二种是 Proxyless 模式,Dubbo 将接替 Sidecar 的工作职责,主动与控制面进行通信,基于 Dubbo 3 的统一治理规则应用云原生流量治理功能。

image

2. 服务框架在阿里云商业化方向上的演进思路

对于微服务框架来说,由于关联到客户的业务代码,要做商业化还是有非常大的挑战的。

首先,迁移成本上来说,希望把降低迁移成本为0,最开始我们在云上售卖的是 HSF + EDAS Container 这一套的架构,因此客户在上云的时候,不得不对自己的业务代码进行改造,另外,由于代码不开源,排查问题也是一个非常头疼的问题,后来,我们发现客户大多数的微服务框架都会选择开源的 Dubbo/Spring Cloud,但是客户有自建的注册中心,如果要上云还需要把自己的注册中心迁移到 MSE 注册中心上,这个过程需要用户对代码做改造才行,一般来说会采用双注册的方案,在云上我们发现推动客户做代码改造,包括 SDK 的升级是一件非常难的事情,很多客户的 Dubbo 版本还停留在 4-5 年的版本,不仅需要研发、测试、运维都来关注,还需要排期支持,这个动作会耗费大量的人力资源,同时面临许多稳定性的挑战。光是这一步就会阻挡住许多的客户了,为了解决客户 SDK 升级的问题,我们在想,是否迁移注册中心呢,最好是代码一行也不用改,部署到云上来,但我们又需要提供同等的服务治理能力,因此,我们提出了基于 Java Agent 字节码增强的技术,帮助用户不改一行代码使用云产品,对客户做到了随时可上可下,没有绑定,让客户比较放心的上云产品,同时我们还提供了能力更强的面运维的托管的注册中心。

对于商业化中微服务框架的选择,我们选择的态度一直是拥抱开源。

我们还需要在开源微服务框架的基础上提供差异化的服务治理能力,传统开源微服务框架在 k8s 上的问题在上云的过程中逐步暴露出来。通过一系列和客户的交流,我们总结出了客户的云原生下进行微服务治理的几大痛点,主要包括微服务发布过程中的无损上下线,标签路由,服务鉴权,离群实例摘除,全链路灰度等等,我们通过 Java Agent 技术实现了在用户不改代码的情况下,解决了上述问题,通过客户交流,收集需求,落到产品,给客户 demo 验证这个模式跑通了正向的循环,功能不断丰富中。除了Java Agent,对于多语言的场景我们使用Service Mesh、WASM等技术,同样支持客户无需修改一行代码,就具备于Java应用一致的服务治理能力与体验。

同时在Java Agent的选择上我们也有过一些尝试跟选择,一开始我们使用闭源开发的Java Agent,每个云产品都有一个对应的Java Agent,这样会导致Java Agent过多以及Agent冲突等问题,同时由于我们自己维护的Java Agent 又是闭源的。踩过一些坑后,我们决定使用Arthas One Agent 重构服务治理体系的Agent,将治理相关的Agent合成一个,同时我们底座的Java Agent也使用拥抱开源的策略,我们使用开源的Arthas One Agent。

image

Dubbo3 顺应了这个方向,通过 Dubbo3 + Java Agent 将集团技术发展和 Dubbo 社区演进、以及商业化实践的技术红利不断且持续地输出给云上的客户。

2.1 服务治理无缝支持 Dubbo3

image

阿里云上微服务治理相关的三款云产品:EDAS、MSE、SAE,其中所有的服务治理能力开箱即用,支持近五年来市面上所有开源 Dubbo、Spring Cloud 框架,包括 Dubbo 3 您无需修改一行代码与配置,您只需将您的 Dubbo 3 的应用接入 EDAS/MSE/SAE。包括微服务发布过程中的无损上下线能力,对齐了微服务与K8S POD的生命周期;标签路由能力弱化了对IP的绑定依赖,服务鉴权,离群实例摘除,全链路灰度,服务Mock、服务监控、服务契约等等。

2.2 如何将一个 HSF 应用无缝升级成 Dubbo 3.0 应用

三位一体是阿里巴巴“自研”、“开源”、“商业化”采用统一技术体系,在此技术方向下,Dubbo3 的设计与落地实现了HSF/Dubbo的技术统一,在集团内也正在快速推广落地中。同时 EDAS Container 4.x版本,正是Dubbo3.0的商业化输出形式之一。

如果您的应用在EDAS或者SAE上,使用的是 HSF + EDAS Container 这一套的架构,用户只需升级容器版本至4.x就可以便捷的将HSF应用升级为Dubbo 3.0应用。升级之后,HSF应用可沿用原有开发方式,还可以使用EDAS/SAE为Dubbo应用提供的更加完善的服务治理功能。同时您的HSF应用也将会具备 Dubbo3 的各种新特性、应用级服务发现、Triple协议等。

2.3 Java 微服务 Proxyless Mesh 架构

在异构微服务场景下,随着ServiceMesh方案的普及,原先微服务应用如何在Service Mesh 微服务架构中与其他Mesh节点进行互通以及治理能力对齐成了困扰用户的问题。开源 Spring Cloud / Dubbo 框架在MSE微服务引擎上无需增加Envoy,同时也无需修改任何一行代码就可以与Mesh架构互通。

3. Dubbo3 的大规模生产实践案例

Dubbo3 在落地的过程中,我们具备许多大规模的实践,考拉、钉钉等。

下面以钉钉为例介绍

3.1 背景

为了拥抱容器化、享受云上的福利,钉钉文档在 2020 年启动了上云战役。目前已有 50% 的流量,跑在公有云集群。

3.2 业务挑战

文档的上云,分成了两个阶段。

第一阶段,弹内(即阿里集团内网络)和云上各有一个文档集群:弹内集群承接存量业务;云上集群承接增量业务。弹内集群同时起了代理的功能:对弹内的上游服务来说,弹内集群代理了对文档云上集群的调用;对云上集群来说,弹内服务代理了集团内下游的依赖。

image

第一阶段:弹内、云上各有一个集群

第二阶段,增量数据迁移到了云上,只保留云上集群。上游服务、下游依赖,都是通过 triple 协议直接调用。

image

第二阶段:只有一个云上集群

目前我们处于第一阶段。

在第一阶段,我们有几个诉求

1、希望使用一套代码,跑在弹内、云上两个集群

2、希望弹内集群继续使用 HSF 协议

3、希望云上使用开源的 RPC 协议

4、希望云上、弹内集群,可以互通。

而 Dubbo 3,完美的契合我们的需求。

3.3 落地方案

双集群

image

文档目前有两个集群。弹内集群暴露了 triple、hsf 双协议,云上集群仅暴露 triple 协议。

弹内的版本号保持 1.0.0 不变,云上使用 1.0.0.ZJK 的版本号。

对上游服务来说,只有弹内一个集群,所有流量都是打到弹内集群。这样上游业务无需做任何改造。

单元化路由

弹内服务,对到来的 HSF 请求进行拦截。如果解析出需要将请求路由到云上,则对云上服务发起一次 triple 调用。否则,继续将请求交给弹内的服务。

下游依赖

image

文档有一些对弹内服务的依赖,去除不掉。目前的做法,是文档自己把下游服务做一次封装,暴露出 triple 协议,供云上调用。

服务治理

服务互通完成了之后,就是开始看如何进行服务治理了。包括服务查询、服务测试、服务压测、服务限流、服务监控等。

1. MSE

服务查询、服务测试、服务路由等,都是通过接入 MSE 完成的。这里要特别提一下 MSE 的服务测试。业务同学最开始是在本机 curl hsf 的 http 端口进行测试,非常麻烦,但是在接入MSE服务治理之后,就可以直接用MSE平台的服务测试功能。 服务测试即为用户提供一个云上私网 Postman ,让用户能够轻松调用自己的服务。用户无需感知云上复杂的网络拓扑结构,无需关系服务的协议,无需自建测试工具,只需要通过控制台即可实现服务调用。支持 Dubbo 3.0 框架,以及 Dubbo 3.0 主流的 Triple 协议。

2. 其他

image

由于云上使用了标准的 Dubbo 协议,Ahas、Arms 等中间件,都可以无缝的接入。

3.4 总结

钉钉文档借助三位一体的红利实现三个月内快速上云,通过云产品方式产品化标准化地解决了上云过程中遇到的问题,借助Dubbo3的云原生特性,以及MSE服务治理能力的快速接入与支持,快速完成服务框架从互通到治理的落地。

4. 尾

自研、商用、开源的“三位一体”,使得我们在 双11 中沉淀的核心技术可以直接给到客户使用,省略了经过云上沉淀再输出的过程,降低了客户获取 “双11 同款技术引擎” 的门槛和成本,可帮助客户快速迈入数字原生时代。Dubbo3 正是在这个战略下的选择,Dubbo3 和基于 Dubbo3 内核的 HSF 正在外部和内部齐头并进,为阿里云上、集团内、以及开源的用户提供最佳的用户体验,一起参与来打造最稳定的服务框架,在云原生时代下引领微服务的发展。

作者介绍
目录