0

如何在 ALB 背后的几个服务之间命名健康检查路由?

我正在将我的 API 和数据库移动到 AWS。在搬家之前,我将我的单体 REST API 拆分为四个服务:

  1. 公共 API(应用程序和网站连接到的 API)
  2. 管理 API(用于管理网站)
  3. 消息传递 API(用于与应用程序实时通信的 Web 套接字服务器)
  4. 工人(基于队列的任务处理器)

我现在正试图找出路线的良好组织。起初创建了两个子域,api.mydomain.com 和 www.mydomain.com。

我将 api 子域定向到我的 ALB,它仅根据路径路由流量,如下所示:

  • “/sockets”-> 消息传递 API
  • “/管理员”-> 管理员 API
  • “/” -> 公共 API

现在我正在尝试实施健康检查路线。我想将它们命名为“/health”。但健康检查需要针对每个目标群体。由于 ALB 仅基于路径进行路由,因此我不能在多个服务器上拥有 /health。

可能的解决方案:

1.通过子域分离服务

我可以为每个服务创建一个子域,例如: - api.mydomain.com - sockets.mydomain.com - admin.mydomain.com

有了这个设置,我可以在每个服务中都有一个 /health 而不会发生冲突。

2.通过命名分隔健康检查路由

我可以为每个服务命名不同的健康检查路由,例如:

  • api.mydomain.com/health-public-api
  • api.mydomain.com/health-messaging-api
  • api.mydomain.com/health-admin-api

建议?

上述两种解决方案似乎都是可行的,但我想知道其中一个解决方案是否会在稍后咬我,例如添加更多服务时,或者我稍后添加 graphQL API 时。

编辑:

我只是遇到了解决方案 #1 的一个缺点。我的本地 dev-enviromnemt 设置了每个服务 的docker映像和用于路由请求的nginx 。最重要的是,我使用ngrok能够从 Internet 访问开发环境。

我认为很难解决基于子域的服务分离,但我真的不需要开发环境中的 /health 路由,所以我想我可以假装它们不存在。

4

1 回答 1

0

将我自己的问题作为文档回答,并可能向其他人提供一些输入。

tl;dr:我选择了第三个选项,通过路径中的第一级分隔所有服务。与我之前的结构的主要区别在于我的主要 api(又名 public-api)已从根移动到名为/app的子路径。我还将它重命名为app-api

  • api.mydomain.com/应用程序/..
  • api.mydomain.com/admin/ .. _
  • api.mydomain.com/sockets/ .. _
  • api.mydomain.com/auth/ .. _
  • www.mydomain.com/..

这个解决方案给了我几个优点,没有缺点(我认为)。

优点:

  • 通过 nginx 在 ALB 和本地开发环境中轻松路由请求,无需 SNI 所需的额外工作
  • 子域非常清楚地将 api 与网站分开
  • /health 路由默认获得唯一名称,因为它们位于不同的路径下。
  • 应用程序(网络和智能手机)可以使用一个通用的 api url (api.mydomain.com/) 并且仍然可以访问所有服务,即它们不需要存储几个不同初始化的 Axios 连接。没什么大不了的,但仍然..

我还选择让 /health 更加面向未来,并在每项服务中对以下结构进行标准化。

  • api.mydomain.com/servicename/health
  • api.mydomain.com/servicename/health/is-up
  • api.mydomain.com/servicename/health/is-ready

up = 响应请求,准备好= 所有依赖项都已连接(即数据库等)

  • /health返回状态 200 以及描述准备情况的 json 对象。

  • /health/is-up响应 200 或什么都没有(即根本无法访问)

  • /health/is-ready如果所有依赖项都准备好了,则返回 200,否则返回 500。

AWS 中的目标群体将使用 /is-ready 进行健康检查,但现在它与 /is-up 相同,因为我还没有实施准备情况测试。

于 2018-06-09T11:11:00.127 回答