微服务和随机端口服务发现
我的问题是关于在几个主机之间传播的服务的微服务和服务发现。
设置如下:
- 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.本地实例意味着你不支付额外的负载均衡实例往返实际服务实例,但这可能不是你的问题。