【问题标题】:Serverless Offline: handle multiple API gatewaysServerless Offline:处理多个 API 网关
【发布时间】:2022-01-16 10:32:30
【问题描述】:

当您只有一个时,您可以使用无服务器框架和无服务器离线插件轻松调试您的无服务器应用程序,但是当您有多个 API 网关/服务时,您如何处理这种情况?

我是否应该为每个服务运行serverless offline,并在每个.yml 中配置不同的端口?
并在环境变量中对该端口进行硬编码,这样如果process.env.offline 为真,我就可以访问该端口?

【问题讨论】:

  • 看来serverless-offline 默认会将请求代理到http://localhost:3000,这将处理针对多个端点/函数的请求。但听起来你有不同的事情发生 - 你能发布你的serverless.yml吗?我真的不知道这个问题的答案,因为这是一个非常前沿的项目,但我也许可以谈谈一些事情。
  • 我有多个服务/.yml:因此不同的 API 网关必须在不同的服务器上运行。

标签: serverless-framework serverless-architecture serverless-offline


【解决方案1】:

如果您想在本地同时运行两个或多个无服务器 API 网关,您可以使用 --port 参数轻松完成。

基本上,打开两个命令行窗口,在第一个窗口中,转到您的第一个服务目录并运行:

sls offline start --port 3001

在另一个窗口中,转到您的第二个服务并运行:

sls offline start --port 3002

这样,您将有两个服务在两个端口上侦听(在此示例中为 http://localhost:3001 和 http://localhost:3002)。

如果您还使用 serverless-dynamodb-local 插件,有一个问题(目前):

如果您不使用 DynamoDB 插件,那么您没关系,现在可以停止阅读 :)

DynamoDB 插件使用相同的--port 参数,这会导致java.net.BindException: Address already in use

看到这个问题:https://github.com/99xt/serverless-dynamodb-local/issues/135

解决方法是让serverless-offline-local 插件仅在一项服务中启用(如果您有两个或更多)。

例如, 在 my-service-1 中,您将所有 dynamodb 配置保存在 serverless.yaml 文件中,并使用默认端口启动此服务:sls offline start --migrate true。在下一个服务中,我们将其命名为my-service-2 you remove serverless-dynamodb-local from plugins in serverless.yaml(不需要任何其他更改)然后您可以使用以下命令启动服务: sls offline start --port 3001。

第一个服务将启动 DynamoDB,第二个服务将能够使用它。

【讨论】:

  • 如何通过 Visual Studio 代码调试两个无服务器离线实例?
【解决方案2】:

2022 年接受的answer 更新

根据documentation,--port 不再可用 改用--httpPort,就像下面的代码

sls offline --httpPort 3001

或任何 CLI 选项都可以添加到您的 serverless.yml。例如:

custom:
  serverless-offline:
    httpsProtocol: "dev-certs"
    httpPort: 4000
    stageVariables:
      foo: "bar"

来自official documentation

【讨论】:

    【解决方案3】:

    我所做的是创建另一个具有其他服务所有功能的服务。下面是我的文件夹结构。

    main/
    ├── service1/
    │   ├── ...
    │   └── serverless.yml 
    ├── service2/
    │   ├── ...
    │   └── serverless.yml
    ├── serverless.yml # offline service with serverless-offline plugin
    ├── node_modules # 1 node_modules for every services
    └── ...
    

    您可以删除service1和service2上的serverless-offline插件。

    更新!

    我开发了一个用于生成离线 serverless.yml 的脚本。在此处查看示例:https://github.com/Necromancerx/serverless-offline-template

    【讨论】:

      【解决方案4】:

      查看此包:https://github.com/edis/sls-multi-gateways

      它在您的本地环境中模拟 AWS API 网关的 API 映射。

      它允许您在单个端口(在您的本地)下运行多个 API 网关,根据您配置的基本路径将请求转发到每个服务。

      例如,如果您有两个无服务器应用程序 - 一个用于身份验证,一个用于产品。您可以为每个无服务器应用程序分配不同的基本路径。因此,当您收到对 localhost:3000/auth/* 的请求时,它会将请求发送到 auth 无服务器应用程序。当您收到对 localhost:3000/products/* 的请求时,它会将请求发送到 products 无服务器应用程序。

      【讨论】:

        猜你喜欢
        • 2020-04-29
        • 1970-01-01
        • 1970-01-01
        • 2020-07-18
        • 1970-01-01
        • 2018-05-13
        • 2022-01-17
        • 2020-03-27
        • 2022-07-06
        相关资源
        最近更新 更多