Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

about Generic$invoke #84

Closed
pantianying opened this issue Jun 24, 2019 · 5 comments
Closed

about Generic$invoke #84

pantianying opened this issue Jun 24, 2019 · 5 comments
Assignees
Labels
Milestone

Comments

@pantianying
Copy link
Member

pantianying commented Jun 24, 2019

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

目标:实现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、数组的解析,应该就可以支持泛化调用。

@pantianying
Copy link
Member Author

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

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

@pantianying
Copy link
Member Author

pantianying commented Jun 24, 2019

贴一下使用的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;
    }

@wongoo
Copy link
Contributor

wongoo commented Jun 24, 2019

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

@pantianying
Copy link
Member Author

pantianying commented Jun 24, 2019

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

这个观点是错误的

@pantianying
Copy link
Member Author

pantianying commented Jul 1, 2019

@wongoo @fangyincheng

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

image

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

这个实现需要两位评估。

@wongoo wongoo added this to the v1.2.0 milestone Jul 2, 2019
@wongoo wongoo added the urgent label Jul 2, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants