微服务和随机端口服务发现

我的问题是关于在几个主机之间传播的服务的微服务和服务发现。

设置如下:

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

假设我有两项服务:

  • 服务A
  • 服务B

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

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

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

它将得到10个ip:port对,为此客户端应该使用一些负载均衡逻辑。

  • 有没有一个更简单的方法来处理这个问题,而我没有为这个问题开发一个客户端parsing器(+ LB)库?
  • 有没有像已经实施的地方?
  • 我做错了吗?

我build议你去看看Kontena 。 它将立即解决这种问题。 每个服务都将有一个内部DNS,您可以在服务之间进行通信。 Kontena还内置负载均衡器 ,非常易于使用,因此非常容易创build和扩展微服务。

还有很多内置function可以帮助开发集装箱化的应用程序,如私人图像注册,VPN服务访问,秘密pipe理,有状态服务等。

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

如果您寻找最低限度的设置,您可以通过function区 (Netflix的基于客户端的负载平衡器)来包装从Consul收到的值。

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

我没有find一个最新的独立的例子,只有这个链接到在dropwizard上下文中使用它的chrisgray的dropwizard-consul实现 。 但它可能成为你的起点。

有几个选项:

  • 在客户端上进行负载平衡,您可能需要find一个可与SRVlogging协同工作的现成服务发现库,并处理负载平衡和断路。 另一个答案显示Netflix的function区 ,我没有使用过,只有在JVM上才有意思。 请注意,如果您正在构build自己的应用程序,则可能会发现使用Consul的HTTP API发现服务比DNS SRVlogging更简单。 这样,您就可以“观察”更改,而不是caching列表并让其过时。
  • 如果你不想重新发明特定的轮子,另一个stream行和简单的select是使用HAProxy实例作为负载平衡器。 您可以通过consul-template将其与领事整合,这将自动监视您的服务的新/失败实例并更新LBconfiguration。 然后,HAProxy通过很多选项(http / tcp,不同的平衡algorithm等)提供健壮的负载平衡和健康检查。 一个可能的设置是在每个docker主机上有一个本地HAProxy实例,并为每个逻辑服务静态分配一个固定端口(可以将其存储在Consul KV中),以便连接到localhost:1234 ,例如服务A和localhost:2345服务B.本地实例意味着你不支付额外的负载均衡实例往返实际服务实例,但这可能不是你的问题。