隨着 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.ts
git
import { DubboServiceProvider } from '@dazejs/dubbo-provider'
export default {
// ...
providers: [
// ...
DubboServiceProvider
]
};
複製代碼
直接在 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 消費者後端
在 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'
複製代碼