Dubbo 3.0 - 开启下一代云原生微服务

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 本文整理自作者于 2020 年云原生微服务大会上的分享《Dubbo3.0 - 开启下一代云原生微服务》,主要介绍了关于思考 rpc 框架层面,功能演进的方向是什么?以及怎么更好地支持云上的多语言开发的新思考。

头图.jpeg

作者 | 郭浩(项升)  阿里巴巴经济体 RPC 框架负责人

导读:本文整理自作者于 2020 年云原生微服务大会上的分享《Dubbo3.0 - 开启下一代云原生微服务》,主要介绍了关于思考 rpc 框架层面,功能演进的方向是什么?以及怎么更好地支持云上的多语言开发的新思考。

关注阿里巴巴云原生公众号,后台回复 【818】 即可获取直播回看地址和大会 PPT 合集。

看到这个题目,大家可能会有几个问题,比如,什么是云原生微服务?Dubbo3.0 是什么?和目前的 Dubbo2.0 有什么区别?用了 Dubbo3.0 会带来哪些业务视角的好处?后面的分享会对这些问题逐一解答。

这次分享分为以下几个环节:

  • Dubbo 的演进历史
  • Dubbo 的开源现状
  • 定义 Dubbo3.0 
  • 分享 Dubbo 3.0 目前取得的一些成果

考虑到有些同学对 Dubbo 可能不太熟悉,在介绍背景之前,我先简单介绍一下 Dubbo 是什么。简单地说,Dubbo 是基于 Java 的 RPC 框架。一个 RPC 框架至少由数据格式、传输协议和连接管理组成,这三点也是构成核心。Dubbo 能够被广泛应用主要有两个原因:

  • 一方面是较好的插件机制支撑了多种扩展,这些扩展在不同业务场景和基础架构中能分别发挥最大优势;
  • 另一方面不同于普通的 RPC 框架,Dubbo 的服务治理功能让其在易用性方面脱颖而出,比如路由规则能够支持灵活多样的运行时动态路由,可以基于此功能实现灰度、ABTest、流量回放等功能。

Dubbo 发展历程

简单介绍完 Dubbo,现在让我们一起回顾一下 Dubbo 的历史。

1.PNG

在 2008 年,Dubbo 作为阿里巴巴内部 SOA 解决方案横空出世。业务的急速发展带来了强烈的服务化需求,只用了两年的时间 dubbo 就在内部大面积落地,日均调用量超过了 30 亿。经过落地过程中不断的打磨,Dubbo 无论是在性能上还是在扩展性方面,都成为了当时遥遥领先的 RPC 框架。为了更好地回馈开发用户和其他有服务化需求的公司,在 2011 年 Dubbo 选择了开源,并发布了 2.0.7 版本作为开源的第一个正式版本。

开源后 Dubbo 蓬勃发展,社区活跃,获得了开发者的一致好评。2017 年 9 月,阿里巴巴宣布重启 dubbo 的开源维护,重启开源后,解决了积累很久的 pull request 和 Issue ,以及之前一些公司不得不开始自己维护 dubbo 的私有分支也逐步合入了主干。同时,与社区进一步的互动,也会激发 dubbo 团队对产品的灵感。

目前 Dubbo 团队就是阿里巴巴内部负责服务框架的团队,我们在大流量、大规模集群、服务治理领域有着丰富的实践,这些经验已经在有序地回馈给社区。重启开源后发布的 2.7.x 版本带了了很多新的特性,比如 JDK8 支持,完整的异步支持,以及元数据的精简和抽象。在今年,我们启动了另外一个新的历程碑 —— Dubbo3.0,这也会带领 Dubbo 走向下一个阶段,即云原生微服务。

Dubbo 开源现状

简单介绍完 Dubbo 的历史,下一步我们来走进 Dubbo 的开源现状。

2.PNG

