SOFA-RPC使用自定义类型数组参数报错 argument type mismatch

本文介绍了在使用SOFA-RPC时遇到的自定义类型数组参数报argument type mismatch的问题,从客户端发送数据、服务端接收数据及处理数据三方面进行定位,发现是反序列化过程中Interface的反序列化器错误导致。临时解决方案是修改RPC方法参数类型或接口定义。此外,文章还赞赏了SOFA-RPC的开源性和易用性。
摘要由CSDN通过智能技术生成

1 问题表现

客户端通过RPC Proxy调用远程服务,报错:argument type mismatch
服务接口定义如下:

interface CacheNotifier {
   
    void invalid2(HugeType type, Id[] ids);
}

2 问题定位分析

定位过程:

  1. 定位客户端在发送数据之前是否有问题;
  2. 若客户端无问题,定位服务端接收到的数据是否有问题;
  3. 若服务端接收的数据无问题,定位服务端处理数据是否有问题;
1 定位客户端在发送数据之前是否有问题

经过断点调试,在传输层(BoltClientTransport.syncSend())发送请求时,请求内容如下:
HugeGraph client
从截图中可看出来,request对象中的methodArgs是正常的,参数类型与接口方法中定义的完全匹配。

2 定位服务端接收到的数据是否有问题

在服务端执行请求方法之前(ProviderInvoker.invoke()),请求内容如下:
HugeGraph server invoke
从截图中可看出来,request对象中的methodArgs是不正常的,methodArgs[1]参数类型是Object[],与接口方法中定义的Id[]不匹配。

在服务端收到请求进行反序列化时(SofaRequestHessianSerializer.decodeObjectByTemplate()),请求方法的信息如下:
HugeGraph server decode
classSig[1]的值是class [Lcom.baidu.hugegraph.backend.id.Id;可以看出来,接受到的请求数据中的参数签名与接口方法参数签名即Id[]类型完全匹配。

问题梳理:既然服务端接收到的数据正确(即Id[]),但是服务端调用业务方法的时候参数类型不匹配(即Object[]),那么就是服务端处理请求的问题,猜测应该是反序列化的问题。

辅助复现内容:方法decodeObjectByTemplate()详细堆栈如下:

Thread [SOFA-SEV-BOLT-BIZ-8090-12-T1] (Suspended)	
	SofaRequestHessianSerializer.decodeObjectByTemplate(AbstractByteBuf<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值