weixin_39541189
weixin_39541189
2020-12-28 12:16

文档看过没有理解应该如何使用,求教

如题,文档看过没有明白应该如何使用,可能我被自己的思路所限制了,可以请教下如何使用吗?

我是一名 Node.js 开发,现有的解决方案是自己实现了一个 node-dubbo-client 的包,通过 Java 提供的服务名(com.alibaba.dubbo.demo.DemoProvider)从 zk 获取 Dubbo 服务的地址与端口,然后通过 Java 提供的函数名(getUserInfo)调用到真实的服务,数据传递使用的是 JSON,然后 Java 那边将 JSON 再反序列化成 Java 的数据类型,然后再通过将结果转成 JSON 返回给我。

基于上述的流程,感觉被自己的思路限制了,看着 dubbo2.js 的文档和示例,依旧没有看懂我应该怎么做,服务名和方法名应该写在哪里,参数应该如何传递。

该提问来源于开源项目:apache/dubbo-js

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

8条回答

  • weixin_40005373 weixin_40005373 3月前

    目前dubbo2.js仅仅支持原生的dubbo协议(dubbo header + hessian body)

    image

    红线部分就是对应的你迷惑的服务名和方法名字地方

    image

    这么地方就是定义的接口名称,方法名称。

    参考demo和单元测试

    抱歉文档还是需要改进 可以一起来维护

    点赞 评论 复制链接分享
  • weixin_39541189 weixin_39541189 3月前

    看到引入服务是通过引入本地文件的方式,如果我要请求的服务已经注册到 zk 上了,比如注册到了 /dubbo/providers/com.alibaba.dubbo.demo.DemoProvider 这个路径了,原本的方案是请求 zk 这个路径获取真实的 Dubbo 服务地址,如果是用 dubbo2.js 这样的我要怎么写呢?

    点赞 评论 复制链接分享
  • weixin_40005373 weixin_40005373 3月前
    javascript
    import {Dubbo} from 'dubbo2.js';
    
    //封装js版本DemoProvider
    //通常这个部分是通过我们写的一个工具自动根据jar生成
    const demoProvider = dubbo =>
      dubbo.proxyService({
        //调用的接口名称
        dubboInterface: 'com.alibaba.dubbo.demo.DemoProvider',
       //接口中暴露给外面的方法
        methods: {
     //方法名称
          sayHello(name /*参数*/) {
           //hessian化参数,返回一个数组对name进行包装
            return [java.String(name)];
          },
    
          echo() {},
    
          test() {},
    
          getUserInfo() {
            return [
              java.combine('com.alibaba.dubbo.demo.UserRequest', {
                id: 1,
                name: 'nodejs',
                email: 'node.com',
              }),
            ];
          },
        },
      });
    
    //将该service合入dubbo对象构造函数的service对象中
    //这样如果用typescript可以获取完美的代码提示
    const service = {
      demoProvider,
    };
    
    const dubbo = new Dubbo<typeof service>({
      //  ....other parameters
      service,
    });
    
    //invoke
    (async () => {
     const {res, err} =  await dubbo.service.demoProvider.sayHello('node world!');
     console.log(err, res);
    })();
    </typeof>
    点赞 评论 复制链接分享
  • weixin_39541189 weixin_39541189 3月前

    不知道是不是我理解的问题哦,看这个流程,不是直接调用 Java 提供的服务,而是对应 Java 提供的服务要封装一个自己的服务,比如 com.alibaba.dubbo.demo.DemoProvider,自己的服务里提供函数 getUserInfo,然后这个函数中再去请求 Java 提供的服务,比如 com.alibaba.dubbo.demo.UserRequest

    点赞 评论 复制链接分享
  • weixin_40005373 weixin_40005373 3月前

    ,可以这样理解的^_^, 核心的问题是nodejs这边需要处理dubbo调用的协议以及序列化和反序列化,我们自己写的js版本的DemoProvider实际上就是在做一个序列化的过程。

    点赞 评论 复制链接分享
  • weixin_39541189 weixin_39541189 3月前

    了解了,怪不得我一直都没有看明白,按照我现有的方式,序列化和反序列化是处于 Node.js 和 Java 的中间一层,Node.js 这边只要从 zk 获取到 Dubbo 服务的 IP 和 port 就可以直接向上面发送 JSON 格式的数据了,Java 前面有一层序列化和反序列化。谢谢回复了,我先尝试下 dubbo2.js。

    点赞 评论 复制链接分享
  • weixin_40005373 weixin_40005373 3月前

    有问题一起讨论 ^_^ 是的 后面我会添加一个json-rpc之类的协议 就可以像您说的直接发送json格式的数据,目前dubbo2.js发送的是hessian格式的数据。

    点赞 评论 复制链接分享
  • weixin_39541189 weixin_39541189 3月前

    👌

    点赞 评论 复制链接分享