我在 docker swarm 容器中拥有一组多个 Web 应用程序。其中一些只有一个实例,一些有多个实例,并且这种情况可能会根据我们的需求动态变化(应用程序服务于不同的目的)。我还有一个基于 nginx 的单一外观,我想在所有这些实例上组织一个循环。它的配置如下:
upstream all {
server a;
server b;
server c;
}
server {
listen 80;
location /all/ {
proxy_pass http://all/
}
}
例如,服务 a 和 c 各有一个实例,而服务 b 有 2 个实例(2 个容器)。如果我开始访问 http://host/all/,循环顺序如下:a、b(1)、c、a、b(2)、c,等等。我希望改为:a、b(1)、b(2)、c,等等。这样,我只有在获得所有其他服务的所有实例后才能返回 a。而且,如果我们想将 a 升级为拥有 3 个实例,那么顺序应该变成 a(1)、a(2)、a(3)、b(1)、b(2)、c - 然后返回 a(1),等等。
有可能吗?如何实现?
PS。如果您想知道我为什么需要这个:每个服务都有一个统一的端点,可返回健康和状态信息,我想构建一个仪表板,可覆盖所有服务的所有实例并显示单个状态页面“谁在做什么”。 PPS。我的备用计划是继续调用 API 并计算实例,直到所有计数器停止增长。但这意味着,如果存在显着的不平衡(例如所有实例都有 1 个,而一个实例只有 50 个),许多服务将不得不重复回答很多次。
答案1
您可以使用服务器重量对于服务器来说,但是每次计数发生变化时都应该在 nginx 端进行更新。
请注意,在您的场景中,如果您设置了权重,则默认情况下循环按请求进行
upstream all {
server a;
server b weight=2;
server c;
}
并且其他人在您的查询循环期间访问服务器,它会“窃取”您的位置,并且您会跳过所需的服务器