问题:docker中的服务发现不使用consul

我是 docker 和微服务的新手。我已经开始将我的网络应用程序分解为微服务,目前,我正在进行手动配置。

经过一番研究,我遇到了允许服务发现的 docker swarm 模式。此外,我还遇到了其他服务发现工具,例如 Eureka 和 Consul。

我的主要目标是用服务名称和同一服务的多个实例之间的负载平衡替换 curl 调用中的 IP 地址。

即对于前。 curlhttp://192.168.0.11:8080/to curlhttp://my-service

我必须保持我的服务语言独立。

请建议,我是否需要将 Consul 与 docker swarm 一起使用来进行服务发现,或者我可以在没有 Consul 的情况下做到这一点?有什么优势?

解答

借助新的“swarm 模式”,您可以使用 dockerservices创建跨多个 swarm 节点的集群服务。然后,您可以通过使用服务名称而不是请求中的节点名称来访问这些相同的服务,负载均衡。

这仅适用于 swarm 覆盖网络中的节点。如果您的客户端系统是同一个集群的一部分,那么发现应该开箱即用,无需任何外部解决方案。

另一方面,如果您希望能够从 swarm 之外的系统中发现服务,您有几个选择:

  • 对于无状态服务,您可以使用 docker 的路由网格,这将使服务端口在所有 swarm 节点上可用。这样你就可以指向 swarm 中的任何节点,docker 会将你的请求定向到运行服务的节点(不管你点击的节点是否有服务)。

  • 如果您需要控制路由或处理不同的状态,请在您的 swarm 服务前使用实际的负载均衡器。这可以是另一个使用--mode global选项启动的 docker 服务(即 haproxy、nginx),以确保它在所有节点上运行,或者是一个单独的负载均衡器,如 citrix netscaler。您需要让您的服务容器通过其启动脚本或配置工具(或手动添加它们)重新配置 LB。

  • 使用 consul 之类的东西进行外部服务发现。可能与注册器一起自动添加服务。在这种情况下,您只需将外部客户端配置为使用 consul 服务器/集群进行 DNS 解析(或使用 API)。

当然,您也可以将您的服务消费者移动到集群中。但是,如果您要将客户端与不同物理 VLAN(或 VPC 等)中的服务分开,则需要在单独的覆盖网络中启动客户端容器,以确保不会有效地破坏已经存在的任何物理网络隔离。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