如何使用AWS API Gateway + Lambda/ECS谈话开发微服务?

Jie*_*eng 11 amazon-web-services amazon-ecs microservices aws-lambda aws-api-gateway

我正在使用AWS API Gateway开发一个"微服务"应用程序,使用Lambda或ECS进行计算.现在的问题是服务之间的通信是通过API网关的API调用.这感觉效率低,安全性低于可能.有没有办法让我的微服务以更高效和安全的方式相互交谈?像某种方式直接在私人网络内谈话?

我想到的一种方法是多层API网关.

  • 1个公共API网关
  • 每个微服务1个私有API网关.并且每个微服务可以在专用网络内"直接"调用另一个微服务

但是通过这种方式,我需要在2级API中"复制"我的路线......这似乎并不理想.我在想也许用{proxy+}.所以任何东西/payment/{proxy+}都转到支付API网关等等 - 还有2级API网关......但这似乎是我能做的最好的?

也许有更好的方法?

Kit*_*der 7

构建微服务的方式有很多。首先,我要熟悉AWS发布的白皮书:AWS上的微服务白皮书-PDF版本

在您的问题中,您说:“现在的问题是,服务之间的通信是通过API网关通过API调用进行的。这感觉效率低下,并且安全性较差。有没有办法让我的微服务以更高的性能彼此通信和安全的方式?”

是的-实际上,AWS白皮书和API网关常见问题解答将API网关称为应用程序的“前门”。API Gateway的意图是用于与您的AWS服务进行通信的外部服务。而不是彼此通信的AWS服务。

AWS资源可以通过多种方式相互通信以调用微服务。白皮书中概述了一些内容,这是我使用的另一资源:更好的结合:Amazon ECS和AWS Lambda。您使用的服务将基于您的要求。

通过将单片应用程序分解为小型微服务,通信开销增加了,因为微服务必须彼此通信。在许多实现中,基于HTTP的REST被用作通信协议。它是一种轻量级的协议,但数量过多可能会引起问题。在某些情况下,考虑合并来回发送大量消息的服务可能是有意义的。如果您发现自己在合并越来越多的服务以减少闲聊的情况下,则应查看问题域和域模型。

据我了解,问题的根源是将请求路由到微服务。要维护“微服务的特征 ”,您应该选择一个解决方案来管理路由。

API网关

您提到使用API​​ Gateway作为路由解决方案。API网关可用于路由...但是,如果选择使用API​​网关进行路由,则应在一个级别中明确定义路由。为什么?

  1. 使用{proxy +}会增加攻击面,因为它需要在另一个微服务中正确处理路由。
  2. 在API Gateway中定义路由的优点之一是您的API具有自我记录功能。如果您有多个API网关,它将陷入困境。

这样做的缺点是,这将花费一些时间,并且您可能必须更改已经定义的现有API。但是,您可能已经在更改现有代码库,以遵循微服务的最佳实践。

Lambda或其他计算资源

尽管上面列出了使用API​​网关进行路由的原因,但如果配置正确,则其他资源可以正确处理路由。您可以具有Lambda函数的API网关代理,该Lambda函数具有已定义的所有微服务路由,或具有定义了路由的VPC中的另一个资源

结果

您做什么取决于您的要求和时间。如果您已经在某个地方定义了API,并且只是希望使用API​​ Gateway来限制,监视,保护和记录请求,那么您将拥有API Gateway作为代理。如果要充分利用API网关,请在其中明确定义每个路由。两种方法都可以遵循微服务最佳实践,但是,我认为在API Gateway中定义每个公共API是与微服务体系结构保持一致的最佳方法。其他答案也很好地解释了每种方法的权衡。


Dud*_*let 6

我将以Lambda为解决方案,但是它们也可以是ECS实例或ELB。

当前问题 原始问题

在跳到解决方案之前,要了解有关lambda的一个重要概念是将应用程序代码与.NET分离event_source

事件源是调用应用程序代码的另一种方法。您提到了API网关,这只是调用lambda(HTTP REQUEST)的一种方法。event sources与您的解决方案相关的其他有趣内容是:

  • Api网关(已注意到,不适用于服务间通信)
  • 直接调用(通过AWS Sdk,可以同步或异步)
  • SNS(发布/订阅,事件总线)
  • 调用lambda的方法有20多种。文件资料

用例1同步

因此,如果您的HTTP_RESPONSE依赖于一个lambda调用另一lambda并依赖于该第二lambdas结果。直接调用可能是一个足以使用的解决方案,这样您就可以invoke以同步方式使用lambda。这也意味着,lambda应该作为事件源订阅API网关,并具有规范化两种不同类型事件的代码。(这就是为什么lambda文档通常将其event作为参数之一的原因)

同步用例

用例#2异步

如果您的HTTP响应不依赖于其他微服务(lambda)执行。我强烈建议在此用例中使用SNS,因为您的原始lambda会发布一个事件,并且您可以让多个lambda订阅该事件以并行执行。

异步/并行执行

更复杂的用例

对于更复杂的用例: