Dubbo 框架

摘要:Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题。


目录

[TOC]

Dubbo 框架

Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。

  • 使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。
  • Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。

在云原生时代,Dubbo 相继衍生出了 Dubbo3、Proxyless Mesh 等架构与解决方案,在易用性、超大规模微服务实践、云原生基础设施适配、安全性等几大方向上进行了全面升级。

Dubbo 的开源故事
  • Apache Dubbo 由阿里捐献到 Apache 开源。

  • 被证实能很好的满足企业的大规模微服务实践,并且能有效降低微服务建设的开发与管理成本,不论是阿里巴巴还是工商银行、中国平安、携程、海尔等社区用户,都通过多年的大规模生产环境流量对 Dubbo 的稳定性与性能进行了充分验证。
  • 后来在很多大企业内部衍生出了独立版本。自云原生概念推广以来,各大厂商都开始拥抱开源标准实现,阿里巴巴将其内部 HSF 系统与开源社区 Dubbo 相融合,与社区一同推出了云原生时代的 Dubbo3 架构
  • 截止 2022 年双十一结束,Dubbo3 已经在阿里巴巴内部广泛落地,实现了老版本 HSF2 框架升级,包括电商核心、阿里云等核心系统已经全面运行在 Dubbo3 之上。

为什么需要 Dubbo,它能做什么?

按照微服务架构的定义,采用它的组织能够很好的提高业务迭代效率与系统稳定性,但前提是要先能保证微服务按照期望的方式运行,要做到这一点需要解决服务拆分与定义、数据通信、地址发现、流量管理、数据一致性、系统容错能力等一系列问题。

Dubbo 可以帮助解决如下微服务实践问题:

  • 微服务编程范式和工具:支持基于 IDL 或语言特定方式的服务定义,提供多种形式的服务调用形式(如同步、异步、流式等)

  • 高性能的 RPC 通信:帮助解决微服务组件之间的通信问题,提供了基于 HTTP、HTTP/2、TCP 等的多种高性能通信协议实现,并支持序列化协议扩展,在实现上解决网络连接管理、数据传输等基础问题。

  • 微服务监控与治理:官方提供的服务发现、动态配置、负载均衡、流量路由等基础组件可以很好的帮助解决微服务基础实践的问题。除此之外,您还可以用 Admin 控制台监控微服务状态,通过周边生态完成限流降级、数据一致性、链路追踪等能力。

  • 部署在多种环境:可以直接部署在容器、Kubernetes、Service Mesh等多种架构下。

  • 活跃的社区:Dubbo 项目托管在 Apache 社区。

  • 庞大的用户群体:Dubbo3 已在阿里巴巴成功落地,实现了对老版本 HSF2 框架全面升级,成为阿里集团面向云原生时代的统一服务框架底座,庞大的用户群体是 Dubbo 保持稳定性、需求来源、先进性的基础。

Dubbo 不是什么?
  • 不是应用开发框架的替代者:Dubbo 设计为让开发者以主流的应用开发框架的开发模式工作,它不是各个语言应用开发框架的替代者,如不是 Spring/Spring Boot 的竞争者,当你使用 Spring 时,Dubbo 可以无缝的与 Spring & Spring Boot 集成在一起。

  • 不仅仅只是一款 RPC 框架:提供了内置 RPC 通信协议实现,但不仅仅是一款 RPC 框架。首先,它不绑定某一个具体的 RPC 协议,开发者可以在基于 Dubbo 开发的微服务体系中使用多种通信协议;其次,除了 RPC 通信之外,Dubbo 提供了丰富的服务治理能力与生态。

  • 不是 gRPC 协议的替代品:支持基于 gRPC 作为底层通信协议,在 Dubbo 模式下使用 gRPC 可以带来更好的开发体验,享有统一的编程模型和更低的服务治理接入成本

  • 不只有 Java 语言实现:自 Dubbo3 开始,提供了 Java、Golang、Rust、Node.js 等多语言实现。

核心概念和架构

architecture