Dubbo 目前有 57 位 committer 和 379 位 contributor 。根据 X-lab 开放实验室最新发布的《2020 年微服务领域开源数字化报告》,Dubbo 的开源活跃度全球排名 693,在微服务框架中排名第五。整个社区蓬勃发展,来自外部的代码贡献量已经超过来自阿里员工的贡献量。也正是由于有这么活跃的社区,Dubbo 目前支持 6 种语言和 30 多个生态项目。

3.png
数据来源《2020 年微服务领域开源数字化报告》,阿里巴巴云原生公众号后台回复关键词“微服务报告”获取报告全文。

作为国内 RPC 框架的领跑者, Dubbo 也在被 Spring Cloud Sleuth、Zipkin、Envoy、Mosn 等标杆项目官方集成。Dubbo-go 子社区是社区演进的另一个探索和优秀实践。Dubbo-go 子社区由官方引导,完全社区化运作和开发,前不久发布的 Dubbo-go 1.5 版本在功能上已经完全对齐 Dubbo-java 2.7 版本,后续的 Dubbo3.0 也会包含 Dubbo-go 3.0 ,让我们拭目以待。

4.PNG

从数据上看, Dubbo 目前有 33k stars 和 21k forks,分别位于 github java 项目前十和前三,用户的认可带来了社区的活跃,而活跃的社区则会以高频率的版本更新带来更多新的、有用的特性来彰显其旺盛的活力。目前已经登记的 Dubbo 企业用户超过了 200 个,其中有 30 多个企业成为了 Dubbo 的生态合作伙伴。

有了这些公司的帮助, Dubbo 在设计、开发、测试、灰度上线的整个流程都有了更强有力的保障。让使用了 Dubbo 的应用跑的更快更稳定一直是 Dubbo 社区不变的追求。

5.PNG

从功能上看,Dubbo 3.0 完成后的功能将涵盖从开发人员直接接触的 API 层到底层传输的完整链路。

API 层将包括基于 IDL 的完整数据交换格式打通,这会带来两方面的好处:

  • 一是统一的 IDL 模型可以生成统一的 client stub 和 server stub,这些 stub 能直接进行非反射调用,会在性能上有很大的提升;
  • 第二点是对异步和 streaming 的原生支持能够给用户更多的选项,根据不同的业务场景选择更方便的用法。

第二层是对于注册中心、元数据中心和配置中心的扩展。注册中心和配置中心基本支持了所有业界主流的实现,元数据中心是 Dubbo 2.7 新抽象出的组件,负责元数据的存取。这里的元数据包括服务的调用配置,如超时时间,序列化方式,协议等,以及对服务方法签名的抽象,方便 Dubbo 实现跨框架和跨语言调用。

集群层是 Dubbo 的一个主要亮点,除了支持各种重试策略外,Dubbo 也提供了各种场景下的负载均衡器,比如随机和权重。值得一提的是,Dubbo3.0 将带来 pull-based 的自适应负载均衡,这将显著提升分布式集群的性能和效率。

再下一层是协议层,协议层是 RPC 框架的内核部分,一般分为应用层协议和传输层协议。应用层协议 Dubbo3.0 支持 GRPC / Redis / REST 等主流协议以及 Dubbo 原生的 Dubbo2.0 协议。传输层支持 HTTP / HTTP2 和一些自定义的协议如 RSOCKET。序列化方面,Dubbo 除了支持 hessian 、Java 外,还支持 protobuf,这对于性能和跨语言都有着巨大的意义。

6.PNG

看完了 Dubbo 3.0-java 的功能图,我们再来看一下 Dubbo-go 的功能图。可以看到,从分层到实现, Dubbo-go 已经基本和 JAVA 对齐,后面的 3.0 版本也会和 JAVA 齐头并进,共同迈向云原生。

Dubbo3.0-下一代云原生微服务

介绍完了 Dubbo 的现状,下面我们进入今天的主题:Dubbo3.0 -下一代云原生微服务。

7.PNG

一个新架构或新技术的出现一定会伴随特定的发展趋势

