【问题标题】:How do I expose a service to different frontends?如何将服务公开给不同的前端?
【发布时间】:2020-08-11 16:26:22
【问题描述】:

我想为“订单”创建一个微服务。该服务将具有“获取订单”或“创建订单”等典型操作。

我想通过两种方式公开这个服务:

  • 用户前端:如果您调用 /orders,您将看到您的订单
  • 支持前端:如果你调用/orders,你会看到all所有用户的订单

我想部署一个 API(订单),可以从 2 个 API 网关(用户和支持)调用。但是,如果不复制代码,我不知道该怎么做。

这是正确的方法吗?

我正在使用 AWS Apigateway + Lambda + Serverless。

【问题讨论】:

    标签: amazon-web-services aws-lambda microservices aws-api-gateway


    【解决方案1】:

    在某种程度上,您可以在 lambda 函数中区分发出请求的用户,因为您只需要获取其订单。基于此,我正在考虑您在 lambda 中收到某种令牌,您可以在其中提取正确的用户。

    考虑到这种情况,您的问题的一个标准解决方案是在您的令牌中添加一些东西,以区分用户是否来自支持组。通常,您向令牌添加声明,通知他/她是支持组的一部分。然后在您的 lambda 中检查此令牌并根据您的要求给出不同的答案。但是对于该解决方案,您需要有办法添加新的声明/管理您的身份提供者数据(您的服务中提供用户令牌的用户信息)。

    但是使用该解决方案,您会发现一个小问题:如果支持用户必须获得所有订单,而在另一个时刻只获得其订单,您将找不到一种简单的方法来实现这一点。如果您的要求要求您为支持用户提供两种用例,您将需要另一个解决方案。

    在这种情况下,另一种解决方案是提供两个不同的端点(API 网关 API)来接触相同的后端 lambda。在 normal 端点中,您将请求转发到后端,然后 lambda 获取用户的所有订单。在 support 端点中,您可以向请求添加其他内容(可以是查询参数或 http 标头)。

    为了获得更安全的解决方案,您的 support 端点不得允许来自支持组以外人员的请求。如果您选择查询参数替代方案,则必须在 normal 端点中阻止这个确切的查询参数。如果您只是将查询参数转发到下游,有人可能会滥用 normal api 为其发送查询参数并获得所有订单。

    您将在 AWS API Gateway 的集成请求中进行所有这些不同的配置。你可以找到它是如何工作的here

    【讨论】:

    • 感谢您提供详细信息。最后是 RBAC 与 API 网关模式。我认为 API Gateways API 的 + Cognito 是最好的解决方案。但是,它会添加一个额外的层:“API GW 用户”将执行 lambda 函数 1,该函数将调用身份验证用户的订单 API 过滤。然后,“API GW support”将直接执行Orders API。 lambda 函数 1(转发器 + 过滤器)会增加延迟,对吧?
    • 根据您的推荐,我不知道我是否正确理解了您的架构。也许您可以澄清 lambda 1 调用 Orders API 是什么意思。我想象 lambda 1 将实现 Orders API 逻辑。
    • Order API 是由 2 个 API 网关(用户和支持)使用的服务。我必须在网关中执行额外的逻辑(过滤用户的订单或获取所有订单)。因此,通信将是:用户 -> API 网关用户 -> Lambda1(调用 /orders?user=1) -> 订单 API -> Lambda。这是一个好的设计吗?
    • 在我看来是的!需要更多细节以获得更明智的意见......但即使有更多细节也可能是......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多