以上是 Dubbo 的工作原理图,从抽象架构上分为两层:

  • 服务治理抽象控制面:不是特指(如注册中心之类的)单个具体组件,而是对 Dubbo 治理体系的抽象表达。控制面包含:协调服务发现的注册中心、流量管控策略、Dubbo Admin 控制台等,如果采用了 Service Mesh 架构则还包含 Istio 等服务网格控制面。
  • Dubbo 数据面:代表集群部署的所有 Dubbo 进程,进程之间通过 RPC 协议实现数据交换,Dubbo 定义了微服务应用开发与调用规范并负责完成数据传输的编解码工作。
    • 服务消费者 (Dubbo Consumer),发起业务调用或 RPC 通信的 Dubbo 进程
    • 服务提供者 (Dubbo Provider),接收业务调用或 RPC 通信的 Dubbo 进程
Dubbo 数据面

从数据面视角,Dubbo 帮助解决了微服务实践中的以下问题:

  • Dubbo 作为 服务开发框架 约束了微服务定义、开发与调用的规范,定义了服务治理流程及适配模式
  • Dubbo 作为 RPC 通信协议实现 解决服务间数据传输的编解码问题

framework

服务开发框架

微服务的目标是构建足够小的、自包含的、独立演进的、可以随时部署运行的分布式应用程序,几乎每个语言都有类似的应用开发框架来帮助开发者快速构建此类微服务应用。

  • 比如 Java 微服务体系的 Spring Boot,帮 Java 微服务开发者以最少的配置、最轻量的方式快速开发、打包、部署与运行应用。

微服务的分布式特性,使得应用间的依赖、网络交互、数据传输变得更频繁,因此不同的应用需要定义、暴露或调用 RPC 服务,那么这些 RPC 服务如何定义、如何与应用开发框架结合、服务调用行为如何控制?

这就是 Dubbo 服务开发框架的含义,Dubbo 在微服务应用开发框架之上抽象了一套 RPC 服务定义、暴露、调用与治理的编程范式。

  • 比如 Dubbo Java 作为服务开发框架,当运行在 Spring 体系时就是构建在 Spring Boot 应用开发框架之上的微服务开发框架,并在此之上抽象了一套 RPC 服务定义、暴露、调用与治理的编程范式。

framework

Dubbo 作为服务开发框架包含的具体内容如下:

  • RPC 服务定义、开发范式。比如 Dubbo 支持通过 IDL 定义服务,也支持编程语言特有的服务开发定义方式,如通过 Java Interface 定义服务。
  • RPC 服务发布与调用 API。Dubbo 支持同步、异步、Reactive Streaming 等服务调用编程模式,还支持请求上下文 API、设置超时时间等。
  • 服务治理策略、流程与适配方式等。作为服务框架数据面,Dubbo 定义了服务地址发现、负载均衡策略、基于规则的流量路由、Metrics 指标采集等服务治理抽象,并适配到特定的产品实现。

想了解如何使用 Dubbo 微服务框架进行业务编码?从以下 SDK 开始微服务项目开发之旅吧。

通信协议

Dubbo 从设计上不绑定任何一款特定通信协议,HTTP/2、RESTgRPC、JsonRPC、Thrift、Hessian2 等几乎所有主流的通信协议,Dubbo 框架都可以提供支持。

  • 这样的 Protocol 设计模式给构建微服务带来了最大的灵活性,开发者可以根据需要如性能、通用型等选择不同的通信协议,不再需要任何的代理来实现协议转换,甚至还可以通过 Dubbo 实现不同协议间的迁移。

protocols

Dubbo Protocol 被设计支持扩展,您可以将内部私有协议适配到 Dubbo 框架上,进而将私有协议接入 Dubbo 体系,以享用 Dubbo 的开发体验与服务治理能力。

  • 比如 Dubbo3 的典型用户阿里巴巴,就是通过扩展支持 HSF 协议实现了内部 HSF 框架到 Dubbo3 框架的整体迁移。

Dubbo 还支持多协议暴露,您可以在单个端口上暴露多个协议,Dubbo Server 能够自动识别并确保请求被正确处理,也可以将同一个 RPC 服务发布在不同的端口(协议),为不同技术栈的调用方服务。

Dubbo 提供了两款内置高性能 Dubbo2、Triple (兼容 gRPC) 协议实现,以满足部分微服务用户对高性能通信的诉求,两者最开始都设计和诞生于阿里巴巴内部的高性能通信业务场景。

  • Dubbo2 协议是在 TCP 传输层协议之上设计的二进制通信协议
  • Triple 则是基于 HTTP/2 之上构建的支持流式模式的通信协议,并且 Triple 完全兼容 gRPC 但实现上做了更多的符合 Dubbo 框架特点的优化。

