当前位置: 首页 > 后端技术 > Node.js

使用Node.js搭建API网关

时间:2023-04-03 15:42:17 Node.js

原文地址:使用Node.js搭建API网关原作者:PéterMártonminer/blob/master/TODO/building-an-api-gateway-using-nodejs.md译者:MuYunyun校对:jasonxia23,CACppuccino#在微服务架构下使用Node.js搭建API网关供外部客户端访问服务,服务端会有一些通用的认证和传输需求。API网关提供了一个共享层来处理服务协议之间的差异,并满足桌面浏览器、移动设备和遗留系统等特定客户端的需求。微服务和消费者微服务是面向服务的架构,团队在其中独立设计、开发和发布应用程序。它允许系统各个级别的技术多样性,并且团队可以从针对给定技术挑战使用最佳语言、数据库、协议和传输层中受益。例如,一个团队可以使用JSONoverHTTPREST,而另一个团队可以使用消息代理,例如gRPC或RabbitMQoverHTTP/2。在某些情况下,使用不同的数据序列化和协议可能会很强大,但要使用我们产品的客户可能有不同的需求。随着客户端从桌面浏览器通过移动设备和游戏机转移到遗留系统,问题也可能发生在具有同质技术堆栈的系统中。一个客户端可能期望XML格式,而另一个客户端可能期望JSON。在许多情况下,您需要同时支持两者。当客户想要使用您的微服务时,您可能面临的另一个挑战来自公共共享逻辑(例如身份验证),因为您不想在所有服务中重新实现相同的东西。总结:我们不想在我们的微服务架构中实现我们的内部服务来支持多个客户端并且可以重用相同的逻辑。这就是API网关的用武之地,作为一个共享层来处理服务协议之间的差异并满足特定的客户端需求。什么是API网关?API网关是微服务架构中的一种服务,它为客户端提供共享层和API以与内部服务进行通信。API网关可以路由请求、转换协议、聚合数据并实现共享逻辑,例如身份验证和速率限制器。您可以将API网关视为进入我们微服务世界的入口点。我们的系统可以有一个或多个API网关,这取决于客户的需求。例如,我们可以为桌面浏览器、移动应用程序和公共API提供单独的网关。API网关作为微服务的入口Node.js前端团队的API网关由于API网关为浏览器等客户端应用程序提供功能,因此它可以由负责开发前端应用程序的团队实施和管理。这也意味着API网关的实现语言应由负责特定客户端的团队选择。由于JavaScript是开发浏览器应用程序的主要语言,因此即使您的微服务架构是用不同的语言开发的,Node.js也是实现API网关的绝佳选择。Netflix成功使用Node.jsAPI网关及其Java后端来支持广泛的客户端——在Netflix文章Netflix处理不同客户端、资源API的微服务“铺平道路”PaaS中了解更多关于他们方法的信息网关功能我们之前讨论过可以将通用的共享逻辑放入您的API网关,本节描述最常见的网关职责。路由和版本控制我们将API网关定义为微服务的入口点。在您的网关服务中,您可以指定将请求从客户端路由到特定服务。您甚至可以通过路由处理版本控制或更改后端接口,而暴露的接口可以保持不变。您还可以在API网关中定义与多个服务一起使用的新端点。设计为微服务入口点网关的升级API网关方法还可以帮助您分解单体应用程序。在大多数情况下,在微服务端重构系统不是一个好主意,也不可能,因为我们需要在重构过程中向业务交付新功能和遗留功能。在这种情况下,我们可以在我们的整体应用程序前面放置一个代理或API网关,将新功能实现为微服务,并将新端点路由到新服务,同时通过旧路由为旧端点提供服务。后面我们也可以把原来的功能分解成新的服务,进行整体分解。通过网关设计的升级,我们可以实现从单体架构到微服务的平滑过渡API网关设计的升级认证大多数微服务基础设施都需要认证。向API网关添加共享逻辑(例如身份验证)可以帮助您保持服务的小型化并集中管理域。在微服务架构中,您可以通过网络配置在DMZ(演示区)中保护您的服务,并通过API网关将它们公开给客户端。网关还可以处理多种身份验证方法。例如,您可以同时支持基于cookie和令牌的身份验证。具有鉴权功能的API网关数据在微服务架构中聚合,客户端需要的数据聚合层次可能不同,比如各种微服务中产生的非规范化数据实体。在这种情况下,我们可以使用我们的API网关来解决这些依赖关系并从多个服务收集数据。在下图中,您可以看到API网关如何将用户和信用信息作为一条数据返回给客户端。请注意,这些数据由不同的微服务拥有和管理。序列化格式转换我们需要支持客户端不同的数据序列化格式,可能会出现这样的需求。想象一下我们的微服务使用JSON,但我们的客户只能使用XMLAPI的情况。在这种情况下,我们可以在API网关中将JSON转换为XML,而不是在所有微服务中单独进行。协议转换微服务架构,允许多通道协议传输,获得多种技术的优势。然而,大多数客户端只支持一种协议。在这种情况下,我们需要转换客户端的服务协议。API网关还可以处理客户端和微服务器之间的协议转换。在下图中,您可以看到客户端希望通过HTTPREST进行的所有通信,而内部微服务使用gRPC和GraphQL。速率限制和缓存在前面的示例中,您可以看到我们可以将公共共享逻辑(例如身份验证)放在API网关中。除了身份验证,您还可以在API网关中实现速率限制、缓存和各种可靠性功能。重载API网关在实现API网关时,您应该避免将非通用逻辑(例如特定数据转换)放入您的网关中。服务应该始终拥有其数据字段的完全所有权。构建过载的API网关并让微服务团队进行控制有悖于微服务的理念。这就是为什么您应该关注API网关中的数据聚合-您应该避免它有很多逻辑,甚至可以包含特定的数据转换或规则处理逻辑。始终为您的API网关定义明确的职责,并且仅在其中包含共同的共享逻辑。Node.jsAPI网关当你想在API网关中执行简单操作时,比如将请求路由到特定服务,你可以使用像nginx这样的反向代理。但在某些时候,您可能需要实现通用代理不支持的逻辑。在这种情况下,您可以在Node.js中实现自己的API网关。在Node.js中,您可以使用http-proxy包简单地将请求代理到特定服务,也可以使用功能更丰富的express-gateway来创建API网关。在我们的第一个API网关示例中,我们在将代码委托给用户服务之前验证请求。constexpress=require('express')consthttpProxy=require('express-http-proxy')constapp=express()constuserServiceProxy=httpProxy('https://user-service')//认证app.use((req,res,next)=>{//TODO:认证逻辑next()})//代理请求app.get('/users/:userId',(req,res,next)=>{userServiceProxy(req,res,next)})另一个示例可能是在您的API网关中发出新请求并将响应返回给客户端:constexpress=require('express')constrequest=require('request-promise-native')constapp=express()//解决方案:GET/users/meapp.get('/users/me',async(req,res)=>{constuserId=req.session.userIdconsturi=`https://user-service/users/${userId}`constuser=awaitrequest(uri)res.json(user)})Node.jsAPIGateway总结APIGateway提供了一个共享层来通过微服务架构来满足客户的需求。它有助于保持您的服务小而集中。您可以将不同的通用逻辑放入您的API网关,但您应该避免过度使用API网关,因为很多逻辑可以从服务团队那里获得控制权。---掘金翻译项目是一个翻译优质互联网技术文章的社区,文章来源为掘金上的英文分享文章。内容涵盖Android、iOS、React、前端、后端、产品、设计等领域。想看到更多优质翻译,请持续关注掘金翻译计划、官方微博、知乎专栏。