6

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

我应该serverless offline为每项服务运行,并在每个服务中配置不同的端口.yml吗?
并将该端口硬编码在环境变量中,以便我可以访问该端口(如果process.env.offline为真)?

4

4 回答 4

5

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

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

sls offline start --port 3001

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

sls offline start --port 3002

这样,您将有两个服务在两个端口上侦听(在此示例中http://localhost:3001http://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您从中删除 (不需要任何其他更改),然后您可以使用以下命令启动该服务:。serverless-dynamodb-localpluginsserverless.yamlsls offline start --port 3001

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

于 2017-10-13T11:38:46.370 回答
5

2022 年已接受答案的更新

根据文档--port不再可用--httpPort,例如下面的代码

sls offline --httpPort 3001

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

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

来自官方文档

于 2021-03-24T06:24:25.610 回答
4

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

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

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

更新!

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

于 2018-08-01T07:33:41.570 回答
0

检查这个包:https ://github.com/edis/sls-multi-gateways

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

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

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

于 2021-06-12T14:33:35.110 回答