【问题标题】:microservices & service discovery with random ports带有随机端口的微服务和服务发现
【发布时间】:2016-04-22 20:38:52
【问题描述】:

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

设置如下:

  • 2 台 docker 主机(主机 A 和主机 B)
  • Consul 服务器(服务发现)

假设我有 2 个服务:

  • 服务 A
  • 服务 B

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

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

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

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

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

【问题讨论】:

    标签: docker microservices service-discovery consul


    【解决方案1】:

    有几个选项:

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

    【讨论】:

      【解决方案2】:

      我建议您查看Kontena。它将开箱即用地解决此类问题。每个服务都有一个内部 DNS,您可以在服务之间进行通信。 Kontena 还内置了load balancer,它非常易于使用,可以非常轻松地创建和扩展微服务。

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

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

      【讨论】:

        【解决方案3】:

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

        你会发现它是module for Spring Cloud.

        我没有找到最新的独立示例,只有指向 chrisgray's dropwizard-consul implementation 的链接在 Dropwizard 上下文中使用它。但它可能会成为您的起点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-16
          • 2017-07-17
          • 2020-09-27
          • 1970-01-01
          • 2019-04-28
          • 1970-01-01
          • 2021-11-03
          • 2021-07-31
          相关资源
          最近更新 更多