`

dubbo 序列化是如何封装的

阅读更多
dubbo 是支持多种序列化方式的,那么它就必须在此基础上做一层封装,来统一序列化层的接口.

现在我们拿 Java 中的序列化来讲解 dubbo 是如何进行封装的.

如果使用 java 序列化,需要做那几步了?

1.实现 java.io.Serializable

2.new ObjectOutputStream,并调用 writeObject 方法写对象

反序列化:

1.new ObjectInputStream

2.调用 readObject 方法读对象.


那么现在 dubbo 需要在此基础上,可以自由使用多种序列化方式,该如何做了?

1.是不是需要一个类似 ObjectOutputStream 和 ObjectInputStream 的角色?是的,在 dubbo 中,它们的名字是DataInput 和 DataOutput
2.光有上面的那两个工具没用呀,需要一个统一多种序列化方式的入口,所以还得一个 Serialization.
3.虽然 dubbo 支持多种序列化方式,那么到底支持哪些了?这些是不是得有一个地方存我支持哪些序列化方式了?确实,在 Constants 中.
4.我们需要对对象序列化的支持,而上面的 DataInput 和 DataOutput 只是对某个值的序列化和反序列化,所以在此基础上,我们需要 ObjectInput 和 ObjectOutput.
5.我们在想远一点,就拿 MySQL 来说吧,每次执行 sql 的时候,会有一个优化器,帮你做出选择,怎么支持会快. 那么序列化是不是也可以这么干了?所以就会有一个 SerializationOptimizer.
6.SerializationOptimizer 中返回的列表会注册到 SerializableClassRegistry 中. 按我的理解,应该是对某些类进行优化序列化吧.

下面来分析下具体的序列化是如何做的,上面只是为统一序列化定义的统一接口.

换句话说,如果我们要自己定义一个序列化方式,应该如何做?

1.实现 Serialization
2.实现 ObjectInput & ObjectOutput


具体看下吧:

这个类很简单,算是入口吧.
public class NativeJavaSerialization implements Serialization {


    @Override
    public byte getContentTypeId() {
        return NATIVE_JAVA_SERIALIZATION_ID;
    }

    @Override
    public String getContentType() {
        return "x-application/nativejava";
    }

    @Override
    public ObjectOutput serialize(URL url, OutputStream output) throws IOException {
        return new NativeJavaObjectOutput(output);
    }

    @Override
    public ObjectInput deserialize(URL url, InputStream input) throws IOException {
        return new NativeJavaObjectInput(input);
    }
}

我们看下 ObjectInput & ObjectOutput.

我们可以看到 NativeJavaObjectInput 只是对 ObjectInputStream 的简单封装,NativeJavaObjectOutput 只是对 ObjectOutputStream 的简单封装.

我们再看下 JavaSerialization.

JavaObjectInput 是在 NativeJavaObjectInput 之上构建的,区别是 JavaObjectInput 加入了对空值的判断.

接着看下 CompactedJavaSerialization

CompactedJavaSerialization 的使用场景不了解,暂时不管了.

我也看了下 hessian2 的实现,发现和 JDK 中的实现类似,都是对具体实现的封装,例如 hessian2 是对 Hessian2Input 的封装.
1
0
分享到:
评论

相关推荐

    nodejs使用原生的dubbo协议打通了dubbo的rpc方法调用.

    描述进一步提到,“nodejs 使用原生的 dubbo (dubbo head hessian body) 协议”,这表明在Node.js中,开发者不仅实现了Dubbo的协议头(head),还处理了Hessian二进制序列化协议作为消息体(body)。Hessian是一种...

    dubbo的技术文档

    - **序列化(Serialization)**:数据在网络中传输前需要进行序列化,Dubbo支持多种序列化方式,如Hessian2、FastJson、Kryo等,选择合适的序列化方式可以提高通信效率。 5. **服务治理**: - **负载均衡(Load ...

    dubbo-dubbo-2.7.2源码

    Dubbo协议是默认的高性能二进制协议,它实现了高效的序列化和反序列化,降低了网络传输开销。 五、服务接口与实现 服务接口定义了服务的契约,通常是一个Java接口,服务提供者实现这个接口并暴露服务,服务消费者...

    dubbo入门学习框架源码

    1. 远程调用(RPC):Dubbo的Remoting层处理服务间的网络通信,包括协议解析、序列化、连接管理等。Protocol接口定义了服务调用的基本操作,如refer、invoke等,而Exporter和Invoker接口则封装了服务暴露和调用的...

    dubbo源码解析2

    - **6.5.2 序列化**:为了在网络中传输对象,需要对其进行序列化操作。 - **6.5.3 Encode和Decode**:编码和解码过程,用于将对象转换为字节流或将字节流还原为对象。 #### 七、过程分析 ##### 7.1 Refer&export ...

    Dubbo 30道面试题及答案.docx

    序列化框架可以选择 Hessian、Duddo、FastJson、Java 自带序列化等,但 Hessian 序列化是推荐的选择。 Dubbo 的核心配置包括服务配置、引用配置、协议配置、应用配置、模块配置、注册中心配置、监控中心配置、提供...

    SpringMVC整合dubbo和zookeeper详细教程

    * 远程通讯:提供对多种基于长连接的 NIO 框架抽象封装,包括多种线程模型、序列化、请求-响应模式的信息交换方式。 * 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持、软负载均衡、失败容错、地址...

    dubbo 对外提供和使用接口方法

    - **特点**:二进制序列化,适用于网络传输效率较高的场景。 - **配置示例**: ```xml <dubbo:protocol name="hessian" port="20881"/> ``` **4. http协议** - **特点**:基于HTTP协议,易于集成和调试。 - ...

    dubbo微服务

    在消费者调用服务时,Dubbo会处理网络通信、序列化反序列化等底层细节,开发者只需要关注业务逻辑。 【服务注册与发现】Dubbo通常与Zookeeper、Eureka等服务注册中心配合使用。服务提供者启动时会将自己的元数据...

    Dubbo培训与实战

    1. **远程通讯(Remote Communication)**:Dubbo提供了对多种基于长连接的NIO框架的抽象封装,支持多种线程模型、序列化方式以及“请求-响应”模式的信息交换方式。 2. **集群容错(Cluster Fault Tolerance)**...

    Dubbo框架技术开发文档

    同时,Dubbo的开放性允许开发者自定义协议、序列化方式、负载均衡策略等,满足不同业务需求。 通过深入学习和实践Dubbo,开发者可以构建出高效、稳定的分布式系统,实现微服务架构,提升系统整体的可扩展性和可维护...

    Dubbo阅读笔记

    5. 序列化与反序列化:Dubbo支持多种序列化协议(如Hessian2、FastJSON等),确保数据在网络中的高效传输。 6. 超时与重试:Dubbo提供了超时机制和重试策略,以应对网络延迟或服务不稳定的情况。 7. 异常处理:当...

    Dubbo 27道面试题及答案.docx

    Dubbo 的远程通讯部分提供对多种基于长连接的 NIO 框架抽象封装,包括多种线程模型、序列化,以及“请求-响应”模式的信息交换方式。 Dubbo 的自动发现部分基于注册中心目录服务,使服务消费方能动态的查找服务提供...

    dubbo-dev-book

    序列化扩展负责实现不同序列化协议的支持,使得系统能够处理不同格式的数据。 #### 网络传输扩展 网络传输扩展用于实现不同的网络通信机制,例如长连接、短连接等。 #### 信息交换扩展 信息交换扩展涉及服务之间...

    14-Dubbo面试题.docx

    Dubbo面试题知识点总结 ...:Dubbo 支持多种序列化方式,包括 Java 序列化、JSON 序列化、XML 序列化等。 * Dubbo 有哪些注册中心?:Dubbo 提供了多种注册中心,包括 ZooKeeper、Redis、Multicast 等。

    dubbo教程视频源码

    - **高性能**:支持多协议、多序列化方式,可实现高效的服务调用。 - **轻量级**:依赖少,易于集成。 - **透明化**:服务调用对用户透明,无需了解底层细节。 - **服务治理**:具备服务自动注册与发现机制,支持...

    dubbo实现demo

    Dubbo会负责网络通信、请求序列化和反序列化等工作。 4. **结果返回**:服务提供者处理完请求后,将结果返回给消费者。Dubbo同样负责将结果消息传输回消费者,并反序列化为消费者可以使用的对象。 在我们的"Dubbo...

    Dubbo面试.pdf

    这种协议使用Java标准的序列化机制,基于阻塞式短连接通信,适用于参数和返回值数据量不大,且消费者和提供者数量大致相等的场景。但是需要注意的是,老版本的Common-Collections包存在安全漏洞,可能会对rmi协议...

Global site tag (gtag.js) - Google Analytics