开发者社区 > 云原生 > 正文

dubbo2.7.2调用dubbox2.8.4接口异常

公司打算升级到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

展开
收起
大圣东游 2023-05-11 20:15:17 194 0
1 条回答
写回答
取消 提交回答
  • 这个问题是 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

    2023-05-12 12:13:56
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
Dubbo开源现状与2.7规划 立即下载
Dubbo分布式服务治理实战 立即下载
《Dubbo 3.0 前瞻》 立即下载