序列化兼容技巧 之 指定序列化方式:
CompatibleFieldSerializer
因为性能出色,Kryo 经常被选为Dubbo服务的序列化方案。
在序列化Java对象时,Kryo 默认使用 FieldSerializer 类进行序列化。
但为了增强兼容性,我们一般会显式指定使用 CompatibleFieldSerializer。
使用方式就是在 API jar 包中的类上,以添加注解的方式指定。
(只需对那些会在客户端和服务端之间进行传输的类进行改造)
如:
package demo.api.entity; import com.esotericsoftware.kryo.DefaultSerializer; import com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer; @DefaultSerializer(CompatibleFieldSerializer.class) public class Arg implements Serializable { ... }
CompatibleFieldSerializer 是啥?
这是Kryo中一种序列化对象的方式。
它以直接赋值字段的方式进行序列化,达到 向前与向后 兼容。
也就是说,无论新版中增加还是删除字段,仍然能反序列化老版本所得数据。
因为直接赋值字段的方式可以跳过无法识别的字段。
当然,如果是字段类型发生变更,那就无法兼容了。
【代价】这种兼容性也是有代价的。
当一个类首次被序列化时,会分析并记下各字段名称。
在序列化和反序列化时,需要创建缓冲区进行分块编码。
这样才能跳过那些无法识别的字段。
应用场景举例
假设有一个Dubbo API jar包,其中有个参数类Arg,作为客户端向服务端传递信息的媒介。
1.0 版本中,Arg类有3个字段。2.0 版本中为了增强服务能力,需要在Arg类中新增1个字段 extField。
业务规定客户端可以不指定extField,由服务端使用默认值。即,业务允许新版本兼容老版本。
但是如果直接在Arg中增加该字段,服务端用 2.0 版本的jar包,客户端还是用 1.0 版本的jar包,
那么将导致Dubbo序列化失败。
怎么办?
方案一:从一开始就为Arg指定序列化方式 CompatibleFieldSerializer。
当然,如果 1.0 已经发布,且未将Arg的序列化方式指定为 CompatibleFieldSerializer,那么即使你在 2.0 中指定 Arg 的序列化方式,仍然会遇到序列化问题 —— 来自客户端的Arg中所有字段都未赋值。因为这两个版本的序列化方式不同。
1.0 使用的是默认的 FieldSerializer,2.0 用了 CompatibleFieldSerializer。
方案二:另起一个命名空间,存放新版Arg。相应的服务方法可以重载。
这样,原Arg类完全不变,序列化当然没问题。
事实上,很多组织喜欢用方案二。因为这种方式更利于清晰的管理,对代码侵入性也小。
思考
序列化兼容性一直是 Dubbo 服务治理的重要内容。
一般只有经历过各种项目迭代场景,才能有效规避Dubbo服务API研发中的坑。
这是Dubbo对使用者不够友好的重要特征之一。
其实 Martin Fowler 当初提到“微服务”时,表示微服务之间是以 HTTP API 之类的轻量级协议通信的。
Dubbo这样的“重量级”服务框架所呈现的“强约束”有利有弊。而序列化兼容性显然是绝大多数研发组织在治理Dubbo时所面临的一个重要课题。有无数人在此踩过各种坑。甚至因此抛弃Dubbo,使用其它替代方案。
当然也有组织依靠合格的项目管理水平、通透的业务研究能力等各种过硬的综合实力,规避了很多可能引发Dubbo序列化问题的低级错误的项目变更操作。
目前而言,大多数时候,Dubbo还是可以的。
当你因遇到并处理过很多Dubbo序列化问题,而自以为是“资深高级人才”时,很可能仅仅是因为自己所处的平台存在很薄弱的环节,导致自己不得不处理各种恶心的“人祸”。一个合格的研发人员应从各种角度综合考量整个项目。很多时候表面上是“技术问题”,但需要解决的却是“需求管理”、“业务架构”等其它方向的问题。
相关推荐
在实现远程服务调用时,通信协议和序列化协议是至关重要的部分,它们直接影响到服务的性能和兼容性。 首先,让我们了解Dubbo支持的通信协议: 1. **Dubbo Protocol**:Dubbo默认的通信协议,基于TCP长连接的高性能...
3. **序列化插件**:Dubbo内置了多种序列化方式,如Java原生序列化、Hessian、Fastjson等,同时也支持自定义序列化器,以满足不同性能和兼容性的需求。 4. **监控中心**:Dubbo可以与Spring Cloud Sleuth、Zipkin等...
- **协议与序列化**:Dubbo支持多种通信协议(如RPC、HTTP等)和序列化方式(如Hessian、Java原生序列化、protobuf等),这些都会影响服务的性能和兼容性。 - **服务治理**:Dubbo提供了诸如熔断、降级、限流、...
但是,如果项目中存在对JDK1.7的依赖或者考虑到向下兼容性,仍然可以选择使用JDK1.7运行Dubbo服务。 在具体配置方面,Dubbo的XML配置文件或Java代码配置需要根据JDK版本进行适当的调整。例如,如果使用JDK1.8,可以...
- **协议与序列化**: Dubbo支持多种通信协议(如Dubbo协议、RMI、Hessian等)和序列化方式(如JSON、FastJSON、Hessian2等),可以根据性能和兼容性需求进行选择。 - **监控与日志**: 提供了Dubbo Monitor用于统计...
【高并发远程调用】:Dubbo通过优化序列化、通信协议等方式,实现了高效的远程调用,应对高并发场景。 【常见问题解答(FAQ)】:Dubbo FAQ文档通常包含了用户在使用过程中可能遇到的问题及其解决方案,包括配置...
此外,DUBBO还支持多种序列化协议,如Hessian、Burlap和Java自带的序列化,以适应不同的性能和兼容性需求。 在服务调用过程中,DUBBO提供了多种负载均衡策略,如轮询、随机、最少活跃调用数等,以优化服务的访问...
选择合适的协议可以优化通信效率和兼容性。 6. **负载均衡(Load Balancing)**:在多服务实例的情况下,RPC框架通常会集成负载均衡策略,确保请求能均匀地分发到各个服务实例,提高系统的可用性和响应速度。 7. *...
序列化是通信过程中的重要环节,Dubbo内置了多种序列化方式,如Hessian、Java原生序列化、FastJson等,以适应不同的性能和兼容性需求。 6. **负载均衡(Load Balancing)** Dubbo提供了多种负载均衡策略,如随机、...
序列化是RPC调用中的重要环节,Dubbo提供了多种序列化方式,如Java自带的序列化、Fastjson、protobuf等,以满足不同性能和兼容性需求。 6. **负载均衡**:Dubbo内置了多种负载均衡策略,如随机、轮询、最少活跃调用...
同时,它也支持Hessian2、FastJSON、protobuf等多种序列化方式,以适应不同的性能和兼容性需求。 4. **API与配置**:Dubbo通过简单的API可以让开发者轻松地定义服务接口和服务实现,同时,其XML配置文件可以灵活...
选择合适的序列化方式可以影响到系统的性能和兼容性。 8. **容错机制** Dubbo提供了多种容错策略,如Failsafe(失败安全)、Failover(失败重试)、Failfast(快速失败)、Failsafe(失败忽略)、 Forking(并行...
数据序列化是RPC通信中的重要环节,影响着网络传输效率和跨语言兼容性。 4. **负载均衡**:Dubbo内置了多种负载均衡策略,包括随机、轮询、最少活跃调用数、一致性哈希等。这些策略有助于在多个服务提供者之间均匀...
- **Hessian/Protobuf序列化**:支持多种序列化方式,提高数据传输效率。 - **Zookeeper作为注册中心**:Zookeeper是Dubbo常用的服务注册和发现工具,提供分布式环境下的协调能力。 5. **开发与部署**: - **...
选择合适的协议和序列化方式能影响服务的性能和兼容性。 4. **服务调用方式**:Dubbo提供了两种调用方式:同步调用和异步调用。同步调用是常规的请求-响应模式,而异步调用则允许服务消费者在发起请求后立即返回,...
同时,它也支持多种序列化方式,如Hessian、Java自带的序列化、Fastjson等,以适应不同的性能和兼容性需求。 **7. 监控中心(Monitor)** Dubbo内置了监控中心,可以收集服务调用的统计信息,如调用次数、成功率、...
【标题】"Zookeeper+Dubbo Demo"是一个实践项目,旨在展示如何在Java开发环境中,利用Zookeeper作为服务治理工具,配合Dubbo实现微服务架构,并确保这些组件与JDK 1.8版本的兼容性。 【描述】"zookeeper Dubbo ...
3. **兼容性**:尽管是轻量级,但 hessian-lite 仍然保持了与标准 Hessian 协议的兼容性,使得与其他 Hessian 兼容的服务可以进行交互。 解决依赖问题的步骤是: 1. **下载源码**:从可用的源代码仓库(如 GitHub)...
:Dubbo 提供了多种方式来兼容旧版本,包括版本号机制、兼容性测试等。 * Dubbo telnet 命令能做什么?:Dubbo telnet 命令可以用于远程控制 Dubbo 服务。 * 服务调用超时会怎么样?:服务调用超时可能会导致服务...
Dubbo是一个高性能、轻量级的Java RPC框架,旨在提高服务间的通信效率,而在微服务架构中,多语言支持和协议的兼容性变得尤为重要。 首先,让我们深入理解RPC(Remote Procedure Call)协议的基本要求。RPC协议通常...