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 的封装.
分享到:
相关推荐
描述进一步提到,“nodejs 使用原生的 dubbo (dubbo head hessian body) 协议”,这表明在Node.js中,开发者不仅实现了Dubbo的协议头(head),还处理了Hessian二进制序列化协议作为消息体(body)。Hessian是一种...
- **序列化(Serialization)**:数据在网络中传输前需要进行序列化,Dubbo支持多种序列化方式,如Hessian2、FastJson、Kryo等,选择合适的序列化方式可以提高通信效率。 5. **服务治理**: - **负载均衡(Load ...
Dubbo协议是默认的高性能二进制协议,它实现了高效的序列化和反序列化,降低了网络传输开销。 五、服务接口与实现 服务接口定义了服务的契约,通常是一个Java接口,服务提供者实现这个接口并暴露服务,服务消费者...
1. 远程调用(RPC):Dubbo的Remoting层处理服务间的网络通信,包括协议解析、序列化、连接管理等。Protocol接口定义了服务调用的基本操作,如refer、invoke等,而Exporter和Invoker接口则封装了服务暴露和调用的...
- **6.5.2 序列化**:为了在网络中传输对象,需要对其进行序列化操作。 - **6.5.3 Encode和Decode**:编码和解码过程,用于将对象转换为字节流或将字节流还原为对象。 #### 七、过程分析 ##### 7.1 Refer&export ...
序列化框架可以选择 Hessian、Duddo、FastJson、Java 自带序列化等,但 Hessian 序列化是推荐的选择。 Dubbo 的核心配置包括服务配置、引用配置、协议配置、应用配置、模块配置、注册中心配置、监控中心配置、提供...
* 远程通讯:提供对多种基于长连接的 NIO 框架抽象封装,包括多种线程模型、序列化、请求-响应模式的信息交换方式。 * 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持、软负载均衡、失败容错、地址...
- **特点**:二进制序列化,适用于网络传输效率较高的场景。 - **配置示例**: ```xml <dubbo:protocol name="hessian" port="20881"/> ``` **4. http协议** - **特点**:基于HTTP协议,易于集成和调试。 - ...
在消费者调用服务时,Dubbo会处理网络通信、序列化反序列化等底层细节,开发者只需要关注业务逻辑。 【服务注册与发现】Dubbo通常与Zookeeper、Eureka等服务注册中心配合使用。服务提供者启动时会将自己的元数据...
1. **远程通讯(Remote Communication)**:Dubbo提供了对多种基于长连接的NIO框架的抽象封装,支持多种线程模型、序列化方式以及“请求-响应”模式的信息交换方式。 2. **集群容错(Cluster Fault Tolerance)**...
同时,Dubbo的开放性允许开发者自定义协议、序列化方式、负载均衡策略等,满足不同业务需求。 通过深入学习和实践Dubbo,开发者可以构建出高效、稳定的分布式系统,实现微服务架构,提升系统整体的可扩展性和可维护...
5. 序列化与反序列化:Dubbo支持多种序列化协议(如Hessian2、FastJSON等),确保数据在网络中的高效传输。 6. 超时与重试:Dubbo提供了超时机制和重试策略,以应对网络延迟或服务不稳定的情况。 7. 异常处理:当...
Dubbo 的远程通讯部分提供对多种基于长连接的 NIO 框架抽象封装,包括多种线程模型、序列化,以及“请求-响应”模式的信息交换方式。 Dubbo 的自动发现部分基于注册中心目录服务,使服务消费方能动态的查找服务提供...
序列化扩展负责实现不同序列化协议的支持,使得系统能够处理不同格式的数据。 #### 网络传输扩展 网络传输扩展用于实现不同的网络通信机制,例如长连接、短连接等。 #### 信息交换扩展 信息交换扩展涉及服务之间...
Dubbo面试题知识点总结 ...:Dubbo 支持多种序列化方式,包括 Java 序列化、JSON 序列化、XML 序列化等。 * Dubbo 有哪些注册中心?:Dubbo 提供了多种注册中心,包括 ZooKeeper、Redis、Multicast 等。
- **高性能**:支持多协议、多序列化方式,可实现高效的服务调用。 - **轻量级**:依赖少,易于集成。 - **透明化**:服务调用对用户透明,无需了解底层细节。 - **服务治理**:具备服务自动注册与发现机制,支持...
Dubbo会负责网络通信、请求序列化和反序列化等工作。 4. **结果返回**:服务提供者处理完请求后,将结果返回给消费者。Dubbo同样负责将结果消息传输回消费者,并反序列化为消费者可以使用的对象。 在我们的"Dubbo...
这种协议使用Java标准的序列化机制,基于阻塞式短连接通信,适用于参数和返回值数据量不大,且消费者和提供者数量大致相等的场景。但是需要注意的是,老版本的Common-Collections包存在安全漏洞,可能会对rmi协议...