协议

协议

Dubbo 框架提供自定义的高性能 RPC 通信协议:基于 HTTP/2 的三重协议和基于 TCP 的 Dubbo2 协议。此外,Dubbo 支持任何第三方通信协议,例如官方支持的 gRPC、Thrift、REST、JsonRPC、Hessian2 等。更多协议可以通过自定义扩展实现。这对于处理多协议通信场景特别有用,这在微服务实践中很常见。

Dubbo 框架不依赖于任何特定的通信协议。在其实现中,Dubbo 对多种协议的支持非常灵活。它允许您在一个应用程序中发布使用不同协议的服务。此外,它支持通过同一个端口将所有协议暴露到外部。

protocols

通过 Dubbo 框架对多种协议的支持,您可以实现

  • 将任何通信协议无缝集成到 Dubbo 服务治理系统中。Dubbo 生态系统下的所有通信协议都可以利用 Dubbo 的编程模型、服务发现和流量控制优势。例如,在 gRPC over Dubbo 的情况下,服务治理和编程 API 可以无缝集成到 Dubbo 生态系统中,无需任何成本。
  • 与不同技术栈兼容,允许在业务系统中混合使用不同的服务框架和 RPC 框架。例如,某些服务可能使用 gRPC 或 Spring Cloud 开发,而其他服务则使用 Dubbo 框架。通过 Dubbo 对多种协议的支持,可以无缝实现互操作性。
  • 简化协议迁移。通过将多个协议与注册中心协调,您可以快速满足公司对协议迁移的需求。例如,从专有协议迁移到 Dubbo 协议,升级 Dubbo 协议本身,从 Dubbo 协议迁移到 gRPC,或从 HTTP 迁移到 Dubbo 协议等等。

HTTP/2 (三重)

三重协议是在 Dubbo 3 中引入的,是一种为云原生时代设计的通信协议。它基于 HTTP/2,完全兼容 gRPC 协议。三重协议原生支持流式通信语义。它可以在 HTTP/1 和 HTTP/2 传输协议上运行,允许您使用 curl 或 Web 浏览器直接访问后端 Dubbo 服务。

自三重协议引入以来,Dubbo 还支持基于 Protocol Buffers 的服务定义和数据传输。但是,三重协议的实现不受限于接口定义语言 (IDL)。例如,您可以直接使用 Java 接口来定义和发布三重服务。三重协议具有更好的网关和代理穿透能力,使其非常适合涉及跨网关和代理通信的部署架构,例如服务网格。

三重协议的主要特性包括

  • 支持 TLS 加密和明文数据传输
  • 支持背压和流量控制
  • 支持流式通信
  • 同时支持 HTTP/1 和 HTTP/2 传输协议

在编程和通信模型方面,三重协议支持以下模式

  • 客户端异步请求响应
  • 服务器端异步请求响应
  • 客户端请求流
  • 服务器端响应流
  • 双向流式通信

开发实践

Dubbo2

Dubbo2 协议是在 TCP 传输层协议之上构建的 RPC 通信协议。由于其紧凑、灵活和高性能的特点,它在 Dubbo2 时代得到了广泛应用。它作为企业构建高性能、大规模微服务集群的关键通信解决方案。在云原生时代,我们建议使用三重协议,因为它更通用,穿透性更好。

Dubbo2 协议还内置支持 HTTP,因此您可以在开发过程中使用 curl 进行快速服务验证或调试。

gRPC

您可以使用 Dubbo 开发和管理微服务,然后使用 gRPC 协议设置底层通信。但是,为什么要这样做而不是直接使用 gRPC 框架,以及与之相比有什么优势?简单来说,这是使用 gRPC 开发微服务的常见模式。请继续阅读以了解更多详细信息。

gRPC 是 Google 的开源通信协议,基于 HTTP/2。正如我们在 产品比较 文档中提到的,gRPC 定位为通信协议及其实现,使其成为纯粹的 RPC 框架。另一方面,Dubbo 定位为微服务框架,为微服务实践提供解决方案。因此,与 Dubbo 相比,gRPC 缺乏对微服务编程模型、服务治理和其他功能的抽象。

在 Dubbo 生态系统中使用 gRPC 协议(gRPC over Dubbo Framework)是一种高效且轻量级的选择。它允许您使用原生 gRPC 协议进行通信,同时避免了基于 gRPC 的自定义和开发的复杂性(在许多企业级实践中,自定义和开发 gRPC 是不可避免的步骤,而 Dubbo 框架为开发人员处理了这一点,使他们能够以最简单的方式使用 gRPC)。

gRPC over Dubbo 示例

REST

微服务领域中常见的通信模式是 HTTP + JSON。这包括主流的微服务框架,如 Spring Cloud 和 Microprofile,它们默认使用这种通信模式。Dubbo 还提供对基于 HTTP 的编程和通信模式的支持。

其他通信协议

除了上面提到的协议之外,您还可以运行以下协议在 Dubbo 之上。对于 Dubbo 来说,只需简单的配置更改即可切换底层服务通信协议,而不会影响其他外围 API 和治理功能。

  • Hessian2
  • Thrift
  • JsonRPC

异构微服务生态系统中的互操作性

有关协议迁移和多协议技术栈共存的实践,请参考这篇 博客文章

配置方法

有关上面提到的协议的配置和使用方法,包括如何配置 single-port multi-protocol 支持,请参考以下 SDK 文档

自定义扩展

除了官方支持的通信协议之外,Dubbo 还支持扩展对新协议的支持。有关具体细节,请参考 【任务】-【可扩展性】-【协议】