总的来说,Dubbo 对通信协议的支持具有以下特点:

  • 不绑定通信协议
  • 提供高性能通信协议实现
  • 支持流式通信模型
  • 不绑定序列化协议
  • 支持单个服务的多协议暴露
  • 支持单端口多协议发布
  • 支持一个应用内多个服务使用不同通信协议
Dubbo 服务治理

服务开发框架(数据面)解决了开发与通信的问题,但在微服务集群环境下,仍需要解决无状态服务节点动态变化、外部化配置、日志跟踪、可观测性、流量管理、高可用性、数据一致性等一系列问题,我们将这些问题统称为服务治理

Dubbo 抽象了一套微服务治理模式并发布了对应的官方实现,服务治理可帮助简化微服务开发与运维,让开发者更专注在微服务业务本身。

服务治理抽象

以下展示了 Dubbo 核心的服务治理功能定义

governance

  • 地址发现:服务发现具备高性能、支持大规模集群、服务级元数据配置等优势,默认提供 Nacos、Zookeeper、Consul 等多种注册中心适配,与 Spring Cloud、Kubernetes Service 模型打通,支持自定义扩展。

  • 负载均衡:默认提供加权随机、加权轮询、最少活跃请求数优先、最短响应时间优先、一致性哈希和自适应负载等策略

  • 流量路由:支持通过一系列流量规则控制服务调用的流量分布与行为,基于这些规则可以实现基于权重的比例流量分发、灰度验证、金丝雀发布、按请求参数的路由、同区域优先、超时配置、重试、限流降级等能力。

  • 链路追踪: 官方通过适配 OpenTelemetry 提供了对 Tracing 全链路追踪支持,用户可以接入支持 OpenTelemetry 标准的产品如 Skywalking、Zipkin 等。另外,很多社区如 Skywalking、Zipkin 等在官方也提供了对 Dubbo 的适配。

  • 可观测性:Dubbo 实例通过 Prometheus 等上报 QPS、RT、请求次数、成功率、异常次数等多维度的可观测指标帮助了解服务运行状态,通过接入 Grafana、Admin 控制台帮助实现数据指标可视化展示。
  • Dubbo 服务治理生态还提供了对 API 网关限流降级数据一致性认证鉴权等场景的适配支持。
Dubbo Admin

Admin 控制台提供了 Dubbo 集群的可视化视图,通过 Admin 可以完成集群的几乎所有管控工作。

  • 查询服务、应用或机器状态
  • 创建项目、服务测试、文档管理等
  • 查看集群实时流量、定位异常问题等
  • 流量比例分发、参数路由等流量管控规则下发

Admin

服务网格

将 Dubbo 接入 Istio 等服务网格治理体系。

Dubbo-Mesh

Dubbo、gRPC、Spring Cloud 对比

提到Dubbo,想顺便提下ESB,目前央视新华社也在用ESB来做任务编排,这里先比较下Dubbo和ESB:

  • ESB(企业数据总线),一般采用集中式转发请求,适合大量异构系统集成,侧重任务的编排,性能问题可通过异构的方式来进行规避,无法支持特别大的并发。
  • Dubbo(服务注册管理),采用的是分布式调用,注册中心只记录地址信息,然后直连调用,适合并发及压力比较大的情况;其侧重服务的治理,将各个服务颗粒化,各个子业务系统在程序逻辑上完成业务的编排。

Spring Cloud和Dubbo:

  • 相同之处:都具备分布式服务治理相关的功能,都能够提供服务注册、发现、路由、负载均衡等。

  • 不同:Spring Cloud是提供了一整套企业级分布式云应用的完美解决方案,能够结合Spring Boot、Docker实现快速开发的目的,所以说Dubbo只有Spring Cloud的一部分RPC功能,而且也谈不上谁好谁坏。

    • 不过,Dubbo项目现已停止了更新,淘宝内部由hsf替代dubbo,我想这会有更多人倾向Spring Cloud了。
    • 从开发角度上说,Dubbo常与Spring、zookeeper结合,而且实现只是通过xml来配置服务地址、名称、端口,代码的侵入性是很小的,相对Spring Cloud,它的实现需要类注解等,多少具有一定侵入性。

