【问题标题】:Nodejs Parallel API HitsNodejs 并行 API 命中
【发布时间】:2018-01-05 07:39:03
【问题描述】:

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

这是一个好习惯吗?

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

【问题讨论】:

    标签: node.js asynchronous


    【解决方案1】:

    “这是一个好习惯吗?”

    您的问题与什么有关?使用 API 网关/门面?使用弹簧靴?使用异步/等待...?你到底是什么问题?

    我猜你想开发一个基于 Spring Boot 的微服务架构,使用基于 nodeJS 的 api 编排器作为前端控制器和单一入口点?

    不要将朴素路由的技术方面(使用 nginx、轮询、反向代理等)提高容量、速度、可用性等与通过 url 路径映射的服务语义业务集成相混淆。 API Orchestrator 处理底层服务环境的语义抽象和集成。 API Gateway 与 API Orchestrator!

    在我个人看来,将 API Orchestrator 与微服务结合使用是一种可接受的解决方案。这是最简单和谦虚的方式 集成并构成一个底层服务层。

    只说几个正面和负面的方面:

    • 标准业务案例的单一入口点,例如
      身份验证、安全问题、会话管理、日志记录等。
    • 也可以作为微服务启动和管理。随意使用 API 编排器微服务的 3 层分层架构
    • 抽象底层微服务层的复杂性

    • 可能会成为神物。
    • 在微服务的上下文中,API Orchestrator 可以执行很多 商业案例
    • 高耦合、复杂...

    基于 nodeJS 的 API Orchestrator 与 HTTP 通信的设计试验 ...

    1. 评估(网络)服务器(express.js、hapi.js、your-own-node-server)
    2. 评估 http-request API(axios、node-fetch、r2、your-own-http-api)。 HTTP-API 应该解析为一个 Promise 对象!

    基于 express.js 的 API Orchestrator 示例:

    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}`)
    })
    

    【讨论】:

      【解决方案2】:

      TL;DR 如果您的 NodeJS 应用程序只希望将请求转发给 Spring Boot 应用程序,那么 NodeJS 设置可能不值得。你应该看看 Nginx revere 代理,它可以有效地完成所有这些工作。

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

      【讨论】:

      • 我的主要问题是关于使用节点的并行命中,但您似乎忘记提及了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 2020-03-05
      • 2021-12-27
      • 1970-01-01
      • 2014-11-26
      相关资源
      最近更新 更多