bug宝典Node篇 Fail to decode request due to: RpcInvocation

来源:互联网 发布:淘宝开学爆到 编辑:程序博客网 时间:2024/06/05 09:23

下面的应该是一个经典的问题,csdn上可以找到java版本的解决方案,可以如果使用nodejs来调用出现这个问题,该如何解决呢?
java出现这个问题解决方案1

Fail to decode request due to: RpcInvocation [methodName=getLoginQrcode, parameterTypes=null, arguments=null, attachments={path=com.test.wcn.api.service.WcnService, input=220, dubbo=2.8.4, version=1.0.1}

跟踪源码进行调试,com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler中跟踪到断点,发现req.isBroken()为true的时候,就会抛出异常
1
那么接下来要排查的就是造成req.isBroken()为true的原因。继续查看报文

Request [id=0, version=2.0.0, twoway=true, event=false, broken=true, data=RpcInvocation [methodName=getLoginQrcode, parameterTypes=null, arguments=null,  attachments={path=com.test.wcn.api.service.WcnService,  input=220, dubbo=2.8.4, version=1.0.1}]]

于是我写一个java的dubbo测试用例,调用后,发现报文如下

 Request [id=0, version=2.0.0, twoway=true, event=false,  broken=false, data=RpcInvocation [methodName=getLoginQrcode,  parameterTypes=[class java.lang.String], arguments=[1300000067], attachments={path=com.test.wcn.api.service.WcnService, input=230, dubbo=2.8.4, interface=com.test.wcn.api.service.WcnService, version=1.0.0, timeout=10000}]]

这么看来问题基本可以定位到,我使用的node-zookeeper-dubbo与当当的dubbox存在兼容问题,解决的办法应该是调整node-zookeeper-dubbo的源码
继续跟踪dubbox的源码
com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec中decode方法,审查后,这是一条正确的dubbo报文,报文头正常
2
进入com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec中decodeBody方法,对报文体进行解码。dubbo协议说明
调试进入到com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation中DecodeableRpcInvocation方法,这个时候broken还是false。
3
继续往下走,调试到com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation中decode方法,终于找到异常信息,而且在这个地方,将broken设置为true了。

com.alibaba.com.caucho.hessian.io.HessianProtocolException: expected integer at 0x12 java.lang.String (Ljava/lang/String;)

5
再往下定位,进入com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation中decode方法,问题在于下面红色方框获取参数数量的地方错误了。
8
接着回到node-zookeeper-dubbo中index.js,添加下面的代码,写入参数个数
9
再次调试,出现新的问题

Fail to decode request due to: RpcInvocation [methodName=getLoginQrcode, parameterTypes=[class java.lang.String], arguments=null, attachments={path=com.test.wcn.api.service.WcnService, input=221, dubbo=2.8.4, version=1.0.0}

修改dubbox源码跟踪获取异常如下,以前这个异常信息被吞掉了。
12
从上面的异常可以看出,dubbox解析报文,要跟报文拼装顺序一致,否则就会出现异常,那么只需要对node-zookeeper-node稍作调整,将attachments的参数构建放在args构建前面就可以了。
13
但当我参数不只一个的时候,又有问题了。按照下图更改后,问题彻底解决。
14

0 0
原创粉丝点击