Node 使用 dubbo 協議與 java 進行互相調用

前言

隨着 BFF 的普及,愈來愈多的應用使用 Nodejs 做爲中間層來提供 SSR、WEB API聚合等能力,而相似 Java 等後端更加偏向於服務下沉,而 node 和 java 之間的調用若是走 http 的話,性能沒有 rpc 來的高效,在這裏介紹一下 node 和 java 以前使用 dubbo 協議的實例(後續還會有 ws / grpc 等)java

安裝

在這裏使用 daze.js 框架提供的 dubbo-provider 擴展來提供 dubbo 通訊能力node

生成項目:

$ npx @dazejs/cli create dubbo_project
複製代碼

安裝擴展:

$ cd dubbo_project
$ npm install --save-dev @dazejs/dubbo-provider
複製代碼

註冊擴展

將擴展加入到 daze.js 配置文件中,配置文件位於 src/config/app.tsgit

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

export default {
  // ...
  providers: [
      // ...
      DubboServiceProvider  
  ]
};
複製代碼

添加 dubbo 配置文件

直接在 src/config/ 目錄下建立 dubbo.ts, 能夠在其中定義須要用到的註冊中心地址:github

export default {
    default: { // 字段名即爲註冊中心命名
      type: 'zookeeper', // 註冊中心類型,目前只支持 zookeeper
      host: '127.0.0.1:2181', // zookeeper host地址,hostname+port
      port: 20880 // 對外提供的 dubbo 服務端口
    }
  };
複製代碼

建立消費者

src/app/ 目錄下建立 exmple-consumer.ts (框架會自動讀取該目錄下的文件進行加載)npm

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 數據api

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') 進行手動轉換數組

建立提供者

咱們也能夠建立提供者來供其餘方來調用bash

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 的定義app

NodeDemoProvider demoService = (NodeDemoProvider) context.getBean("demoProvider"); // 獲取遠程服務代理
String hello = demoService.sayHello("world"); // 執行遠程方法 hello = 'Hello world'
複製代碼

傳送門

相關文章
相關標籤/搜索