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

下面的应该是一个经典的问题,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的时候,就会抛出异常
bug宝典Node篇 Fail to decode request due to: RpcInvocation_第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报文,报文头正常
bug宝典Node篇 Fail to decode request due to: RpcInvocation_第2张图片
进入com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec中decodeBody方法,对报文体进行解码。dubbo协议说明
调试进入到com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation中DecodeableRpcInvocation方法,这个时候broken还是false。
bug宝典Node篇 Fail to decode request due to: RpcInvocation_第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;)

bug宝典Node篇 Fail to decode request due to: RpcInvocation_第4张图片
再往下定位,进入com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation中decode方法,问题在于下面红色方框获取参数数量的地方错误了。
bug宝典Node篇 Fail to decode request due to: RpcInvocation_第5张图片
接着回到node-zookeeper-dubbo中index.js,添加下面的代码,写入参数个数
bug宝典Node篇 Fail to decode request due to: RpcInvocation_第6张图片
再次调试,出现新的问题

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源码跟踪获取异常如下,以前这个异常信息被吞掉了。
bug宝典Node篇 Fail to decode request due to: RpcInvocation_第7张图片
从上面的异常可以看出,dubbox解析报文,要跟报文拼装顺序一致,否则就会出现异常,那么只需要对node-zookeeper-node稍作调整,将attachments的参数构建放在args构建前面就可以了。
bug宝典Node篇 Fail to decode request due to: RpcInvocation_第8张图片
但当我参数不只一个的时候,又有问题了。按照下图更改后,问题彻底解决。
bug宝典Node篇 Fail to decode request due to: RpcInvocation_第9张图片

你可能感兴趣的:(bug宝典)