apache / dubbo

The java implementation of Apache Dubbo. An RPC and microservice framework.
https://dubbo.apache.org/
Apache License 2.0
40.48k stars 26.43k forks source link

dubbo serialization问题 #4640

Closed linchuyao closed 5 years ago

linchuyao commented 5 years ago

dubbo 消费者serialization配置为hessian 生产者serialization配置为kryo 那么调用过程是怎么样的呢? 是消费者序列化用hessian 生产者反序列化用kryo 还是 生产和消费都用hessian 还是生产和消费都用kryo

web1992 commented 5 years ago

provider 在启动注册服务的时候,会把序列信息存储在注册中心里面, 像下面的这样

provider://192.168.0.7:20880/cn.web1992.dubbo.demo.DemoService?methods=sayHello,demo&pid=971&serialization=hessian2

consumer 在启动的时候回去注册中心,获取到这些信息,并与 provider 建立 TCP 链接,后续再序列化传输的时候,会使用 provider 提供的 序列化配置进行序列化。

因此cosumer 使用的是 provider 的序列化配置(注意在获取注册中心的配置,建立TCP 链接的时候,还不需要使用序列化协议进行传输信息的)

linchuyao commented 5 years ago

provider使用kryo协议 当接口升级(入参对象添加字段) consumer 没有升级在调用时会报序列化错误这个除了改为hessian2还有别的解决方案吗

web1992 commented 5 years ago

kryo 协议如果要兼容字段的新增,删除,需要使用 CompatibleFieldSerializer,需要对kryo 的序列化进行控制,比较麻烦,而使用 hessian2 来的快些。看你自己的需求吧。

linchuyao commented 5 years ago

provider修改序列化为hessian2重新启动provider comsume不重启发现还是使用的kryo协议 重启后变为hessian2 这在生产上很难实行 除了重启comsume还有别的方案吗

beiwei30 commented 5 years ago

provider修改序列化为hessian2重新启动provider comsume不重启发现还是使用的kryo协议 重启后变为hessian2 这在生产上很难实行 除了重启comsume还有别的方案吗

看起来没其他方案了,除非你的 consumer 也开始适应 kryo。 @web1992 解释的很全面

linchuyao commented 5 years ago

provider修改序列化协议重启消费端需要重启吗