如何为微服务设置Azure负载平衡?

时间:2016-07-22 16:18:33

标签: azure azure-virtual-network azure-vm-scale-set

我们在Azure VM上托管了一个API微服务基础架构。每个VM将托管多个API,这些API是在Kestrel上运行的独立站点。所有外部流量都通过RP(在IIS上运行)进入。

我们有一些API用于接受外部请求,而另一些API仅用于内部API。

内部API托管在scaleset上,每个scaleset VM都是托管所有内部API的副本。在scaleset前面有一个内部负载平衡器(ILB)/ vip。根本问题是我们有内部API调用托管在同一scaleset上的其他内部API。理想情况下,这些呼叫将转到VIP(使用内部DNS),VIP将路由到scaleset中的一台机器。但看起来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处理。这违背了微服务的目的 贵宾背后。内部微服务也可能相同 机器由于某种原因而在另一个机器上可用...这就是原因 我们分别在ILB上为每个服务设置健康探测器。如果 它只是回到同一台机器,你就失去了弹性。
  4. 关于其他人如何接近这一点的任何指示都将受到赞赏。

    谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

另请参阅客户端负载平衡工具,例如Ribbon

答案 1 :(得分:0)

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

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

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