我正在尝试开发一个节点js应用程序,它充当服务的api-gateway / facade层(在Spring Boot中开发)。
这是一个好习惯吗?
如果是,我应该使用哪个nodejs框架?(Async / co / Promise / Async-Await)等等。我的意思是目前主要用于生产环境的是什么?
答案 0 :(得分:1)
“这是一个好习惯吗?”
你的弱问题是什么?使用API网关/门面?使用弹簧靴?使用async / await ......?究竟是什么问题?
我想你想开发一个基于spring boot的微服务架构,基于nodeJS的api网关作为前控制器和单一入口点?
不要混淆天真路由的技术方面(负载均衡与nginx,循环,反向代理等),以通过url路径映射与服务的语义业务集成来增加容量,速度,可用性等。 API网关解决了底层服务环境的语义抽象和集成。
就我个人而言,使用API网关与微服务一起使用始终是一个很好的解决方案。这是最简单,最温和的方式 集成并组合底层服务层。
只是陈述一些积极和消极的方面:
使用HTTP通信设计基于nodeJS的API网关的试用...
基于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库(如axios
或request
,然后支持Promises)才能将您的请求转发到目标服务器。