为多语种微服务平台使用API​​-Gateway的方式和方法应如何?

时间:2018-12-20 10:44:34

标签: nginx load-balancing microservices haproxy api-gateway

在微服务架构的情况下,有一堆服务构建在不同的堆栈上,并且彼此之间以及通过REST与客户端进行通信。

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

嗯,像e.g api.domain.comnginx-plus这样的负载均衡器可以简单地平衡负载并传递代理。但是我的期望HAProxy如下:

  • 消费者将使用凭据进行身份验证,服务器将返回小的 access_token (mostly about authentication-authorization based)并将其存储到客户端应用中。进一步来说,每个请求客户端都会将此令牌作为授权发送给JWT或基于令牌的身份验证。
  • 在将请求传递到另一个服务(minimal e.g user_id as payload)之前,将解码该小auth_token并将与相关用户一起制作另一个授权令牌Gateway-service的所有信息(通过小令牌解码的有效负载查询)将作为授权传递给实际服务和内部服务之间的通话,将在其中服务内容。
  • (生成的网关服务)(let's say Big Token)和有效载荷将在Big-Token中存储一段时间,以减少每次都获取用户信息的api调用。
  • 请求缓存和平衡负载。

我不确定redisnginx-plus能否实现,可能是否!,因为我们很少有数据库查询,api调用和缓存到redis等内容。 HAproxynginx或类似的东西是不可能的。

我为HAProxy找到了两个用于传递代理Node-HTTP-ProxyExpress-Gateway的服务,这两个服务仅用于expressjs api服务,但是这里我使用的是多语言框架或语言。

  

注意:这里的服务是使用python flask,Django和ExpressJS构建的,其中很少托管在Unix VM中,其中使用nginx作为负载均衡器,而很少托管在Azure应用服务中,它们使用IIS作为负载均衡器。

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

3 个答案:

答案 0 :(得分:1)

我建议您检查一下大使-Display a decimal in scientific notation-听起来很适合您的需求。拥有大量支持和广泛社区的另一个可靠选择是Kong-https://www.getambassador.io。其他选择是https://konghq.comNginxLoopback

答案 1 :(得分: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 :(得分:0)

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

  1. 对于您提到的特定身份验证方式,您将需要使用Lua编写插件。 Kong有很多内置的身份验证支持,但是您的要求有所不同。

  2. Kong将所有数据(包括使用者)存储在内存中。因此,您无需实现其他基于Redis的解决方案。拥有新用户后,您需要使用该用户的admin API将其添加为Kong的用户。

  3. Kong具有负载平衡支持。而且由于它是基于Nginx构建的,因此您还可以根据需要配置核心Nginx。

  4. 对于网关级别的请求缓存,Kong有一个企业版插件。也有一些开源社区构建的插件。

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

一个警告与Kong一起工作时,我觉得有必要进行适当的彻底记录。