与 gRPC、Spring Cloud、Istio 的关系

总的来说,它们之间有些能力是重合的,但在一些场景可以把它们放在一起使用。

Dubbo 与 Spring Cloud

dubbo-springcloud

Dubbo 和 Spring Cloud 有很多相似之处,都在整个架构图的相同位置并提供一些相似的功能。

  • 都侧重在对分布式系统中常见问题模式的抽象(如服务发现、负载均衡、动态配置等),同时对每一个问题都提供了配套组件实现,形成了一套微服务整体解决方案,让用户在开发微服务应用时可以专注在业务逻辑开发上。
  • 都完全兼容 Spring 体系的应用开发模式,都对 Spring 应用开发框架、Spring Boot 微服务框架都做了很好的适配。

虽然两者有很多相似之处,但由于它们在诞生背景与架构设计上的巨大差异,两者在性能、适用的微服务集群规模、生产稳定性保障、服务治理等方面都有很大差异。

Spring Cloud 的优势在于:

  • 同样都支持 Spring 开发体系的情况下,Spring Cloud 得到更多的原生支持。
  • 对一些常用的微服务模式做了抽象如服务发现、动态配置、异步消息等,同时包括一些批处理任务、定时任务、持久化数据访问等领域也有涉猎。
  • 基于 HTTP 的通信模式,加上相对比较完善的入门文档和演示 demo 和 starters,让开发者在第一感觉上更易于上手。

Spring Cloud 的问题有:

  • 只提供抽象模式的定义不提供官方稳定实现,开发者只能寻求类似 Netflix、Alibaba、Azure 等不同厂商的实现套件,而每个厂商支持的完善度、稳定性、活跃度各异
  • 有微服务全家桶却不是能拿来就用的全家桶,demo 上手容易,但落地推广与长期使用的成本非常高
  • 欠缺服务治理能力,尤其是流量管控方面如负载均衡、流量路由方面能力都比较弱
  • 编程模型与通信协议绑定 HTTP,在性能、与其他 RPC 体系互通上存在障碍
  • 总体架构与实现只适用于小规模微服务集群实践,当集群规模增长后就会遇到地址推送效率、内存占用等各种瓶颈的问题,但此时迁移到其他体系却很难实现
  • 很多微服务实践场景的问题需要用户独自解决,比如优雅停机、启动预热、服务测试,再比如双注册、双订阅、延迟注册、服务按分组隔离、集群容错等

而以上这些点,都是 Dubbo 的优势所在:

  • 完全支持 Spring & Spring Boot 开发模式,同时在服务发现、动态配置等基础模式上提供与 Spring Cloud 对等的能力。
  • 是企业级微服务实践方案的整体输出,Dubbo 考虑到了企业微服务实践中会遇到的各种问题如优雅上下线、多注册中心、流量管理等,因此其在生产环境的长期维护成本更低
  • 在通信协议和编码上选择更灵活,包括 rpc 通信层协议如 HTTP、HTTP/2(Triple、gRPC)、TCP 二进制协议、rest等,序列化编码协议Protobuf、JSON、Hessian2 等,支持单端口多协议。
  • 从设计上突出服务服务治理能力,如权重动态调整、标签路由、条件路由等,支持 Proxyless 等多种模式接入 Service Mesh 体系
  • 高性能的 RPC 协议编码与实现,
  • 是在超大规模微服务集群实践场景下开发的框架,可以做到百万实例规模的集群水平扩容,应对集群增长带来的各种问题
  • 提供 Java 外的多语言实现,使得构建多语言异构的微服务体系成为可能

如果您的目标是构建企业级应用,并期待在未来的持久维护中能够更省心、更稳定,我们建议你能更深入的了解 Dubbo 的使用和其提供的能力。

Dubbo 在入门资料上的欠缺是对比 Spring Cloud 的一个劣势,这体现在依赖配置管理、文档、demo 示例完善度上,当前整个社区在重点投入这一部分的建设,期望能降低用户在第一天体验和学习 Dubbo 时的门槛,不让开发者因为缺乏文档而错失 Dubbo 这样一款优秀的产品。

Dubbo 与 gRPC

