微服务&随机端口的服务发现

时间:2016-01-17 18:09:16

标签: docker microservices service-discovery consul

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

设置如下:

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

假设我有2项服务:

  • 服务A
  • 服务B

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

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

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

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

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

3 个答案:

答案 0 :(得分:0)

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

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

Kontena是一个开源项目,代码在Github

上可见

答案 1 :(得分:0)

如果您寻找最低限度的设置,您可以通过ribbon,Netflix'来包含从Consul收到的值。基于客户端的负载均衡器。

您会发现它是module for Spring Cloud.

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

答案 2 :(得分:0)

有几个选择:

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