-1

我已经按照这篇文章配置了我的后端: 如何使用 Serverless 在一个 API 域下部署多个微服务

我了解使用无服务器离线插件可以一项一项地部署服务。但是该插件在不同的端口上创建了多个 mini-APIGateways。

我的前端不知道。它假定一切都已部署并准备好在一个端口上使用。

如果我想测试一个需要有效会话的功能,我无法在本地执行此操作,因为我的会话和功能由 2 个不同的服务管理。

只有在我部署了所有更改后,才能在这种情况下进行任何手动测试。这需要很多时间。

有没有办法在单个 API 网关后面的同一个端口上部署所有服务?

4

2 回答 2

1

sls-multi-gateways软件包运行多个 API 网关。如果你有多个服务并且想要同时在本地运行,你可以添加包。但这不是一个完整的解决方案,因为最终您可能希望后端可以在单个主机上访问。

这意味着您正在添加一个依赖项,它会让您半途而废。

当您尝试在没有此软件包的情况下在本地运行多个网关时,您会收到错误消息,指出端口 3002 已被使用。这是因为serverless offline插件将 3002 分配为 lambda 函数的默认端口。

由于我们试图运行多个服务,第一个服务将占用 3002,其余的将无法启动。要解决此问题,您必须通过在 serverless.yml 文件中为您的服务指定 lambdaPortserverless offline来告诉它应该使用哪些端口来为每个服务部署 lambda 函数。这可以像这样完成:

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}.`);
});

于 2021-08-27T12:38:31.617 回答
1

我不能说我完全理解这个问题,但我会试一试。我假设您的意思是单个“微服务”是具有自己子域的单独 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 自己设置代理,将请求转发到基于主机名或路径在不同端口上运行的服务。

于 2021-08-27T09:46:16.200 回答