当前位置: 首页 > 后端技术 > Node.js

eggjs与dubbo的结合,egg-dubbo-plugin的开发

时间:2023-04-04 01:06:04 Node.js

由于MVC中的M是dubbo服务,所以需要一个插件来调用dubbo服务。我个人推荐这个包node-zookeeper-dubbo。我们只需要将其封装成一个插件即可,使用方法类似于httpClient。首先执行egg-init--type=pluginegg-dubbo-plugin。这样一个插件的大体框架是搭建完成(egg真的很方便是吧?)然后安装依赖:npmi--savejs-to-javapmi--savenode-zookeeper-dubbo完成这些之后,我们就要开始开发工作了,主要内容在app.js和app/extend/context.js这两个文件中。app.js:constnzd=require("node-zookeeper-dubbo");module.exports=app=>{classDubboClient{constructor(){letconfig=app.config.dubboclient;config.java=require('js-to-java')this.dubboAgent=newnzd(config.dubboAgent);}request(className,method,javaParams){try{returnthis.dubboAgent[className][method](...javaParams);}catch(e){app.coreLogger.error('[egg:dubboAgent]调用dubbo错误');app.coreLogger.error(e);}}}app.dubboClient=newDubboClient();};可以看到,DubboClient只是一个封装,实际上是将工作委托给了dubboAgent,也就是nzd。context.jsmodule.exports={dubbo(className,method,...javaParams){consttimeout=this.app.dubboClinent.dubboAgent.dependencies[className].dubboTimeout||this.app.dubboClinent.dubboTimeout||30000;returnPromise.race([this.app.dubboClinent.request(className,method,javaParams),newPromise((_,reject)=>setTimeout(()=>reject(newError('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...