我按照本文配置了我的后端:如何使用Serverless在一个API域中部署多个微服务
我明白使用无服务器离线插件可以逐一部署服务。但是这个插件会在不同的端口上创建多个迷你apigateways。
我的前端不知道。它假设一切都已部署,并准备在一个端口上使用。
如果我想测试一个需要有效会话的功能,我不能在本地这样做,因为我的会话和功能由两个不同的服务管理。
在这种情况下,任何手动测试只有在我部署了所有更改后才有可能。这需要很多时间。
是否有一种方法可以将所有服务部署在同一个端口上,在单个API网关后面?
我不能说我完全理解这个问题,但我会试一试。我假设你的意思是单个"微服务"是一个独立的API,它有自己的子域(例如service1.yourdomain.com, service2.yourdomain.com等)。然后尝试在您的机器上使用无服务器脱机进行本地测试。
虽然我不知道这将如何在子域级别工作,但似乎有一个基于路径的选项。正如这里提到的,还有一个插件可以在内部根据路径路由请求。它似乎基本上把一个代理放在其他api的前面,并转发到正确的端口https://github.com/edis/sls-multi-gateways。完整的媒体文章在这里:https://aws.plainenglish.io/run-multiple-serverless-applications-d8b38ef04f37.
话虽如此,使用docker将请求转发到基于主机名或路径的不同端口上运行的服务,总是可以自己设置代理的。
sls-multi-gateways
包运行多个API网关。如果您有多个服务,并且希望同时在本地运行多个服务,则可以添加该包。但这不是一个完整的解决方案,因为最终您可能希望后端可以在单个主机上访问。
这意味着你正在添加一个依赖项,它让你完成了一半。
当您尝试在没有此包的情况下在本地运行多个网关时,您会得到一个错误,指出端口3002已被使用。这是因为serverless offline
插件将3002指定为lambda函数的默认端口。
由于我们正在尝试运行多个服务,第一个服务将占用3002,其余服务将无法启动。要解决这个问题,您必须通过在serverless中指定lambdapport来告诉serverless offline
,它应该使用哪些端口来为每个服务部署lambda函数。您的服务的Yml文件。可以这样做:
custom:
serverless-offline:
httpPort: 4001 // this is the port on which the service will run
lambdaPort: 4100 // this is the port which will be assigned to the first lambda function in the service
因此,对于每个服务,端口将是400n
, lambda端口将是4n00
如果服务中lambda函数少于100个,则此模式是安全的。看起来您只需要分配一个端口来支持手动lambda调用。
现在您可以使用concurrently
并行运行所有服务。我们现在在sls-multi-gateways
的位置。
接下来我们需要的是一个代理。我使用createHttpProxy
中间件和express
。但是你可以根据你的项目设置。
const express = require("express");
const {
createProxyMiddleware,
} = require("http-proxy-middleware");
const port = process.env.PORT || 5000; // the port on which you want to access the backend
const app = express();
app.use(
`/service2`,
createProxyMiddleware({
target: `${urlOfService2}`,
})
);
app.use(
`/service1`,
createProxyMiddleware({
target: `${urlOfService1}`,
})
);
app.listen(port, () => {
console.log(`Proxy service up on ${port}.`);
});