应该如何以及应该使用哪种工具来为多语言微服务平台制作 API-Gateway?

Posted

技术标签:

【中文标题】应该如何以及应该使用哪种工具来为多语言微服务平台制作 API-Gateway?【英文标题】:How and Which tool should use to make API-Gateway for polyglot Microservice Platform? 【发布时间】:2019-05-20 21:09:22 【问题描述】:

在微服务架构的情况下,有一堆服务构建在不同的堆栈上,并通过 REST 相互通信并与客户端通信。

所以我要的是,使该网关成为来自客户端或消费者e.g api.domain.com 的单个入口点,这将根据我们对 api-gateway 用途的了解,将请求重定向到基于端点的相应服务。

好吧,可以通过负载平衡器(如 nginx-plusHAProxy 简单地平衡负载和传递代理)来实现。但我对(mostly about authentication-authorization based) 的期望如下:

消费者将使用凭据进行身份验证,服务器将返回小的 access_token (minimal e.g user_id as payload) 将存储到客户端应用程序中。此外,每个请求客户端将发送此令牌作为授权,如 JWT 或基于令牌的身份验证所做的那样。 在将请求传递给另一个服务之前,Gateway-service 将解码那个小 auth_token 并将生成另一个授权令牌 (let's say Big Token) 与关联的用户所有信息(通过小令牌解码的有效负载查询),这将作为授权传递给实际服务和内部服务到服务的调用,内容将从那里提供服务。 (网关服务生成)Big-Token 和有效负载将存储到redis 中一段时间​​,以减少每次获取用户信息的 api 调用。 请求缓存和平衡负载。

我不确定是否可以通过nginx-plusHAproxy 实现可能否! 因为我们很少有数据库查询、api 调用和缓存到 redis 等。这不是可以通过nginxHAProxy 或类似的方式实现。

我为Node.js/Express.js 找到了两个服务,用于传递代理Node-HTTP-Proxy 和Express-Gateway,这仅适用于expressjs api-services,但这里我使用的是多语言框架或语言。

注意:这里的服务是使用 python flask、Django 和 ExpressJS 构建的,其中很少有托管在使用 nginx 作为负载平衡器的 Unix VM 中,而很少有托管在使用 IIS 作为负载平衡器的 azure app 服务中。

感谢您的阅读和理解,如果您能提出建议或推荐任何东西,那就太好了。

【问题讨论】:

【参考方案1】:

其实我会推荐Node-HTTP-Proxy。

您可以为 api.domain.com 使用一个节点服务器,它可以使用 Node-HTTP-Proxy 。它可用于消费微服务,例如。 serviceone.comservicetwo.com。只要您将它们公开为 REST/SOAP api,它就不会关心您使用什么来构建此微服务(例如 python flask、Django 和 ExpressJS)。

假设您有一些端点,例如 serviceone.com/roneservicetwo.com/rtwo, 您可以向api.domain.com/roneapi.domain.com/rtwo 发出请求,您的自定义代理服务器将使用Node-HTTP-Proxy 并将请求发送至serviceone.com/roneservicetwo.com/rtwo。您可以从请求中读取标头并对其进行处理,并在将请求发送到微服务之前更改标头。这将解决您的身份验证问题。您可以在此处使用 redis 和缓存。

对我来说工作得很好。希望对您有所帮助。

【讨论】:

这是我的最后一个选择,我开始了,谢谢。【参考方案2】:

我建议您查看 Ambasador - https://www.getambassador.io - 听起来它会满足您的需求。另一个拥有大量支持和大型社区的可靠选择是 Kong - https://konghq.com。其他选择是Nginx、Loopback 和Tyk。

【讨论】:

谢谢,我正在检查会回复你 我经历了这两个似乎不符合我的期望还是谢谢你。【参考方案3】:

对于您提到的用例,我会推荐Kong:

    对于您提到的具体认证方式,您需要使用 Lua 编写插件。 Kong 内置了许多身份验证支持,但您的要求有点不同。

    Kong 在内存中缓存其所有数据,包括消费者。所以你不需要实现另一个基于 Redis 的解决方案。当您有新用户时,您需要使用其管理 API 将该用户添加为 Kong 的消费者。

    Kong 支持负载平衡。而且由于它是建立在 Nginx 之上的,如果需要,您还可以配置核心 Nginx。

    对于网关级别的请求缓存,Kong 为其企业版提供了一个插件。还有一些开源社区构建的插件。

关于自定义身份验证,您应该三思而后行为什么需要它在两个级别。在网关级别,您可以验证和使用 ACL,底层服务可以信任即将到来的请求。您可能需要实现服务级别中间件来识别 Kong 正在通过的用户,以进行资源级别授权。

一个警告在与 Kong 合作时,我觉得有必要进行适当的详尽文档。

【讨论】:

我正在尝试完全相同的步骤,但现在正在学习 lua 来编写插件。顺便说一句,我想使用 redis 来存储令牌有效负载,而不是用于请求缓存。非常感谢。 Kong 将消费者和他们的令牌一起缓存在内存中,这里不需要 redis。 也可以从其他服务访问,但让我实验会更新你

以上是关于应该如何以及应该使用哪种工具来为多语言微服务平台制作 API-Gateway?的主要内容,如果未能解决你的问题,请参考以下文章

Java命名实体识别

我应该使用 HTML5 Canvas 还是 CSS3 Sprites 来为游戏对象设置动画?

我的数据使用哪种 lstm 架构以及我应该做啥数据处理

我如何将我的Python代码链接到Google Cloud的服务?我应该使用哪种服务?

我应该使用哪种分类模型来进行机器学习中的作者归属?

求推荐go语言开发工具及go语言应该以哪种目录结构组织代码?