2

我们在 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

那么人们如何使用微服务进行设置呢?我可以看到三种方式,但都不是理想的:

  1. 将 API 分离到不同的规模集。不理想,因为服务非常轻量级,我不想将 Azure VM 费用增加三倍。
  2. 将内部 LB 转换为外部 LB(添加公网 IP 地址)。然后将该 LB 放入它自己的网络安全组/子网中,以仅允许来自我们的 Azure IP 范围的调用。我希望这里有更多的延迟,并且以任何方式将端点暴露在外部会产生更多的攻击面以及更多的配置复杂性。
  3. 如果需要调用 ILB,请将 VM 设置为环回……这意味着源自 VM 的任何请求都将由同一 VM 处理。这违背了 VIP 背后的微服务的目的。内部微服务可能由于某种原因在同一台机器上关闭,而在另一台机器上可用……这就是我们在 ILB 上分别为每个服务设置健康探测的原因。如果它只是回到同一台机器上,你就会失去弹性。

任何有关其他人如何解决此问题的指示将不胜感激。

谢谢!

4

2 回答 2

0

我认为您的问题与服务发现有关。

负载均衡器显然不是为此而设计的。您应该考虑使用专用软件,例如Eureka(可以在 AWS 之外运行)。服务发现使您的微服务在被发现后直接相互调用。

还可以看看Ribbon等客户端负载平衡工具。

于 2016-07-27T14:58:28.277 回答
0

@Cdelmas 的回答在服务发现方面很棒。请允许我添加我的想法:

对于像您这样的服务,您还可以查看 Netflix 的 ZUUL 代理服务器和客户端负载平衡。你甚至可以在 Eureka 之上使用 Histrix 来实现延迟和容错。Netflix 在这方面遥遥领先。

如果你想使用 GO 语言,你也可以查看 Consul.io 产品。它具有可编写脚本的配置,可以更好地管理您的服务,允许高级安全配置和非休息端点的使用。Eureka 也可以做到这些,但需要您添加配置服务器(Netflix Archaius、Apache Zookeeper、Spring Cloud Config)、编码安全性并支持使用 ZUUL/Sidecar 的访问。

于 2016-08-02T13:19:13.983 回答