服务发现与负载均衡

Service discovery vs load balancing

我想了解在哪种情况下我应该选择服务注册表而不是负载均衡器。

据我了解,这两种解决方案都涵盖了相同的功能。

例如,如果我们将 consul.io 视为一个特征列表,我们有:

例如 Amazon ELB 等负载均衡器具有:

所以在这种情况下,我无法理解为什么我会选择 consul.ionetflix eureka 而不是 Amazon ELB 来进行服务发现。

我有一种预感,这可能是由于实施 客户端服务发现 服务器端服务发现 ,但我不是很确定。

服务发现组件通常有一个通知组件。它不是负载平衡器,尽管有些人可能有能力这样做。它可以通知注册客户端有关更改,例如负载均衡器关闭。

客户端可以查询服务 discovery/registry 以获得 运行 的负载均衡器。而负载均衡器在关闭时不会通知客户端。

您应该将其视为客户端负载平衡与专用负载平衡。

客户端负载均衡器包括贝克街 (http://bakerstreet.io); SmartStack (http://nerds.airbnb.com/smartstack-service-discovery-cloud/); or Consul HA Proxy (https://hashicorp.com/blog/haproxy-with-consul.html)。

客户端 LB 使用服务发现组件(Baker Street 使用无状态 pub/sub 服务发现机制;SmartStack 使用 ZooKeeper;Consul HA Proxy 使用 Consul)作为其实现的一部分,但它们提供健康检查/ 您可能正在寻找的端到端功能。

您还应该了解 EUREKA


Amazon ELB 基于负载均衡器为您的服务请求提供 EC2 实例,并且 EC2 实例的 IP 地址不一致,因此您也可以使用 EUREKA,它做同样的工作,但基于服务注册和客户端负载均衡,其中每个区域的应用程序客户端都有注册表。 你可以在这里读更多关于它的内容 : https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance

AWS ELB 和 Eureka 在很多方面不同:

边缘服务与中间层服务
AWS ELB 是面向最终用户 Web 流量的边缘服务的负载均衡解决方案。 Eureka 满足了中间层负载均衡的需求。
中间层服务器是指位于用户机器和处理发生的数据库服务器之间的应用程序服务器。中间层服务器执行业务逻辑。
虽然理论上您可以将中间层服务置于 AWS ELB 之后,但在 EC2 中 经典的做法是将它们暴露给外界,从而失去 AWS 安全组的所有用处。

专用与客户端负载平衡
AWS ELB 也是一种传统的基于代理的负载均衡解决方案,而 Eureka 的不同之处在于负载均衡以循环方式发生在 instance/server/host 级别。客户端实例知道有关它们需要与哪些服务器通信的所有信息。
如果您正在寻找 AWS 现在提供的基于负载平衡的粘性用户会话(会话期间来自用户的所有请求都发送到同一实例),Eureka 不提供开箱即用的解决方案。

负载平衡器中断
将基于代理的负载平衡与使用 Eureka 的负载平衡区分开来的另一个重要方面是,您的应用程序可以对负载平衡器的中断具有弹性,因为有关可用服务器的信息缓存在 Eureka 客户端上。
这确实需要少量内存,但可以获得更好的弹性。 Eureka 客户端一次获取所有注册表信息,在后续对 Eureka 服务器的请求中,它只接收增量,即注册表信息的变化,而不是整个注册表信息。此外,Eureka 服务器可以在集群模式下运行,其中每个对等点都不会受到其他对等点性能的影响。

规模和便利性
另外,想象一下,1000 个微服务 运行,每个微服务都有多个实例。您将需要 1000 个 ELB,每个微服务一个,或者像位于 ELB 后面的 HAProxy 一样根据主机名等做出第 7 层决策,然后将流量转发到实例子集。使用 Eureka 时,您只需使用应用程序名称,它远没有那么复杂。