Luk*_*101 5 docker docker-swarm docker-swarm-mode
假设有一个具有 5 个副本的 docker 服务。我想对所有 5 个副本进行休息调用。如果任何副本失败,整个请求就会失败。我想这样做是因为有时容器内的代码停止运行并且不响应其余调用。可以对服务进行一次休息调用,如果任何容器无法返回响应,则整个请求都会失败
为了供将来参考,对于新查看者,从 Compose 文件版本 3.3 开始,服务deploy现在支持“ endpoint_mode ”选项。现在也可以使用选项“dnsrr”,而不是默认的“vip”(虚拟 IP/代理负载均衡器):
DNS 循环 (DNSRR) 服务发现不使用单个虚拟 IP。Docker 为服务设置 DNS 条目,以便对服务名称的 DNS 查询返回 IP 地址列表,并且客户端直接连接到其中之一。当您想要使用自己的负载均衡器或混合 Windows 和 Linux 应用程序时,DNS 循环非常有用。
这意味着您的服务(在网络内)上的“nslookup”/“dig +short”/等命令现在将解析为容器 IP 列表,而不是它们前面的代理负载均衡器。
nslookup <yourservice> | awk '/^Address: / { print $2 }' | xargs | sed -e 's/ /,/g'
Run Code Online (Sandbox Code Playgroud)
可用于以逗号分隔的 IP 地址字符串。Java 的替代方案:
Arrays.asList(java.net.InetAddress.getAllByName(<yourservice>));
Run Code Online (Sandbox Code Playgroud)
您可以相应地调整应用程序的代码。
基于此,您可以实现自己的等待每个容器响应的行为,以及如何处理并非所有容器都在指定时间内回复等情况。
为了兼容compose 文件版本 3.3+ ,docker 引擎版本应为 17.06.0+。
另一种办法是解决tasks.<service-name>。更多信息可以在此服务发现问题中找到。
小智 1
Docker 的负载均衡器将您的请求代理到五个任务之一。这就是它的目的。如果您想向服务发送消息并收集所有任务的结果,您将必须自己实现。您可以在应用程序中放置一个代理或实现一些集群消息分发。
根据您的情况,请查看 docker healthchecks。您定义一个定期在容器内运行的命令,如果失败,docker 会认为您的容器不健康并杀死它。您需要编写一个简短的脚本来发送 REST 调用并在失败时返回非零退出代码。
| 归档时间: |
|
| 查看次数: |
2045 次 |
| 最近记录: |