Nginx 如何以及应该使用哪种工具为polyglot微服务平台创建API网关?

Nginx 如何以及应该使用哪种工具为polyglot微服务平台创建API网关?,nginx,load-balancing,microservices,haproxy,api-gateway,Nginx,Load Balancing,Microservices,Haproxy,Api Gateway,在微服务体系结构的情况下,有一组服务构建在不同的堆栈上,并通过REST与彼此以及客户机进行通信 所以我要求的是,使该网关成为来自客户端或消费者的单个入口点,例如api.domain.com,它将根据端点将请求重定向到相应的服务,正如我们知道的api网关的用途一样 好吧,通过负载平衡器,如nginx plus或HAProxy简单地平衡负载和传递代理,这是可能的。但我的期望值(主要是基于身份验证的授权)如下: 消费者将使用凭据进行身份验证,服务器将返回小的访问令牌(最小值,例如用户id作为有效负载

在微服务体系结构的情况下,有一组服务构建在不同的堆栈上,并通过REST与彼此以及客户机进行通信

所以我要求的是,使该网关成为来自客户端或消费者
的单个入口点,例如api.domain.com
,它将根据端点将请求重定向到相应的服务,正如我们知道的api网关的用途一样

好吧,通过负载平衡器,如
nginx plus
HAProxy
简单地平衡负载和传递代理,这是可能的。但我的期望值
(主要是基于身份验证的授权)
如下:

  • 消费者将使用凭据进行身份验证,服务器将返回小的访问令牌
    (最小值,例如用户id作为有效负载)
    ,该令牌将存储到客户端应用程序中。此外,每个请求客户机都将以JWT或基于令牌的身份验证的方式发送此令牌作为授权
  • 在将请求传递给另一个服务之前,
    网关服务
    将解码该小身份验证令牌,并生成另一个授权令牌
    (比方说大令牌)
    与相关用户一起提供所有信息(通过解码的小令牌有效负载进行查询)它将作为授权传递给实际服务,并作为内部服务传递给内容提供服务的服务调用
  • (网关服务生成)
    Big-Token
    和有效负载将在
    redis
    中存储一段时间,以减少每次获取用户信息的api调用
  • 请求缓存和平衡负载
我不确定是否可以通过
nginx plus
HAproxy
实现,可能不行因为在那里,我们几乎没有数据库查询、api调用和缓存到redis等,这是
nginx
HAProxy
或类似的东西所无法做到的

我为Node.js/Express.js找到了两个用于传递代理的服务,这两个服务只用于expressjsapi服务,但这里我使用的是polyglot框架或语言

注意:这里的服务是用PythonFlask、Django和ExpressJS构建的,很少有服务托管在Unix虚拟机中,使用nginx作为负载平衡器,很少有服务托管在azure应用服务中,使用IIS作为负载平衡器


感谢您的阅读和理解,如果您能提出任何建议或任何建议,那将是非常棒的

我建议你去看看Ambasador——听起来它很适合你的需要。另一个有很多支持和庞大社区的可靠选择是香港。其他的选择有,和。

我建议你去看看Ambasador——听起来它很适合你的需要。另一个有很多支持和庞大社区的可靠选择是香港。其他的选择是,和。

我真的会推荐

您可以为
api.domain.com
使用可以使用的节点服务器。它可用于消费微服务,例如
serviceone.com
servicetwo.com
。只要您将这些微服务作为REST/SOAPAPI公开,它就不会关心您用来构建这些微服务的内容(例如python flask、Django和ExpressJS)

假设您有一些端点,如
serviceone.com/rone
servicetwo.com/rtwo
, 您可以向自定义代理服务器将使用的
api.domain.com/rone
api.domain.com/rtwo
请求,并将请求发送到
serviceone.com/rone
servicetwo.com/rtwo
。您可以从请求中读取标题,并对其进行处理,在将请求发送到micro services之前更改标题。这将解决您的身份验证问题。您可以在这里使用redis和缓存


对我来说很好。希望有帮助。

我真的会推荐

您可以为
api.domain.com
使用可以使用的节点服务器。它可用于消费微服务,例如
serviceone.com
servicetwo.com
。只要您将这些微服务作为REST/SOAPAPI公开,它就不会关心您用来构建这些微服务的内容(例如python flask、Django和ExpressJS)

假设您有一些端点,如
serviceone.com/rone
servicetwo.com/rtwo
, 您可以向自定义代理服务器将使用的
api.domain.com/rone
api.domain.com/rtwo
请求,并将请求发送到
serviceone.com/rone
servicetwo.com/rtwo
。您可以从请求中读取标题,并对其进行处理,在将请求发送到micro services之前更改标题。这将解决您的身份验证问题。您可以在这里使用redis和缓存

对我来说很好。希望有帮助。

对于您提到的用例,我建议您:

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

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

  • Kong提供负载平衡支持。由于它构建在Nginx之上,您还可以根据需要配置核心Nginx

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

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