目前我们可以看到的几个趋势是 K8s 成为资源调度的事实标准、Mesh 化成为主流以及规模上的急速增长。这些趋势的存在对 Dubbo 提出了更高的要求:

  • 首先,用户如何在 K8s 上更方便的部署和调用 Dubbo 服务是必须要解决的问题,要解决这个问题,统一的协议和数据交换格式是必须前提;
  • 其次,Mesh 化的流行带来了多元化问题,即原生 Dubbo 和 Mesh 化 Dubbo 如何共存,多语言的场景如何支持;
  • 第三点,规模的增长会给整个 Dubbo 架构带来更大的挑战,无论是注册中心等组件,还是客户端,都会有更多的数据和调用量。如何在保持稳定的前提下,提供更高效的服务是 Dubbo 演进的重中之重。

这些云原生时代带来的挑战,促成了 Dubbo 的下一代定义。新协议、K8s 基础架构支持、多语言支持和规模化支持四个子项目共同组成了 Dubbo3.0 。下面我们将走进 Dubbo3.0,看看具体有哪些新特性。

1. 下一代 RPC 协议

首先我们从协议开始。

8.PNG

大家可以看到,这是 Dubbo2.0 的协议。从功能上看, Dubbo2.0 提供了 RPC 的核心语义,包括协议头、标志位、请求 ID 以及请求/响应数据。在云原生时代,2.0 协议主要面临两个挑战:

  • 一是生态不互通,用户很难直接理解二进制的协议;
  • 第二是对 Mesh 等网关型组件不够友好,需要完整的解析协议才能获取到所需要的调用元数据,如一些 RPC 上下文,从性能到易用性方面都会面临挑战。

那么,在支持已有的功能和解决存在的问题的前提下,下一代的协议需要有哪些特性呢?

9.PNG

  • 首先,协议需要解决跨语言互通的问题,传统的多语言多 SDK 模式和 Mesh 化跨语言模式都需要一种更通用易扩展的数据传输格式;
  • 其次,协议应该提供更完善的请求模型,除了 Request/Response 模型,还应该支持 Streaming 和 Bidirectional;
  • 第三点,在性能上,新的协议应该保留 request Id 机制,以避免 HOL 带来的性能损耗;
  • 最后,新协议应该易扩展,包括但不限于 Tracing/ Monitoring 等支持,也应该能被各层设备识别,降低用户理解难度。

基于这些需求,HTTP2/protobuf 的组合是最符合的。提到这两个,大家可能很容易想到 GRPC 协议。那新一代的协议和 GRPC 的关系是什么呢?

  • 首先,Dubbo 新协议是基于 GRPC 扩展的协议,这也保证了在生态系统上新协议和 GRPC 是能够互通和共享的;
  • 其次,在这个基础上,Dubbo 新协议将更原生地支持 Dubbo 的服务治理,提供更大的灵活性;
  • 在序列化方面,由于目前大多数应用方还没有使用 Protobuf ,所以新协议会在序列化方面给予足够的支持,平滑的适配现有序列化,方便迁移到 Protobuf;
  • 在请求模型上,新协议将原生支持 Reactive,这也是 GRPC 协议所不具备的。

2. 应用级注册发现

Dubbo3.0 第二个内容是应用级注册发现。

10.PNG

熟悉 Dubbo 的同学都知道,Dubbo 目前的注册发现都是接口级别的。也就是同一个应用发布的多个服务会在注册中心注册多份数据,这些数据彼此独立,方便进行服务化改造和接口迁移。为什么要提出应用级注册发现呢?

主要有两个原因:

  • 一是现有生态系统的互通,包括 Spring cloud 和 K8s 都是基于实例,也就是应用级别进行的注册发现,Dubbo 要成为连接异构系统最好用的 RPC 框架就需要支持实例粒度;
  • 第二个原因是从规模上看,更大规模的增长会带来元数据的极速膨胀,这会给注册中心和客户端带来更大的内存占用。按照现有数据分析,如果升级到应用级注册发现,以平均发布 50 个服务的应用为例,将减少 60% 的内存占用和注册中心数据。以发布超过 10k 接口的平台型应用为例,这些数据可降低 90%。

