公司打算升级到Apache dubbo,但是公司原有服务都是dubbox2.8.4, 新的系统使用2.7.2的Apache dubbo调用老系统dubbox2.8.4系统的接口,报错,提示: Decode rpc invocation failed: expected integer at 0x12 java.lang.String (Ljava/lang/String;)
查看原码dubbo2.8.4的DecodeableRpcInvocation里的decode()方法和最新的Apache dubbo2.7.2的实现不一样,造成调用没法互通,这个有办法解决么?
原提问者GitHub用户jimiyi
这个问题是 dubbox 中修改了 com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec 类中 encodeRequestData方法的编码实现和DecodeableRpcInvocation的解码操作,但是没有考虑到协议的兼容性问题。
代码片段如下:
dubbo encodeRequestData
RpcInvocation inv = (RpcInvocation) data;
out.writeUTF(version);
out.writeUTF(inv.getAttachment(Constants.PATH_KEY));
out.writeUTF(inv.getAttachment(Constants.VERSION_KEY));
out.writeUTF(inv.getMethodName());
out.writeUTF(ReflectUtils.getDesc(inv.getParameterTypes()));
Object[] args = inv.getArguments();
if (args != null)
for (int i = 0; i < args.length; i++) {
out.writeObject(encodeInvocationArgument(channel, inv, i));
}
out.writeObject(inv.getAttachments());
dubbox encodeRequestData
RpcInvocation inv = (RpcInvocation) data;
out.writeUTF(inv.getAttachment(Constants.DUBBO_VERSION_KEY, DUBBO_VERSION));
out.writeUTF(inv.getAttachment(Constants.PATH_KEY));
out.writeUTF(inv.getAttachment(Constants.VERSION_KEY));
out.writeUTF(inv.getMethodName());
// NOTICE modified by lishen
// TODO
if (getSerialization(channel) instanceof OptimizedSerialization && !containComplexArguments(inv)) {
out.writeInt(inv.getParameterTypes().length);
} else {
out.writeInt(-1);
out.writeUTF(ReflectUtils.getDesc(inv.getParameterTypes()));
}
Object[] args = inv.getArguments();
if (args != null)
for (int i = 0; i < args.length; i++){
out.writeObject(encodeInvocationArgument(channel, inv, i));
}
out.writeObject(inv.getAttachments());
建议去修改 Dubbox 的 DubboCodec 和 DecodeableRpcInvocation 的实现,并且与新版中的dubbo 2.7.x 的编码和解码操作保持一致。
可以写自己的 DecodeableRpcInvocation 和 DubboCodec 类放在 使用 Dubbox 项目中,修改相关的实现,与2.7.x 保持一致。 (利用类加载机制加载自己修改后的 DecodeableRpcInvocation 和 DubboCodec )
原回答者GitHub用户web1992
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。