Dubbo 支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的?

本文介绍了Dubbo支持的通信协议,如dubbo、rmi、hessian、http等,并重点讲解了序列化协议,包括Hessian的数据结构及其8种原始类型和3种递归类型。同时,讨论了Protocol Buffers(PB)的高效原因,即proto编译器的快速序列化/反序列化和良好的数据压缩效果。

面试题

dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的?

面试官心理分析

上一个问题,说说 dubbo 的基本工作原理,那是你必须知道的,至少要知道 dubbo 分成哪些层,然后平时怎么发起 rpc 请求的,注册、发现、调用,这些是基本的。

接着就可以针对底层进行深入的问问了,比如第一步就可以先问问序列化协议这块,就是平时 RPC 的时候怎么走的?

面试题剖析

序列化,就是把数据结构或者是一些对象,转换为二进制串的过程,而反序列化是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
在这里插入图片描述

dubbo 支持不同的通信协议

dubbo 协议 dubbo://
默认就是走 dubbo 协议,单一长连接,进行的是 NIO 异步通信,基于 hessian 作为序列化协议。使用的场景是:传输数据量小(每次请求在 100kb 以内),但是并发量很高,以及服务消费者机器数远大于服务提供者机器数的情况。

为了要支持高并发场景,一般是服务提供者就几台机器,但是服务消费者有上百台,可能每天调用量达到上亿次!此时用长连接是最合适的,就是跟每个服务消费者维持一个长连接就可以,可能总共就 100 个连接。然后后面直接基于长连接 NIO 异步通信,可以支撑高并发请求。

长连接,通俗点说,就是建立连接过后可以持续发送请求,无须再建立连接。
在这里插入图片描述
而短连接,每次要发送请求之前,需要先重新建立一次连接。
在这里插入图片描述
rmi 协议 rmi://

RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。多个短连接,适合消费者和提供者数量差不多的情况,适用于文件的传输,一般较少用。

hessian 协议 hessian://

Hessian 1 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。走 hessian 序列化协议,多个短连接,适用于提供者数量比消费者数量还多的情况,适用于文件的传输,一般较少用。

http 协议 http://

基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现。走表单序列化。

thrift 协议 thrift://

当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等。

webservice webservice://

基于 WebService 的远程调用协议,基于 Apache CXF 的 frontend-simple 和 transports-http 实现。走 SOAP 文本序列化。

memcached 协议 memcached://

基于 memcached 实现的 RPC 协议。

redis 协议 redis://

基于 Redis 实现的 RPC 协议。

rest 协议 rest://

基于标准的 Java REST API——JAX-RS 2.0(Java API for RESTful Web Services 的简写)实现的 REST 调用支持。

gPRC 协议 grpc://

Dubbo 自 2.7.5 版本开始支持 gRPC 协议,对于计划使用 HTTP/2 通信,或者想利用 gRPC 带来的 Stream、反压、Reactive 编程等能力的开发者来说, 都可以考虑启用 gRPC 协议。

dubbo 支持的序列化协议

dubbo 支持的序列化协议

dubbo 支持 hession、Java 二进制序列化、json、SOAP 文本序列化多种序列化协议。但是 hessian 是其默认的序列化协议。

说一下 Hessian 的数据结构

Hessian 的对象序列化机制有 8 种原始类型:

原始二进制数据
boolean
64-bit date(64 位毫秒值的日期)
64-bit double
32-bit int
64-bit long
null
UTF-8 编码的 string
另外还包括 3 种递归类型:

list for lists and arrays
map for maps and dictionaries
object for objects
还有一种特殊的类型:

ref:用来表示对共享对象的引用。

为什么 PB 的效率是最高的?
其实 PB 之所以性能如此好,主要得益于两个:第一,它使用 proto 编译器,自动进行序列化和反序列化,速度非常快,应该比 XML 和 JSON 快上了 20~100 倍;第二,它的数据压缩效果好,就是说它序列化后的数据量体积小。因为体积小,传输起来带宽和速度上会有优化。

### SOFARPC 和 Dubbo序列化协议支持方面的异同点 #### 1. 序列化协议支持范围 SOFARPC 提供了多种序列化协议支持,包括默认的 SOFA-Hessian 协议以及 Protobuf、JDK 序列化和 JSON 等[^3]。这种多协议支持使得 SOFARPC 能够适应不同的业务需求,尤其是在需要高性能或跨语言通信的场景中。 Dubbo 同样支持多种序列化协议,其中 Hessian 是其默认选项,同时支持 Protobuf、JSON 和 JDK 序列化等[^2]。Dubbo序列化协议选择较为灵活,能够满足不同性能和兼容性需求。 #### 2. 默认协议及性能表现 SOFARPC 默认使用 SOFA-Hessian 协议,这是一种经过优化的二进制序列化协议,具有较高的性能和较低的开销[^3]。SOFARPC 的 HTTP/2 支持进一步增强了其在网络传输中的效率[^4]。 Dubbo 默认采用 Hessian 作为序列化协议,该协议在二进制序列化方面表现出色,但在某些场景下可能不如 Protobuf 或其他现代序列化协议高效。 #### 3. 跨语言支持 SOFARPC 提供了跨语言通信的能力,尽管其主要设计目标是服务于 Java 生态系统,但通过支持多种序列化协议(如 Protobuf),它能够在一定程度上实现跨语言调用[^3]。 Dubbo 的跨语言支持相对较弱,虽然可以通过扩展机制引入其他序列化协议来实现跨语言通信,但其核心设计仍然以 Java 为主[^2]。 #### 4. 配置与灵活性 SOFARPC 的序列化协议配置较为灵活,开发者可以通过简单的注解或配置文件指定所需的序列化方式[^3]。例如: ```java @SofaService(serialize = "protobuf") public class MyService { // 服务实现 } ``` Dubbo 同样提供了灵活的序列化协议配置方式,通常通过 XML 配置或注解完成。例如: ```java @Service(serialization = "protobuf") public class MyService { // 服务实现 } ``` #### 5. 社区支持与生态 SOFARPC 的社区相对较小,主要由蚂蚁集团维护,因此在序列化协议相关的文档和工具支持上可能不如 Dubbo 完善[^3]。 Dubbo 拥有庞大的社区支持,开发者可以轻松找到关于各种序列化协议的最佳实践和解决方案[^2]。 --- ### 示例代码对比 #### SOFARPC 示例 以下是一个使用 SOFA-Hessian 协议的 SOFARPC 服务定义示例: ```java import com.alipay.sofa.rpc.api.SofaService; @SofaService(serialize = "hessian2") public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "Hello, " + name; } } ``` #### Dubbo 示例 以下是一个使用 Hessian 协议Dubbo 服务定义示例: ```java import org.apache.dubbo.config.annotation.Service; @Service(serialization = "hessian2") public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "Hello, " + name; } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值