可以看到,应用级注册发现带来的优化是十分显著的。由于应用级注册发现目前已经基本开发完毕,下面我们可以简单介绍下它的原理。

11.PNG

首先要解决的一个问题是如何保证平滑迁移,用户基于接口的配置怎么映射到应用上去。

这里我们抽象出了元数据中心来管理接口到应用的映射以及应用级的元数据。在部署态,Dubbo 框架会自动上报这个关系到元数据中心。而运行态用户侧的配置和服务治理则通过这份映射关系重新将应用粒度映射到接口粒度。涉及到最核心的部分——选址也是分为两部分,应用级选址和接口级选址同时存在,方便进行服务治理。

3. K8s 云原生支持

Dubbo3.0 第三个内容是 K8s 云原生支持。

12.PNG

这里主要包括两部分内容:

  • 一是需要对齐 K8s 的生命周期,能够让 Dubbo 服务原生的在 K8s 体系内注册和发现;
  • 第二则是对 Mesh 的支持。上面在协议那里我们已经讲到,新协议通过使用 HTTP2 进行 header / payload 分离解决了网关需要解析完整协议的问题。另外一个问题则是服务注册发现和治理,注册发现需要 Dubbo 能够在 Mesh 的 xDS 体系内作为数据面打通。治理则需要将原有的规则逐步迁移至基于  YAML 的剔除 IP 依赖的规则。最终的形态将是原生的 Dubbo 服务能够和基于 thin SDK 的 Dubbo + Mesh 完美互通和进行服务治理。

4. 柔性增强

Dubbo3.0 最后一部分是柔性增强。

13.PNG

柔性增强要解决的问题有两个:

  • 一是在节点异常的情况下,分布式服务能够保持稳定,不出现雪崩等问题;
  • 二是对于大规模的应用,能够以最佳态运行,提供较高的吞吐量和性能。

从方法上看,Dubbo3.0 的柔性增强会以面向失败设计为理念,提供包括精准容量评估、自适应限流、自适应负载均衡的支持,自底向上的分步构建大规模可靠应用。从单一服务的视角看,服务是压不垮的,稳定的。

从分布式视角看,复杂的拓扑不会带来性能的下降,分布式负载均衡能够以最优的方式动态分配流量,保证异构系统能够根据运行时的准确服务容量合理分配请求,从而达到性能最优。

Dubbo3.0 路线图

介绍完了 Dubbo3.0 的主要内容,下面我们来看一下 roadmap。

14.png

在接下来的 9 月份,应用级注册发现会同时在阿里巴巴内部和外部公司同时大规模落地。今年双十一前会交付云原生服务治理规则。到明年的 3 月份,开源侧的新协议支持功能基本完备。明年的 6 月份,云原生 K8s 的支持和 Mesh 支持功能完备,开始试点。柔性增强将在 2022 年的 3 月份全面落地,请拭目以待。

看了 roadmap ,大家可以发现,Dubbo3.0 已经是运行态。

15.PNG

首先,基于 Dubbo3.0 核心的 HSF3.0 在阿里巴巴内部大规模落地,内外统一的路线不仅仅是对 Dubbo 质量的肯定,也是对社区用户的保障和回馈。

后续我们会将内部的大规模高并发经验继续输出到 Dubbo 开源侧,也会以最高的质量来保证 Dubbo 的可靠演进。Dubbo 3.0 的应用级注册发现功能也在内部和开源侧同时灰度试点。在协议侧,新协议已经在阿里巴巴和蚂蚁的互通中得到广泛应用,内部实践的经验将更好的服务开源侧协议演进。

最后,欢迎大家参与 dubbo 的社区,分享你们在实践中的经验,反馈碰到的问题,携手让 Dubbo 发展得更好。

关注阿里巴巴云原生公众号,后台回复 【818】 即可获取直播回看地址和大会 PPT 合集。

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3天前
|
运维 监控 Cloud Native
云原生之旅:从容器到微服务的演进之路
本文将引导您踏上云原生技术的探索之旅,从容器技术的核心概念出发,逐步深入到微服务架构的世界。我们将一起揭开云原生的神秘面纱,探索它如何改变现代软件的开发、部署和运维方式。通过本文,您将获得对云原生技术基础的深刻理解,并激发您进一步探索和应用这些前沿技术的兴趣和灵感。
|
3天前
|
消息中间件 负载均衡 Cloud Native
云原生之旅:从容器到微服务的架构演变
在数字化转型的风潮中,云原生技术以其灵活性、可扩展性和弹性而备受青睐。本文将通过一个虚拟的故事,讲述一个企业如何逐步拥抱云原生,实现从传统架构向容器化和微服务架构的转变,以及这一过程中遇到的挑战和解决方案。我们将以浅显易懂的方式,探讨云原生的核心概念,并通过实际代码示例,展示如何在云平台上部署和管理微服务。
|
3天前
|
运维 Kubernetes Cloud Native
云原生之旅:从容器化到微服务架构的演进之路
在数字化转型的浪潮中,云原生技术如同一股清流,为现代软件开发和运维带来革命性的变化。本文将通过深入浅出的方式,探索云原生的核心概念、关键技术以及它们如何共同塑造了今天的云基础设施和服务模式。我们将一起走进云原生的世界,了解它如何影响应用程序的设计、部署和扩展,并揭示这一趋势背后的哲学和实践。
10 1
|
3天前
|
Cloud Native Java 持续交付
云原生时代的微服务架构实践
在数字化转型的浪潮中,云原生技术已成为推动企业IT现代化的重要力量。本文旨在通过深入浅出的方式,探讨在云原生环境下微服务架构的实践要点,从基础概念到具体实现,带领读者逐步理解并掌握如何在云计算平台上构建、部署和管理高效的微服务应用。我们将一起探索容器化、持续集成/持续部署(CI/CD)等关键技术,并通过实际案例分析,揭示微服务架构带来的业务价值和挑战。无论您是云原生技术的新手,还是希望深化理解的开发者,这篇文章都将为您开启一段云上之旅。
|
4天前
|
Kubernetes Cloud Native 云计算
云原生时代的技术演进:Kubernetes与微服务架构的完美融合
随着云计算技术的飞速发展,云原生概念逐渐深入人心。本文将深入探讨云原生技术的核心——Kubernetes,以及它如何与微服务架构相结合,共同推动现代软件架构的创新与发展。文章不仅剖析了Kubernetes的基本工作原理,还通过实际案例展示了其在微服务部署和管理中的应用,为读者提供了一条清晰的云原生技术应用路径。
18 2
|
11天前
|
Cloud Native 持续交付 Docker
云原生之旅:从容器到微服务的演变之路
【9月更文挑战第31天】在数字化转型的浪潮中,云原生技术如星辰般熠熠生辉。本文将带你探索云原生的核心——容器化与微服务架构,揭示它们如何共同推动现代软件开发的革命。通过深入浅出的语言和生动的比喻,我们将一起走进云原生的世界,理解它的魅力所在,并见证代码示例如何将理论转化为实践。
30 4
|
1天前
|
Cloud Native 持续交付 Docker
云原生之旅:从容器化到微服务架构
【10月更文挑战第2天】在数字化浪潮中,企业纷纷转向云计算以提升灵活性和效率。本文将引导你了解云原生技术的核心概念,包括容器化与微服务架构,并展示如何通过实际代码示例实现这些概念。我们将一起探索如何利用云原生技术来构建、部署和管理现代化应用程序,从而加速创新并保持竞争力。
8 0
|
3天前
|
Cloud Native 持续交付 数据安全/隐私保护
云原生时代的微服务架构设计原则
在数字化浪潮中,企业纷纷上云以获得更大的灵活性和扩展性。云原生技术因此成为现代软件开发的核心。本文将深入探讨在云原生环境下如何设计高效、可靠的微服务架构,涵盖关键设计原则、最佳实践以及面临的挑战。我们将通过实际案例分析,揭示如何在云原生生态中构建和维护微服务,确保系统的稳定性和可维护性。
|
18天前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
18天前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1