apache/dubbo-go-hessian2

about Generic$invoke

pantianying opened this issue · 5 comments

抱歉英文不好,就用中文了。以上是对泛化调用的需求记录;

目标:实现goclient to javaserver 的泛化调用

以下是实现的探讨,我入门java不到一个月,肯定会有不对的地方,欢迎指出,也希望有java老鸟帮忙看看,十分感谢。

所谓泛化调用是指客户端拿不到服务端的具体类的情况(在go的客户端表现为没有写死的providerserver接口和pojo定义),java的dubbo框架已经有了这个功能,这个功能对于dubbo接口网关类服务的实现是必不可少的。

看了源码我自我以为的java的实现:
java provider端有这样一个interface
image
所有的客户端都调用该接口的$invoke进行访问,将原来的方法、参数、类型都作为请求参数
(我自己测试过,确实能够调通,但由于hessian2的这个问题,没有进入下一步的测试)
如图
image

客户端在没有注册pojo是如何解析返回的数据的。看了源码,invoke方法会将pojo转换成map返回,map中的所有元素都是基本类型,java客户端直接解析map即可,所以目前来看,如果hessain2能够支持不定深度map、数组的解析,应该就可以支持泛化调用。

客户端的生成源码在com.alibaba.dubbo.config.ReferenceConfig

调用ReferenceConfig.get()获取服务端泛化接口,源码有点多就不贴了

贴一下使用的java代码吧

    public static Object invokeDubbo(UrlPathInfo pathInfo, Object[] parameterObjects) {
        ReferenceConfig<GenericService> referenceConfig = null;
        try {
            referenceConfig = referenceConfigLoadingCache.get(pathInfo);
        } catch (ExecutionException e) {
            logger.error("get referenceConfig from jvm cache has error", e);
        }
        if (referenceConfig == null) {
            referenceConfig = buildReferenceConfig(pathInfo);
            if (referenceConfig != null) {
                referenceConfigLoadingCache.refresh(pathInfo);
            }
        }

        GenericService genericService = referenceConfig.get();
        String[] paramTypes = pathInfo.getParameterTypes();
        Object returnValue = genericService.$invoke(pathInfo.getMethodName(), paramTypes, parameterObjects);
        //void 返回为null
        return returnValue;
    }

@pantianying 沟通,目前golang hessian2不支持反序列化未定义的pojo数据为map,而java是可以的,需要调研的是java的实现机制是如何? 是不是针对泛化的请求,java server端会用map的方式来序列化返回数据? 如果对java有研究的,请分享一下!

@wongoo
是的 go客户端要实现pojo到map,这部分应该是要放在hessain2里

这个观点是错误的

@wongoo @fangyincheng

大家好,根据阅读源码和@fangyincheng一起测试,pojo到map的步骤确认是在java的provder实现了,目前goclient端利用如下的interface定义,可以调通java provider端的泛化调用。
image

image

因为java服务端只把pojo转成了map,客户端目前还需要区别pojo数组还是单个pojo。这个希望能通过一个interface{} 接受所有的返回。

这个实现需要两位评估。