【发布时间】:2018-01-05 07:39:03
【问题描述】:
我正在尝试开发一个节点 js 应用程序,作为服务的 api-gateway/facade 层(在 Spring Boot 中开发)。
这是一个好习惯吗?
如果是,我应该使用哪个 nodejs 框架?(Async / co / Promise / Async-Await )等。我的意思是目前主要用于生产环境?
【问题讨论】:
标签: node.js asynchronous
我正在尝试开发一个节点 js 应用程序,作为服务的 api-gateway/facade 层(在 Spring Boot 中开发)。
这是一个好习惯吗?
如果是,我应该使用哪个 nodejs 框架?(Async / co / Promise / Async-Await )等。我的意思是目前主要用于生产环境?
【问题讨论】:
标签: node.js asynchronous
“这是一个好习惯吗?”
您的问题与什么有关?使用 API 网关/门面?使用弹簧靴?使用异步/等待...?你到底是什么问题?
我猜你想开发一个基于 Spring Boot 的微服务架构,使用基于 nodeJS 的 api 编排器作为前端控制器和单一入口点?
不要将朴素路由的技术方面(使用 nginx、轮询、反向代理等)提高容量、速度、可用性等与通过 url 路径映射的服务语义业务集成相混淆。 API Orchestrator 处理底层服务环境的语义抽象和集成。 API Gateway 与 API Orchestrator!
在我个人看来,将 API Orchestrator 与微服务结合使用是一种可接受的解决方案。这是最简单和谦虚的方式 集成并构成一个底层服务层。
只说几个正面和负面的方面:
基于 nodeJS 的 API Orchestrator 与 HTTP 通信的设计试验 ...
基于 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}`)
})
【讨论】:
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 库(例如 axios 或 request,它们都支持 Promises)才能将您的请求转发到目标服务器。
【讨论】: