使用随机端口的微服务和服务发现



我的问题与微服务和服务发现有关,该服务分布在多个主机之间。

设置如下:

  • 2 个 docker 主机(主机 A 和主机 B)
  • 领事服务器(服务发现)

假设我有 2 项服务:

  • 服务 A
  • 服务 B
服务 B 部署

10 次(使用随机端口):主机 A 部署 5 次,主机 B 部署 5 次。

例如,当服务 A 与服务 B 通信时,它会向 serviceB.example.com 发送请求(硬编码)。

为了获取 IP 和端口,服务 A 应向 Consul 服务器查询 SRV 记录。

它将获得 10 个 ip:port 对,客户端应为其应用一些负载平衡逻辑。

  • 有没有更简单的方法来解决这个问题,而无需为此开发客户端解析程序 (+LB) 库?
  • 有没有已经在某处实施过类似的东西?
  • 我做错了吗?

有几个选项:

    按照
  • 您的建议在客户端上进行负载平衡,为此,您需要找到一个现成的服务发现库,该库使用 SRV 记录并处理负载平衡和断路。另一个答案建议使用Netflix的功能区,我没有使用过,只有在您使用JVM时才会很有趣。请注意,如果您正在构建自己的服务,您可能会发现仅使用 Consul 的 HTTP API 来发现服务比使用 DNS SRV 记录更简单。这样,您也可以"监视"更改,而不是缓存列表并让它过时。
  • 如果您不想重新发明该特定轮子,另一个流行且简单的选择是使用 HAProxy 实例作为负载均衡器。您可以通过 consul-template 将其与 consul 集成,该模板将自动监视服务的新/失败实例并更新 LB 配置。然后,HAProxy提供了强大的负载平衡和健康检查,并提供了许多选项(http/tcp,不同的平衡算法等)。一种可能的设置是在每个 docker 主机上有一个本地 HAProxy 实例,并静态地为每个逻辑服务分配一个固定端口(可以将其存储在 Consul KV 中),以便您连接到服务 A 的localhost:1234localhost:2345服务B.本地实例意味着您无需为到负载均衡器实例和实际服务实例的额外往返费用付费,但这对您来说可能不是问题。

我建议你看看Kontena。它将开箱即用地解决此类问题。每个服务都有一个内部 DNS,您可以在服务之间的通信中使用。Kontena还内置了非常易于使用的负载均衡器,因此可以轻松创建和扩展微服务。

还有很多内置功能可以帮助开发容器化应用程序,例如私有映像注册表、对正在运行的服务的 VPN 访问、机密管理、有状态服务等。

Kontena是开源项目,代码在Github上可见

如果您寻找最小的设置,您可以通过 Netflix 基于客户端的负载均衡器功能区包装从 Consul 收到的值。

你会发现它是Spring Cloud的一个模块。

我没有找到最新的独立示例,只有这个链接到 chrisgray 的 dropwizard-consul 实现,该实现在 Dropwizard 上下文中使用它。但它可以作为您的起点。

最新更新