下面的应该是一个经典的问题,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的时候,就会抛出异常
那么接下来要排查的就是造成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报文,报文头正常
进入com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec
中decodeBody方法,对报文体进行解码。dubbo协议说明
调试进入到com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation
中DecodeableRpcInvocation方法,这个时候broken还是false。
继续往下走,调试到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;)
再往下定位,进入com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation
中decode方法,问题在于下面红色方框获取参数数量的地方错误了。
接着回到node-zookeeper-dubbo
中index.js,添加下面的代码,写入参数个数
再次调试,出现新的问题
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源码跟踪获取异常如下,以前这个异常信息被吞掉了。
从上面的异常可以看出,dubbox解析报文,要跟报文拼装顺序一致,否则就会出现异常,那么只需要对node-zookeeper-node稍作调整,将attachments的参数构建放在args构建前面就可以了。
但当我参数不只一个的时候,又有问题了。按照下图更改后,问题彻底解决。