Amazon web services 如何使用AWS API网关开发微服务;Lambda/ECS对话?

Amazon web services 如何使用AWS API网关开发微服务;Lambda/ECS对话?,amazon-web-services,aws-lambda,microservices,aws-api-gateway,amazon-ecs,Amazon Web Services,Aws Lambda,Microservices,Aws Api Gateway,Amazon Ecs,我正在使用AWS API网关和Lambda或ECS for compute开发一个“微服务”应用程序。现在的问题是服务之间的通信是通过API网关通过API调用实现的。这让人感觉效率低下,安全性也不如实际情况。有没有办法让我的微服务以更高效、更安全的方式相互交流?比如在私人网络中直接交谈 我想到的一种方法是多层次的API网关 1公共API网关 每个微服务1个专用API网关。每个微服务都可以在专用网络内“直接”调用另一个微服务 但通过这种方式,我需要在两个级别的API中“复制”我的路由。。。这似

我正在使用AWS API网关和Lambda或ECS for compute开发一个“微服务”应用程序。现在的问题是服务之间的通信是通过API网关通过API调用实现的。这让人感觉效率低下,安全性也不如实际情况。有没有办法让我的微服务以更高效、更安全的方式相互交流?比如在私人网络中直接交谈

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

  • 1公共API网关
  • 每个微服务1个专用API网关。每个微服务都可以在专用网络内“直接”调用另一个微服务
但通过这种方式,我需要在两个级别的API中“复制”我的路由。。。这似乎并不理想。我在想也许可以使用
{proxy+}
。因此,任何
/payment/{proxy+}
都会转到支付API网关,依此类推-还有两个级别的API网关。。。但这似乎是我能做的最好的了


也许有更好的办法

同样的问题我已经想了一段时间了,仍然找不到一个好的通用解决方案。。。为了它的价值

如果通信是单向的,“调用者”不需要等待结果,我发现Kinesis流非常强大——只需在流上发布一个“任务”,并让流触发lambda来处理它。但显然,这在非常有限的情况下起作用

对于response-reply世界,我像最终用户一样调用API网关端点(增加了封送和解封数据以“适应”HTTP世界的开销,以及不必要的多次身份验证)


在极少数情况下,我可能有一个后端lambda函数,该函数由网关API lambda和其他微服务直接调用。这为“最终用户”增加了一个额外的“跃点”(而不是[UI->Gateway API->Gateway API lambda],现在我有[UI->Gateway API->Gateway API lambda->Backend lambda]),但使源自微服务的调用更快(因为调用和所有相关数据不再需要通过HTTP请求“隧道化”)。此外,这使得体系结构更加复杂(我不再有一个正式的API,但现在有一个“后台”直接依赖项)。

除了绑定到当前设置和基础结构之外,还有多种方法和途径可以实现这一点,而不排除实现/修改现有代码库的灵活性

当尝试在API网关后面的服务之间进行通信时,需要仔细实施,以避免循环、暴露数据或甚至最糟糕的情况,阻止您自己,请参阅“通用”图像以获得更好的理解:

当使用HTTP在服务之间进行通信时,通常会看到流量从当前基础设施流出,然后通过同一个API网关返回,这可以通过直接返回其他服务来避免

例如,在前一幅图中,当
服务B
需要与
服务A
通信时,建议通过内部(ELB)端点进行通信,而不是通过API网关进行通信

另一种方法是在API网关中使用“仅”HTTP,并使用其他协议在您的服务中进行通信,例如。(在某些情况下不是最佳选择,因为这取决于您的体系结构和修改/调整现有代码的灵活性)

在某些情况下,您的基础架构更加复杂,您可能无法在容器内按需通信,或者无法访问端点,在这种情况下,您可以尝试实现(SQS和AWS Lambda)

我喜欢在可能的情况下通过使用事件/队列进行异步,从我的角度来看,可以更好地“扩展”服务,并且必须使服务成为消费者/工作者,除了不需要侦听传入的请求(不需要HTTP),这里有一篇文章解释如何使用


这些只是一些想法,希望能帮助您找到自己的“最佳”方式,因为这些想法变化太大,而且每个场景都是独特的。

我认为您的问题与AWS没有严格的关系,而更像是服务之间的一般通信方式

API网关用作边缘服务,该服务位于后端边界,可由外部方访问。对于API网关后面、微服务之间的通信,您不必再次通过API网关

对于您的案例,我要提到两种沟通方式:

  • HTTP
  • 消息传递
HTTP是最简单的通信方式,因为它自然更容易理解,并且有大量的库使其易于使用

尽管有这些优点,但仍有一些事情需要注意

  • 故障处理
  • 服务无法响应时的断路
  • 一致性
  • 重试
  • 使用服务发现(如Eureka)使系统在调用其他服务时更加灵活
在消息传递方面,您必须处理异步处理、基础设施问题,如设置和维护MessageBroker,它不像纯HTTP那么容易使用,但您可以通过最终保持一致性来解决一致性问题

总的来说,有很多事情你必须考虑,一切都是权衡取舍。如果您刚刚开始使用微服务,我认为最好先使用HTTP进行通信,然后慢慢使用消息传递替代方案

例如,在Java+Spring云Netflix世界中,您可以将Eureka与Faign结合使用,这样就很容易使用Eureka翻译的服务的逻辑地址