在不使用领事的情况下在docker工人中发现服务

我是新来的docker和微服务。 我已经开始将我的networking应用程序分解成微服务,目前我正在进行手动configuration。

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

我的主要目标是用服务名称replacecurl调用中的IP地址,并在同一服务的多个实例之间进行负载平衡。

即前例。 curl http://192.168.0.11:8080/来curlhttp:// my-service

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

请build议,我需要使用领事与docker群进行服务发现,或者我可以做没有领事? 有什么优势?

使用新的“群集模式”,您可以使用docker服务在多个群集节点间创build群集服务。 然后,您可以使用服务名称而不是请求中的节点名称来访问那些相同的服务,并进行负载平衡。

这只适用于群体覆盖networking中的节点。 如果你的客户端系统是同一个群体的一部分,那么发现应该是不需要任何外部解决scheme的开箱即用的。

另一方面,如果你想能够发现群外系统的服务,你有几个select:

  • 对于无状态服务,您可以使用docker的路由网格 ,这将使所有群集节点上的服务端口可用。 这样你就可以指向swarm中的任何一个节点,docker会把你的请求指向正在运行服务的节点(不pipe你打的节点是否有服务)。
  • 如果您需要控制路由或处理不同的状态,请在群集服务前使用实际的负载均衡器。 这可能是使用–mode --mode global选项启动的另一个docker服务(即haproxy,nginx),以确保它在所有节点上运行,或者是像citrix netscaler这样的单独负载平衡器。 您需要让服务容器通过启动脚本或configuration工具重新configurationLB(或手动添加它们)。
  • 使用像领事一样的外部服务发现。 可能与注册者一起自动添加服务。 在这种情况下,您只需configuration您的外部客户端使用领事服务器/群集进行DNSparsing(或使用API​​)。

你当然可以把你的服务消费者也移到群中。 如果您将客户端与不同物理VLAN(或VPC等)中的服务分开,则需要在不同的覆盖networking中启动客户端容器,以确保不会有效地打破已有的物理networking隔离。

从版本1.12开始,Docker内置了服务发现(通过dns)。 当你创build一个自定义的networking时(如果你有多个主机的话,你可以简单的让这些容器相互通信),只要它们是同一个networking的一部分即可。 你也可以为每个容器设置一个别名,这个容器可以对具有相同别名的容器列表进行循环。 举个简单的例子看:

https://linuxctl.com/docker-networking-options-bridge

只要您在Dockernetworking中使用桥接模式并在该networking内创build容器,就可以立即使用服务发现function。

一旦您的基础架构开始跨越分布在其上的多个服务器和微服务,您将需要从其他工具获得帮助。

Swarm是一个很好的开始的工具,但是,如果涉及任何像亚马逊这样的IaaS提供商来支持我的生产负载,我想坚持执行。