摘要:由于中的都是服務,所以需要一個插件來調用服務。可以看到,只是一個封裝,真正對工作委托給了也就是。在里,我們進行了方法的綁定,這樣在里,就可以像調用方法一樣,調用服務了。完成后,補齊單元測試,發布到庫里就可。
由于MVC中的M都是dubbo服務,所以需要一個插件來調用dubbo服務。個人推薦這個包node-zookeeper-dubbo 我們所需要的只是把他封裝成一個插件,使用方式則類似于httpClient.
首先執行egg-init --type=plugin egg-dubbo-plugin
這樣一個插件的大體框架就構造完成了(egg真的很方便,是不是?)
然后安裝依賴:
npm i --save js-to-java npm i --save node-zookeeper-dubbo
完成這些后,我們就開始開發工作了,主要內容就是app.js和app/extend/context.js這兩個文件中。
app.js:
const nzd = require("node-zookeeper-dubbo"); module.exports = app => { class DubboClient { constructor() { let config = app.config.dubboclient; config.java = require("js-to-java") this.dubboAgent=new nzd(config.dubboAgent); } request(className, method, javaParams) { try { return this.dubboAgent[className][method](...javaParams); }catch(e){ app.coreLogger.error("[egg:dubboAgent] call dubbo error"); app.coreLogger.error(e); } } } app.dubboClinent = new DubboClient(); };
可以看到,DubboClient只是一個封裝,真正對工作委托給了 dubboAgent,也就是nzd。
context.js
module.exports = { dubbo(className, method, ...javaParams) { const timeout = this.app.dubboClinent.dubboAgent.dependencies[className].dubboTimeout || this.app.dubboClinent.dubboTimeout || 30000; return Promise.race([ this.app.dubboClinent.request(className, method, javaParams), new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), timeout)) ]); }, };
在context.js里,我們進行了dubbo方法的綁定,這樣在controller里,就可以像調用ctx.curl方法一樣,調用dubbo服務了。
這里要注意一個問題:dubbo服務可能會超時,所以我們這里需要對超時進行了處理,通過Promise.race,讓dubbo服務的調用和我們的timeout進行競爭,如果超時,直接拋出錯誤。注意!!!不要catch,egg會統一對錯誤進行處理,所以我們在底層不要catch錯誤,直接把錯誤往上拋出就好!
最后,看一下使用這個插件時的配置,在config.default.js中:
exports.dubboclient = { dubboAgent: { application:{name:"demo-provider"}, register:"localhost:2181", dubboVer:"2.5.4-SNAPSHOT", root:"dubbo", dependencies:{ Foo:{ interface:"com.alibaba.dubbo.demo.provider.DemoService", }, } } }
和node-zookeeper-dubbo對比下就能看出,我們只是把配置移動到dubboAgent這個對象而已。
完成后,補齊單元測試,發布到npm庫里就可。
git地址:https://github.com/Daniel1989...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107240.html
摘要:今天就簡要說說下的實現。主要的原因是的文檔寫的不太清楚,方便新人快速上手。導致我們一目十行去掃文檔的時候,有時總會覺得有些莫名,的實現就是其中之一。其實這和我本身對的了解不深入有關,但是也沒有文檔和我說實現啊。 這兩天真的是宅的骨頭都發霉了,春困秋乏夏打盹,也是醉了。今天就簡要說說eggjs下Restful API的實現。主要的原因是egg的文檔寫的不太清楚,方便新人快速上手。話說eg...
摘要:原文鏈接時代,架構該怎么跟進,來自于微信公眾號次靈均閣作為核心開發者,請先簡單介紹下自己答大家好,我是小馬哥,一名學習當爸爸的父親,勸退師,項目架構師,編程思想的作者。因此,需求的來源不再已阿里為絕對主導,社區共建和共制的發展模式已成事實。 原文鏈接:Service Mesh 時代,Dubbo 架構該怎么跟進?,來自于微信公眾號:次靈均閣 作為 Duboo 核心開發者,請先簡單介紹下...
摘要:原文鏈接時代,架構該怎么跟進,來自于微信公眾號次靈均閣作為核心開發者,請先簡單介紹下自己答大家好,我是小馬哥,一名學習當爸爸的父親,勸退師,項目架構師,編程思想的作者。因此,需求的來源不再已阿里為絕對主導,社區共建和共制的發展模式已成事實。 原文鏈接:Service Mesh 時代,Dubbo 架構該怎么跟進?,來自于微信公眾號:次靈均閣 作為 Duboo 核心開發者,請先簡單介紹下...
閱讀 2374·2021-11-24 10:26
閱讀 2566·2021-11-16 11:44
閱讀 1696·2021-09-22 15:26
閱讀 3565·2021-09-10 11:11
閱讀 3178·2021-09-07 10:25
閱讀 3616·2021-09-01 10:41
閱讀 1003·2021-08-27 13:11
閱讀 3498·2021-08-16 11:02