当您只有一个时,您可以使用无服务器框架和无服务器离线插件轻松调试您的无服务器应用程序,但是当您有多个 API 网关/服务时,您如何处理这种情况?
我应该serverless offline
为每项服务运行,并在每个服务中配置不同的端口.yml
吗?
并将该端口硬编码在环境变量中,以便我可以访问该端口(如果process.env.offline
为真)?
当您只有一个时,您可以使用无服务器框架和无服务器离线插件轻松调试您的无服务器应用程序,但是当您有多个 API 网关/服务时,您如何处理这种情况?
我应该serverless offline
为每项服务运行,并在每个服务中配置不同的端口.yml
吗?
并将该端口硬编码在环境变量中,以便我可以访问该端口(如果process.env.offline
为真)?
如果您想在本地同时运行两个或多个无服务器 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
第一个服务将启动 DynamoDB,第二个服务将能够使用它。
我所做的是创建另一个具有其他服务所有功能的服务。下面是我的文件夹结构。
main/
├── service1/
│ ├── ...
│ └── serverless.yml
├── service2/
│ ├── ...
│ └── serverless.yml
├── serverless.yml # offline service with serverless-offline plugin
├── node_modules # 1 node_modules for every services
└── ...
您可以删除serverless-offline
service1 和 service2 上的插件。
更新!
我开发了一个用于生成离线 serverless.yml 的脚本。在此处查看示例:https ://github.com/Necromancerx/serverless-offline-template
检查这个包:https ://github.com/edis/sls-multi-gateways
它在您的本地环境中模拟 AWS API Gateways 的 API 映射。
它允许您在单个端口(在本地)下运行多个 API 网关,根据您配置的基本路径将请求转发到每个服务。
例如,如果您有两个无服务器应用程序——一个用于身份验证,一个用于产品。您可以为每个无服务器应用程序分配不同的基本路径。因此,当您收到对 localhost:3000/auth/* 的请求时,它会将请求发送到 auth 无服务器应用程序。当您收到对 localhost:3000/products/* 的请求时,它会将请求发送到产品无服务器应用程序。