Node 使用 dubbo 协议与 java 进行互相调用

随着 BFF 的普及,越来越多的应用使用 Nodejs 作为中间层来提供 SSR、WEB API聚合等能力,而类似 Java 等后端更加偏向于服务下沉,而 nodejava 之间的调用如果走 http 的话,性能没有 rpc 来的高效,在这里介绍一下 node 和 java 之前使用 dubbo 协议实例(后续还会有 ws / grpc 等)

安装

在这里使用 daze.js
框架提供的 dubbo-provider
扩展来提供 dubbo
通信能力

生成项目:

$ npx @dazejs/cli create dubbo_project
复制代码

安装扩展:

$ cd dubbo_project
$ npm install --save-dev @dazejs/dubbo-provider
复制代码

注册扩展

将扩展加入到 daze.js
配置文件中,配置文件位于 src/config/app.ts

import { DubboServiceProvider } from '@dazejs/dubbo-provider'

export default {
  // ...
  providers: [
      // ...
      DubboServiceProvider  
  ]
};
复制代码

添加 dubbo 配置文件

直接在 src/config/
目录下创建 dubbo.ts
, 可以在其中定义需要用到的注册中心地址:

export default {
    default: { // 字段名即为注册中心命名
      type: 'zookeeper', // 注册中心类型,目前只支持 zookeeper
      host: '127.0.0.1:2181', // zookeeper host地址,hostname+port
      port: 20880 // 对外提供的 dubbo 服务端口
    }
  };
复制代码

创建消费者

src/app/
目录下创建 exmple-consumer.ts
(框架会自动读取该目录下的文件进行加载)

import { DubboConsumer, dubbo } from '@dazejs/dubbo-provider';
  
  @dubbo.registry('default') // 上面 dubbo.ts 提供的注册中心地址
  @dubbo.interface('com.alibaba.dubbo.demo.DemoProvider', '1.0.0') // 提供者接口地址, 1.0.0 为接口版本号
  export class ExampleConsumer extends DubboConsumer {
      // ...
  }
复制代码

ExampleConsumer
必须继承自 DubboConsumer
才能被框架识别为一个 dubbo 消费者

使用消费者调用 java 方法

src/app
下创建一个控制器,我们在控制器方法里面消费 java 数据

import { Controller, http, inject } from '@dazejs/framework';
   import DemoConsumer from '../dubbo/consumers/demo';
   
   export class ExampleController extends Controller {
   
     @inject(DemoConsumer) demoConsumer: DemoConsumer; // 注入消费者实例
   
     @http.get()
     async index() {
       // 消费方法,参数使用数组的形式传入
       // 调用 java com.alibaba.dubbo.demo.DemoProvider 类的 sayHello 方法
       const res = await this.demoConsumer.invoke('sayHello', ['world']);
       return res;
     }
   }
复制代码

框架会转换简单的参数的类型为 java 类型,推荐使用 java.String('world')
进行手动转换

创建提供者

我们也可以创建提供者来供其他方来调用

import { DubboProvider, dubbo } from '@dazejs/dubbo-provider';
   
   @dubbo.registry('default')
   @dubbo.interface('com.alibaba.dubbo.demo.NodeDemoProvider', '1.0.0')
   export default class extends DubboProvider {
     @dubbo.method()
     sayHello(name: string) {
       return `Hello ${name}`;
     }
   }
复制代码

java 调用, 这里省略了 api 与 xml 的定义

NodeDemoProvider demoService = (NodeDemoProvider) context.getBean("demoProvider"); // 获取远程服务代理
String hello = demoService.sayHello("world"); // 执行远程方法 hello = 'Hello world'
复制代码

传送门

  • daze.js
  • dubbo-provider

原文 

https://juejin.im/post/5e71cd88f265da57266121a8

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Node 使用 dubbo 协议与 java 进行互相调用

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址