无服务器离线:处理多个API网关

时间:2017-06-06 17:38:03

标签: serverless-framework serverless-architecture

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

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

4 个答案:

答案 0 :(得分:2)

如果您想在本地同时运行两个或更多无服务器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-localplugins来调用serverless.yaml删除 sls offline start --port 3001(没有必要)其他更改)然后您可以使用:ol { counter-reset: item } li { display: block } li:before { content: counters(item, ".") " "; counter-increment: item }启动服务。

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

答案 1 :(得分:2)

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

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插件。

答案 2 :(得分:1)

2021 年 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 :(得分:0)

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

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

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

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