从 NodeJS 服务器发现 MongoDB 服务器 IP

Discovery of MongoDB Server IP from NodeJS Server

我在 DigitalOcean 的云计算上有一个 MongoDB 运行 实例。我在另一个云计算上有我的 Node(Express) 应用程序 运行 的另一个实例。有没有一种方法可以发现数据库的 IP,这样我就不必将其硬编码到我的应用程序中,因此可以更轻松地扩展?我知道您可以将实例连接到负载均衡器并对其进行硬编码,但这并不理想并且不会在所有情况下都有效,因为每次环境变化时都必须重新配置它。我宁愿不必制作访问 DigitalOcean API 的东西,因为它是特定于平台的,尽管我正在考虑它。我问的原因是我想尽可能地自动化配置,这样我就不必每次 create/destroy 个实例都进行大量配置。我使用的是静态 IP,因此更改 IP 不会有问题。我正在研究 consul 等服务发现系统,我可能会转向类似的东西,但我认为它(consul)对我的应用程序来说似乎有点过分,尽管我正在考虑它。

发现网络资源当前 IP 的常规方法是使用 DNS 主机名。这不需要安装任何其他服务,只要主机名可解析,就可以使用 public 或私有 IP。有可用的低成本域名(每年几美元),其中还包括将域主机名(例如 db.yourdomain.xyz)别名到您的 Digital Ocean 主机名或 IP 的服务。推荐提供商不在 Stack Overflow 的范围之内,但有很多。要比较的一方面是续订价格,它通常比初始注册高很多。

如果您最终将 MongoDB 部署从独立部署升级到副本集,MongoDB 3.6+ 支持 DNS-based discovery format (SRV lookups),它允许您更改副本集中的主机而无需重新配置客户端。

负载平衡器和服务发现系统对于管理单个服务器来说是多余的,但最终它们也会通过 DNS 公开资源。例如,参见 Consul's DNS interface (which also includes SRV lookups 类似于 MongoDB 的 DNS-based 发现格式)。您还可以通过向 Consul API 发出 HTTP 请求来执行服务发现,但这是一个更复杂的集成路径。

您可以使用环境变量来避免将值硬编码到您的代码中。当应用程序以 dotenv.

之类的包启动时,可以从进程环境加载这些值