我们在 Azure VM 上托管了一个 API 微服务基础架构。每个 VM 将托管多个 API,这些 API 是在 Kestrel 上运行的独立站点。所有外部流量都通过 RP(在 IIS 上运行)进入。
我们有一些设计用于接受外部请求的 API,还有一些只是内部 API。
内部 API 托管在规模集上,每个规模集 VM 都是托管所有内部 API 的副本。规模集前面有一个内部负载均衡器 (ILB)/vip。根本问题是我们有内部 API 调用托管在同一规模集上的其他内部 API。理想情况下,这些调用将转到 VIP(使用内部 DNS),而 VIP 将路由到规模集中的一台机器。但看起来 Azure 不允许这样做……根据文档:
You cannot access the ILB VIP from the same Virtual Machines that are being load-balanced
那么人们如何使用微服务进行设置呢?我可以看到三种方式,但都不是理想的:
- 将 API 分离到不同的规模集。不理想,因为服务非常轻量级,我不想将 Azure VM 费用增加三倍。
- 将内部 LB 转换为外部 LB(添加公网 IP 地址)。然后将该 LB 放入它自己的网络安全组/子网中,以仅允许来自我们的 Azure IP 范围的调用。我希望这里有更多的延迟,并且以任何方式将端点暴露在外部会产生更多的攻击面以及更多的配置复杂性。
- 如果需要调用 ILB,请将 VM 设置为环回……这意味着源自 VM 的任何请求都将由同一 VM 处理。这违背了 VIP 背后的微服务的目的。内部微服务可能由于某种原因在同一台机器上关闭,而在另一台机器上可用……这就是我们在 ILB 上分别为每个服务设置健康探测的原因。如果它只是回到同一台机器上,你就会失去弹性。
任何有关其他人如何解决此问题的指示将不胜感激。
谢谢!