Closed zonghaishang closed 4 years ago
项目依赖hessian2的基线:
digest = "1:f4be968368b6c78a68a439d7ef71c782b7036d185925e4dd1d2d6e773dcc59c3" name = "github.com/apache/dubbo-go-hessian2" packages = [ ".", "java_exception", ] pruneopts = "UT" revision = "0ef010e9ccf4fea50b122e43ba2c0ba62a260fcb" version = "v1.3.0"
使用 api hessian.NewDecoderWithSkip(bytes...)
解决,允许跳过不识别的class type.
背景
在service mesh场景中,使用hessian-go作为序列化框架,需要解析dubbo请求body中的attachment(里面包含group)。因为attachment在body中方法参数字节的后面,所以需要先解析dubbo请求中的参数类型和参数值,然后才能去解析到attachemt。
What happened:
目前发现解析attachment之前,先解析方法的参数类型和参数值报错了。类似参数类型解析不到go对应的类型:
can not find go type name com.raycloud.notify.api.domain.StopNotifyJob in registry
.因为请求的参数类型,是java应用发到service mesh的,因此service mesh无法提前注册
StopNotifyJob
类型,并且也无法知道它的类型。What you expected to happen:
类似java的hessian序列化行为,如果反序列化类型找不到(比如是class类型),可以降级为hashmap(对应golang里面的map或者sync.Map). 这样参数解析完之后,也能解析到attachment。
How to reproduce it (as minimally and precisely as possible):
这个是真实线上java(dubbo 2.4.9)调用mesh的二进制字节流:
在用这个库解码dubbo时,遇到类似以下错误:
Anything else we need to know?:
这里附上线上抓包的二进制:
dubbo.pcap.zip