node.js 的 API 网关示例

Posted

技术标签:

【中文标题】node.js 的 API 网关示例【英文标题】:API Gateway example for node.js 【发布时间】:2016-10-10 21:47:32 【问题描述】:

寻找一个如何为微服务应用程序实现节点 API 网关的好例子,我了解拥有网关的目的,我只是不确定如何在不添加另一层 RESTful 路由调用的情况下实现它。对我来说,网关应该只是将路由定向到微服务。

API 网关端口 3000

router.use('/microservicename/*', function (req, res, next) 
     **code that will direct to microservice**
);

Microservice1 server.js 端口 3001

var express = require('express');
var app = express();

var routes = require('./routes/routes');

app.use('/microservicename', routes);

var server = app.listen(3001, function () 
    console.log('Server running at http://127.0.0.1:3001/');
);

Microservice1 router.js (3001)

router.get('/route1', function (req, res, next) 
  //get route code
);

router.post('/route2', function (req, res, next) 
  //post route code
);

router.put('/route3', function (req, res, next) 
  //put route code
);

router.delete('/route4', function (req, res, next) 
  //delete route code
);

【问题讨论】:

【参考方案1】:

假设你的微服务是它自己的 http 服务器(如果不是,那么请解释更多关于它的架构)并且假设你的 API 被设计成你可以很容易地识别哪些路由去哪个微服务而不需要指定每一个可能的路由,那么你应该能够为整个微服务创建一个路由处理程序(或者在最坏的情况下为整个微服务创建非常少量的路由处理程序)。

例如,如果所有以/api/foo 开头的请求都转到foo 微服务,那么您应该能够拥有一个捕获/api/foo/* 并将其代理到微服务的路由处理程序。如果您有所有请求的通用中间件(例如运行或验证身份验证过程的中间件),则该中间件可以位于代理路由处理程序之前的堆栈中,因此它将为所有进入微服务的请求调用。

如果您在传入的 API 调用和微服务 API 之间没有一对一的映射,那么您必须在两者之间创建一个映射。根据不匹配的程度,您可以使用表驱动的方法来做到这一点,您可以指定表中的匹配项,然后一段通用代码处理表中的所有定义。

【讨论】:

是的,您的假设是正确的,我应该对我的问题更清楚和更具描述性。我用到目前为止的一些代码更新了我的问题。 @pwborodich - 您是否尝试将 http 动词映射到路由前缀?如果我们了解哪些传入路由转到哪些微服务 URL,我们可以提供更好的帮助。 如果我有我的 Angular 客户端,可以说发出请求 localhost:3000/microservice/route1,就像上面 router.js 中的第一条路由一样。我怎样才能让网关将它传递给微服务 @jfriend00 和路由的微服务部分,我的意思是成为特定微服务的名称。

以上是关于node.js 的 API 网关示例的主要内容,如果未能解决你的问题,请参考以下文章

Node.js API 网关和 nginx 作为反向代理

如何在 Node.js 中使用带有 API 网关的 AWS Lambda 发送二进制响应? [复制]

使用 Node.js 构建 API 网关

为 Java、Python、Ruby、Node.JS 和 PHP 开放支付网关库

Node.js/AngularJS 前端调用 Spring Boot API 后端

优化 Node.js 中的 API 请求