Dubbo 与 gRPC 最大的差异在于两者的定位上:

  • gRPC 定位为一款 RPC 框架,Google 推出它的核心目标是定义云原生时代的 rpc 通信规范与标准实现;
  • Dubbo 定位是一款微服务开发框架,侧重解决微服务实践从服务定义、开发、通信到治理的问题,因此 Dubbo 同时提供了 RPC 通信、与应用开发框架的适配、服务治理等能力。

Dubbo 不绑定特定的通信协议,即 Dubbo 服务间可通过多种 RPC 协议通信并支持灵活切换。

  • 因此,可以在 Dubbo 开发的微服务中选用 gRPC 通信,Dubbo 完全兼容 gRPC,并将 gRPC 设计为内置原生支持的协议之一。

dubbo-grpc

如果您看中基于 HTTP/2 的通信协议、基于 Protobuf 的服务定义,并基于此决定选型 gRPC 作为微服务开发框架,那很有可能您会在未来的微服务业务开发中遇到障碍,这主要源于 gRPC 没有为开发者提供以下能力:

  • 缺乏与业务应用框架集成的开发模式,用户需要基于 gRPC 底层的 RPC API 定义、发布或调用微服务,中间可能还有与业务应用开发框架整合的问题
  • 缺乏微服务周边生态扩展与适配,如服务发现、限流降级、链路追踪等没有多少可供选择的官方实现,且扩展起来非常困难
  • 缺乏服务治理能力,作为一款 rpc 框架,缺乏对服务治理能力的抽象

因此,gRPC 更适合作为底层的通信协议规范或编解码包,而 Dubbo 则可用作微服务整体解决方案。对于 gRPC 协议,我们推荐的使用模式 Dubbo + gRPC 的组合,这个时候,gRPC 只是隐藏在底层的一个通信协议,不被微服务开发者感知,开发者基于 Dubbo 提供的 API 和配置开发服务,并基于 dubbo 的服务治理能力治理服务,在未来,开发者还能使用 Dubbo 生态和开源的 IDL 配套工具管理服务定义与发布。

如果我们忽略 gRPC 在应用开发框架侧的空白,只考虑如何给 gRPC 带来服务治理能力,则另一种可以采用的模式就是在 Service Mesh 架构下使用 gRPC,这就引出了我们下一小节要讨论的内容:Dubbo 与 Service Mesh 架构的关系。

Dubbo 与 Istio

Service Mesh 是近年来在云原生背景下诞生的一种微服务架构,在 Kubernetes 体系下,让微服务开发中的更多能力如流量拦截、服务治理等下沉并成为基础设施,让微服务开发、升级更轻量。Istio 是 Service Mesh 的开源代表实现,它从部署架构上分为数据面与控制面,从这一点上与 Dubbo 总体架构 是基本一致的,Istio 带来的主要变化在于:

  • 数据面,Istio 通过引入 Sidecar 实现了对服务流量的透明拦截,Sidecar 通常是与 Dubbo 等开发的传统微服务组件部署在一起
  • 控制面,将之前抽象的服务治理中心聚合为一个具有统一实现的具体组件,并实现了与底层基础设施如 Kubernetes 无缝适配

Dubbo 已经实现了对 Istio 体系的全面接入,可以用 Istio 控制面治理 Dubbo 服务,而在数据面部署架构上,针对 Sidecar 引入的复杂性与性能问题,Dubbo 还支持无代理的 Proxyless 模式。 除此之外,Dubbo Mesh 体系还解决了 Istio 架构落地过程中的很多问题,包括提供更灵活的数据面部署架构、更低的迁移成本等。

Dubbo-Mesh

数据面的视角,Dubbo 支持如下两种开发和部署模式,可以通过 Istio、Consul、Linkerd 等控制面组件实现对数据面服务的治理。

  • Proxy 模式,Dubbo 与 Envoy 一起部署,Dubbo 作为编程框架 & 协议通信组件存在,流量管控由 Envoy 与 Istio 控制面交互实现。
  • Proxyless 模式,Dubbo 进程保持独立部署,Dubbo 通过标准 xDS 协议直接接入 Istio 等控制面组件。

控制面视角,Dubbo 可接入原生 Istio 标准控制面和规则体系,而对于一些 Dubbo 老版本用户,Dubbo Mesh 提供了平滑迁移方案,具体请查看 Dubbo Mesh 服务网格

0%