当您只有一个无服务器框架和无服务器离线插件时,您可以轻松地调试无服务器应用程序,但是当您有多个API网关/服务时,如何处理这种情况?
我应该为每项服务运行serverless offline
,并在每个.yml
中配置不同的端口吗?
并在环境变量中对该端口进行硬编码,以便process.env.offline
为真时我可以访问该端口吗?
答案 0 :(得分:2)
如果您想在本地同时运行两个或更多无服务器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
serverless-dynamodb-local
中plugins
来调用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)
根据documentation,--port
不再可用
改用 --httpPort
,如下面的代码
sls offline --httpPort 3001
或任何 CLI 选项都可以添加到您的 serverless.yml。例如:
custom:
serverless-offline:
httpsProtocol: "dev-certs"
httpPort: 4000
stageVariables:
foo: "bar"
答案 3 :(得分:0)
看看这个包:https://github.com/edis/sls-multi-gateways
它在您的本地环境中模拟 AWS API Gateways 的 API 映射。
它允许您在单个端口(在您的本地)下运行多个 API 网关,根据您配置的基本路径将请求转发到每个服务。
例如,如果您有两个无服务器应用——一个用于身份验证,另一个用于产品。您可以为每个无服务器应用程序分配不同的基本路径。因此,当您收到对 localhost:3000/auth/* 的请求时,它会将请求发送到 auth 无服务器应用程序。当您收到对 localhost:3000/products/* 的请求时,它会将请求发送到 products 无服务器应用程序。