Dubbo 核心协议介绍
前言
学习资源
主流的协议
Dubbo 3 支持多种协议,主流的协议包括:Dubbo、Triple、gRPC、Hessian2、REST 等。
各种协议的对比
协议类型 | 协议名 / 标识 | 传输层 | 核心特性 | 适用场景 | 是否默认协议 |
---|---|---|---|---|---|
Dubbo 协议 | dubbo | TCP | 单一长连接、NIO 异步通信、高性能 | 高并发小数据量场景(消费者数 >> 提供者) | 是 |
Triple 协议 | tri | HTTP/2 | 兼容 gRPC 生态、支持流式通信、跨语言能力增强 | 多语言交互、流式数据传输 | 否 |
gRPC 协议 | grpc | HTTP/2 | Google 开源 RPC 框架、高性能跨语言通信 | 跨语言高性能服务调用 | 否 |
REST 协议 | rest | HTTP | 严格遵循 RESTful 规范、支持 JSON/XML 格式 | 浏览器调用、跨平台集成 | 否 |
RMI 协议 | rmi | TCP | Java 远程方法调用、基于 JRMP 协议 | 仅限 Java 生态的远程调用 | 否 |
Hessian 协议 | hessian | HTTP | 表单序列化、短连接、传输效率优于 WebService | 文件 / 视频等大数据传输 | 否 |
Thrift 协议 | thrift | TCP | Apache 开源 RPC 框架、强类型接口定义 | 多语言服务交互 | 否 |
Redis 协议 | redis | 文本协议 | 基于 Redis 的轻量级通信 | 缓存操作、简单消息队列 | 否 |
WebService | webservice | HTTP | 基于 SOAP 协议、XML 序列化 | 传统企业系统集成 | 否 |
MQTT 协议 | mqtt | TCP | 发布 / 订阅模式、低带宽占用 | 物联网设备通信 | 否 |
Memcached 协议 | memcached | 文本协议 / 二进制协议 | 轻量级键值存储、高效缓存机制 | 分布式缓存、加速数据访问 | 否 |
核心协议的介绍
Dubbo 协议
- Dubbo 的默认协议,基于 TCP 的高性能私有通信协议,默认的通信方式是 Netty4,默认序列化方式是 Hessian2。
- 采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用。反之,Dubbo 协议不适合传送大数据量的服务,比如文件、视频的传输等。
Triple 协议
- 基于 HTTP/1、HTTP/2 的高性能通信协议,使用 Protobuf 传输数据,完全兼容 gRPC 协议;支持 Unary、Streming 等通信模式;支持发布 REST 风格的 HTTP 服务。
- Protobuf(Protocol Buffers) 是由 Google 开发的一种轻量级、高效的数据交换格式,它被用于结构化数据的序列化、反序列化和传输。相比于 XML 和 JSON 等文本格式,Protobuf 具有更小的数据体积、更快的解析速度和更强的可扩展性。
REST 协议
- REST 协议就是平时常说的 RESTful,本质上把它称为协议是不准确的,因为 RESTful 是基于 HTTP/1 协议的。
- 使⽤ REST 协议这种⽅式可以让 Dubbo 服务直接通过 URL 进⾏访问,同时也可以更好地与 SpringCloud 技术栈进⾏整合。
gRPC 协议
- Dubbo 中的 gRPC 协议就是使用 gRPC 来替换 Dubbo 的 RPC 调⽤,本质上将它称为协议是不准确的,因为 gRPC 是 Google 开源⼀种异构语⾔通信的 RPC 框架。
- 本质上 Dubbo 对于 gRPC 协议的⽀持,就是在原有 gRPC 客户端代码上进行了封装。
- Dubbo 引⼊ gRPC 的⽬的是为了更好地支持云原生的开发。
gRPC 的开发流程
- (1) 通过 Protobuf 的 IDL 定义通信数据及操作。
- (2) 通过 Maven 的插件,根据不同的编程语言生成成对应的代码
- (3) 服务端发布 RPC 服务
- (3.1) ⼀元调⽤
- (3.2) 服务端流式 RPC
- (3.3) 客户端流式 RPC
- (3.4) 双向流式 RPC
- (4) 客户端进⾏ RPC 服务的调⽤
- (4.1) 通过 Stub 代理进⾏远程 RPC 的调⽤
Triple 新协议
Triple 是 Dubbo 3 新设计的基于 HTTP/1、HTTP/2 的高性能通信协议,使用 Protobuf 传输数据,完全兼容 gRPC 协议;支持 Request-Response、Streaming 流式等通信模型,可同时运行在 HTTP/1 和 HTTP/2 之上。在阿里巴巴,Triple 协议广泛用于跨环境、跨语言、跨生态互通,已有数十万容器生产级使用。
Triple 协议的设计
传输层
- Triple 协议的底层是基于 HTTP/2 协议实现网络通信,所有数据(包括请求元数据和业务数据)均通过 HTTP/2 二进制帧传输。
序列化层
- 当使用 Protobuf 服务定义模式时,Dubbo 3 默认采用 Protobuf 作为序列化协议,将 Java 对象转换为二进制数据流。
Triple 协议的特性
- 多语言友好,推荐配合 Protobuf 使用 Triple 协议,使用 IDL 定义服务,并使用 Protobuf 编码业务数据
- 更容易适配网关、Mesh 架构,可以更好地支持异构语言通信,且更加适应云原生场景
- 支持 Streaming 流式通信,包括 Request Stream、Response Stream、Bi-direction Stream
- 采用分层设计,其数据交换格式基于 Protobuf 协议开发,具备优秀的序列化 / 反序列化效率,当然还支持多种序列化方式,也支持众多开发语言
- 不仅可以用于 Server 端服务调用,也可以支持浏览器、移动 App 和 IoT 设备与后端服务的交互,同时 Triple 协议无缝支持 Dubbo 3 的全部服务治理能力
Dubbo 官方给出为什么选择 Triple 协议的原因
- 容器化和微服务的兴起促进了针对负载内容优化技术的发展,客户端中使用的传统通信协议(RESTful 或其他基于 HTTP 的自定义协议)难以满足应用在性能、可维护性、扩展性、安全性等方便的需求。一个跨语言、模块化的协议会逐渐成为新的应用开发协议标准。
- 自从 2017 年 gRPC 协议成为 CNCF 的项目后,包括 K8S、ETCD 等越来越多的基础设施和业务都开始使用 gRPC 的生态,作为云原生的微服务化框架,Dubbo 的新协议也完美兼容了 gRPC。并且,对于 gRPC 协议中一些不完善的部分,Triple 也将进行增强和补充。
- Triple 协议的推出,旨在解决 Dubbo 2 中私有 Dubbo 协议带来的互通性问题。简而言之,Dubbo 协议虽然性能好,但是大家不认,带来的问题就是:
- 跨语言限制:对于有多语言诉求的公司来说不够友好,需要额外的工作量。
- 缺乏标准化:Dubbo 协议没有被广泛认可和标准化,无法享受到标准化协议的优势。
- 穿透性差:网络环境中的防火墙、网关、代理服务器等不能识别 Dubbo 协议。
Dubbo 原本已经支持了 gRPC 协议,为什么还要自研 Triple 协议
- 如果只支持 gRPC 协议,不能够体现 Dubbo 的价值,毕竟 gRPC 是 Google 开源的。
- Triple 协议不绑定 IDL,支持 Java Interface 定义服务。gRPC 需要使用 Protobuf,而 Triple 可以通过 Java 接口的方式进行服务暴露。
- Triple 协议同时支持 HTTP/1 和 HTTP/2 协议,而 gRPC 只支持 HTTP/2 协议。
协议的发展历程
- Dubbo 支持多种协议,在
3.0
版本之前支持 Dubbo、gRPC、Hessian2、REST 等核心协议。 - 从 Dubbo
3.0
开始,Dubbo 官方新引入了自研的 Triple 协议,不过也保留了 Dubbo 和 REST 协议的支持。 - 从 Dubbo
3.3
开始,Dubbo 官方直接移除了 REST 协议的直接支持,使用 Triple 协议间接支持 REST 协议。 - 从 Dubbo
3.2
开始,Dubbo 官方已经废弃原有的 gRPC 协议,使用 Triple 协议进行替代,Triple 协议完全兼容 gRPC 协议。
提示
- 自 Dubbo
2.6.0
版本开始,Dubbo 合并了当当网捐献的 DubboX 4 中的主要特性,其中就包括了基于 RESTeasy3.0.19.Final
的 REST 支持,具备 JAX-RS2.0
规范中所有的能力。 - 自 Dubbo
3.3
版本开始,原有的 REST 协议实现已被移除,由 Triple 协议提供更全面的 REST 支持。使用 Triple 协议发布 REST 风格的服务非常简单,通常只需要在服务接口上添加相应的注解,支持三种注解方式:内置注解、Spring Web 注解、JAX-RS 注解。
预览: