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

3

我的问题与微服务和跨多个主机的服务发现相关。

设置如下:

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

假设我有两个服务:

  • 服务A
  • 服务B

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

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

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

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

  • 是否有更简单的方法处理这个问题,而不需要我开发客户端解析器(+LB)库?
  • 是否已经在其他地方实现了类似的功能?
  • 我做错了什么吗?
3个回答

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。本地实例意味着你不需要额外的来回路程到负载均衡器实例,然后到实际的服务实例,但这可能不是你所关心的问题。

0

我建议你去看看Kontena。它可以轻松解决这种问题。每个服务都有一个内部DNS,您可以在服务之间的通信中使用它。Kontena还内置了负载均衡器,非常易于使用,使创建和扩展微服务变得非常容易。

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

Kontena是一个开源项目,代码可以在Github上查看。


0

如果你想要一个最小化的设置,你可以通过ribbon将从Consul接收到的值进行包装,这是Netflix基于客户端的负载均衡器。

你会在Spring Cloud的模块中找到它。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接