docker 中的服务发现而不使用 consul
service discovery in docker without using consul
我是 docker 和微服务的新手。我已经开始将我的 Web 应用程序分解为微服务,目前,我正在进行手动配置。
经过一些研究,我遇到了 docker 允许服务发现的集群模式。此外,我还遇到了其他用于服务发现的工具,例如 Eureka 和 Consul。
我的主要目标是用服务名称替换 curl 调用中的 IP 地址,并在同一服务的多个实例之间进行负载平衡。
即例如。卷曲 http://192.168.0.11:8080/ to curl http://my-service
我必须保持我的服务语言独立。
请建议,我是否需要将 Consul 与 docker swarm 一起用于服务发现,或者我可以在没有 Consul 的情况下使用它?有什么优势?
有了新的 "swarm mode",您可以使用 docker services 跨多个 swarm 节点创建集群服务。然后,您可以通过在请求中使用服务名称而不是节点名称来访问这些相同的服务 load-balanced。
这仅适用于群覆盖网络中的节点。如果您的客户端系统是同一个群的一部分,那么发现应该可以工作 out-of-the-box,不需要任何外部解决方案。
另一方面,如果您希望能够从 swarm 外部的系统中发现服务,您有以下几种选择:
- 对于无状态服务,您可以使用 docker 的 routing mesh,这将使服务端口在所有 swarm 节点上可用。这样你就可以指向集群中的任何节点,docker 会将你的请求定向到一个节点,该节点是 运行 服务(无论你点击的节点是否有服务)。
- 如果您需要控制路由或处理不同的状态,请在您的群服务前面使用实际的负载均衡器。这可以是使用
--mode global
选项启动的另一个 docker 服务(即 haproxy、nginx),以确保它在所有节点上运行,或者是单独的 load-balancer,如 citrix netscaler。您需要让您的服务容器通过它们的启动脚本或通过配置工具(或手动添加)重新配置 LB。
- 使用 consul 之类的工具来发现外部服务。可能与 registrator 一起自动添加服务。在这种情况下,您只需将外部客户端配置为使用 consul server/cluster 进行 DNS 解析(或使用 API)。
您当然也可以将您的服务使用者也移到集群中。但是,如果您将客户端与不同物理 VLAN(或 VPC 等)中的服务分开,则需要在单独的覆盖网络中启动客户端容器,以确保您不会有效地破坏任何已经存在的物理网络隔离。
docker 自版本 1.12 起内置了服务发现(通过 dns)。当你创建一个自定义网络时(如果你有多个主机,比如桥接或覆盖)你可以简单地让容器通过名称相互通信,只要它们是同一网络的一部分。您还可以为每个容器设置一个别名,这将 round-robin 具有相同别名的容器列表。简单的例子见:
只要您为 docker 网络使用桥接模式并在该网络内创建容器,就可以开箱即用地使用服务发现。
一旦您的基础架构开始跨入多个服务器和分布在这些服务器上的微服务,您将需要从其他工具获得帮助。
Swarm 是一个很好的入门工具,但是,如果涉及到像亚马逊这样的任何 IaaS 提供商来处理我的生产负载,我会坚持使用 consul。
我是 docker 和微服务的新手。我已经开始将我的 Web 应用程序分解为微服务,目前,我正在进行手动配置。
经过一些研究,我遇到了 docker 允许服务发现的集群模式。此外,我还遇到了其他用于服务发现的工具,例如 Eureka 和 Consul。
我的主要目标是用服务名称替换 curl 调用中的 IP 地址,并在同一服务的多个实例之间进行负载平衡。
即例如。卷曲 http://192.168.0.11:8080/ to curl http://my-service
我必须保持我的服务语言独立。
请建议,我是否需要将 Consul 与 docker swarm 一起用于服务发现,或者我可以在没有 Consul 的情况下使用它?有什么优势?
有了新的 "swarm mode",您可以使用 docker services 跨多个 swarm 节点创建集群服务。然后,您可以通过在请求中使用服务名称而不是节点名称来访问这些相同的服务 load-balanced。
这仅适用于群覆盖网络中的节点。如果您的客户端系统是同一个群的一部分,那么发现应该可以工作 out-of-the-box,不需要任何外部解决方案。
另一方面,如果您希望能够从 swarm 外部的系统中发现服务,您有以下几种选择:
- 对于无状态服务,您可以使用 docker 的 routing mesh,这将使服务端口在所有 swarm 节点上可用。这样你就可以指向集群中的任何节点,docker 会将你的请求定向到一个节点,该节点是 运行 服务(无论你点击的节点是否有服务)。
- 如果您需要控制路由或处理不同的状态,请在您的群服务前面使用实际的负载均衡器。这可以是使用
--mode global
选项启动的另一个 docker 服务(即 haproxy、nginx),以确保它在所有节点上运行,或者是单独的 load-balancer,如 citrix netscaler。您需要让您的服务容器通过它们的启动脚本或通过配置工具(或手动添加)重新配置 LB。 - 使用 consul 之类的工具来发现外部服务。可能与 registrator 一起自动添加服务。在这种情况下,您只需将外部客户端配置为使用 consul server/cluster 进行 DNS 解析(或使用 API)。
您当然也可以将您的服务使用者也移到集群中。但是,如果您将客户端与不同物理 VLAN(或 VPC 等)中的服务分开,则需要在单独的覆盖网络中启动客户端容器,以确保您不会有效地破坏任何已经存在的物理网络隔离。
docker 自版本 1.12 起内置了服务发现(通过 dns)。当你创建一个自定义网络时(如果你有多个主机,比如桥接或覆盖)你可以简单地让容器通过名称相互通信,只要它们是同一网络的一部分。您还可以为每个容器设置一个别名,这将 round-robin 具有相同别名的容器列表。简单的例子见:
只要您为 docker 网络使用桥接模式并在该网络内创建容器,就可以开箱即用地使用服务发现。
一旦您的基础架构开始跨入多个服务器和分布在这些服务器上的微服务,您将需要从其他工具获得帮助。
Swarm 是一个很好的入门工具,但是,如果涉及到像亚马逊这样的任何 IaaS 提供商来处理我的生产负载,我会坚持使用 consul。