Nodejs并行API命中

时间:2018-01-05 07:39:03

标签: node.js asynchronous

我正在尝试开发一个节点js应用程序,它充当服务的api-gateway / facade层(在Spring Boot中开发)。

这是一个好习惯吗?

如果是,我应该使用哪个nodejs框架?(Async / co / Promise / Async-Await)等等。我的意思是目前主要用于生产环境的是什么?

2 个答案:

答案 0 :(得分:1)

  

“这是一个好习惯吗?”

你的弱问题是什么?使用API​​网关/门面?使用弹簧靴?使用async / await ......?究竟是什么问题?

我想你想开发一个基于spring boot的微服务架构,基于nodeJS的api网关作为前控制器和单一入口点?

不要混淆天真路由的技术方面(负载均衡与nginx,循环,反向代理等),以通过url路径映射与服务的语义业务集成来增加容量,速度,可用性等。 API网关解决了底层服务环境的语义抽象和集成。

就我个人而言,使用API​​网关与微服务一起使用始终是一个很好的解决方案。这是最简单,最温和的方式 集成并组合底层服务层。

只是陈述一些积极和消极的方面:

  • 标准商业案例的单一入口点,例如
    认证,安全问题,会话遗嘱,伐木等。
  • 也可以作为微服务启动和管理。随意使用 API网关微服务的n层分层架构风格
  • 提取潜在的过量微服务的复杂性 层
  • 可能成为一个神的对象,代码很多..
  • 在微服务设计的背景下,API网关执行很多 商业案例
  • 高耦合,复杂......

使用HTTP通信设计基于nodeJS的API网关的试用...

  1. 评估(网络)服务器(express.js,hapi.js,您自己的节点服务器)
  2. 评估http请求API(axios,node-fetch,r2,your-own-http-api)。 HTTP-API应解析为promise对象!
  3. 基于express.js的API网关示例:

    const express = require('express');
    const http = require('http');
    const path = require('path');
    const app = express();
    const port = 3000;
    
    // define middleware plugins in express.js for your API gateway like session management ...
    
    app.use(express.static(path.join(__dirname, 'public')));
    
    // define relevant business/use case relevant semantic routes or commands e.g. /getAllUsers or REST-URL or /whatever
    
    app.get('/whatever', (request, response) => {
    
        //consumes whatever service
        const getWhatEverToGet = () => {
            return new Promise((resolve, reject) => {
                //connection data should be read from a service registry or by configuration management (process level, file level, environemnt level)
                http.get({
                    hostname: 'localhost',  
                    port: 3001,
                    path: `/whatever_service_url`
                }, (res) => {
                    // built-in HTTP-API http.get() uses streams, hence "onData"-event should be buffered, not done here!
                    res.on('data', (data) => { 
                        resolve(data.toString());
                    });
                });
            });
        }
    
        // Here you can consume more services with the same code, when they are connected to each other use async/await to share data synchronized...
    
        //consumes whatever2 service returns promise
        //consumes whatever3 service returns promise
    
        const respondWhatEverData = async () => {
             let whatEver = await getWhatEverToGet(); 
             response.send(whatEver)
        }
    
        // trigger service complete
        respondWhatEverData();
    })
    
    app.listen(port, (err) => {
      if (err) {
        return console.log('Shit happens...', err)
      }
      console.log(`server listens on ${port}`)
    })
    

答案 1 :(得分:0)

TL; DR如果您的NodeJS应用程序只是将请求转发给Spring Boot应用程序,那么NodeJS设置可能不值得。你应该看看能够做到这一切的Nginx崇敬代理。

Async / co / Promise / Async-Await不是框架。 Promise / async-await是NodeJS中的编程结构; Async / co是便利库,可以在引入Promises和async-await之前管理异步代码。也就是说,有多个休息框架可用于接收和管道对SpringBoot服务器的请求。看看Express.JS, Restify, Sails.js所有这些都可以为NodeJS添加REST功能。您还需要一个Rest Client库(如axiosrequest,然后支持Promises)才能将您的请求转发到目标服务器。