0%

Eureka简介

Eureka简介

Eureka是什么?

Eureka是一个基于REST(Representational State Transfer:表述性状态转移)的服务,主要用于对部署在AWS云环境中的服务进行定位、负载均衡和故障转移的中间层服务。我们称这个服务为Eureke Server。Eureka同时提供JAVA客户端组件,Eureka Client,使与eureka服务交互变得更容易。客户端同样内置了基于循环策略(round-robin)的负载均衡。在Netflix,一个更为复杂的负载均衡器封装了Eureka,以提供基于流量,资源使用,错误条件等因子为加权的负载均衡,以提供优越的弹性。

为什么需要Eureka?

在AWS中,由于固有的性质,服务器间交互的负载均衡并不像传统的物理服务器之间那样通过已知的IP地址和主机名,在AWS中,负载均衡需要更为复杂的服务注册和服务发现。由于AWS并没有提供中间层负载均衡,Eureka填补可这一巨大空白。

Eureka和AWS ELB之间有什么区别?

AWS ELB是为终端用户网络流量提供的边缘服务负载均衡解决方案(ELB像通常使用nginx一样,在用户和server之间进行负载均衡)。Eureka填补了中间层负载平衡的需要。理论上,您可以将您的中间层服务放在AWS ELB后面,但在EC2 classic中,您将它们暴露给外部世界,并失去AWS安全组的所有安全控制。

AWS ELB也是一种传统的基于代理的负载均衡解决方案,与之不同的是,Eureka是对实例/服务器/主机级别间进行负载均衡。客户端实例能够感知需要与哪些服务器进行交互的所有信息。这样的好坏取决于你看待它的方式。如果你正在寻找一个基于粘性用户会话的负载均衡,AWS已经提供了,Eureka并没有提供一个解决方案。在Netflix,我们偏向于使用无状态服务。这样有利于可扩展模型并且更加契合Eureka。

另一个eureka和传统的基于代理的负载均衡的区别是,应用在负载均衡服务中断后继续对外提供服务,这是因为可用服务器的相关信息已经缓存在了客户端上。这些缓存只需要占用客户端很小的内存,却能带来非常好的弹性(可用性)。

Eureka和Route 53有什么区别?

Route 53是一个命名服务,Eureka也能够为中间服务提供相同的服务,两者的相同点仅限于此。Route 53是一个DNS服务:即使在非AWS中也能够提供DNS记录解析服务。Route 53还可以通过AWS分区进行基于延迟的路由。Eureka类似于一个内部DNS服务器,但与其他外界的DNS服务器没有任何关系。Eureka在某种意义上也是被隔离的,因为它并不知道其他AWS分区的Eureka。它保持信息的主要目的是在本分区内进行负载均衡。

虽然你可以将你的中间层服务注册到Route 53并依赖AWS的安全组来保护你的应用不受公网访问,但你的中间层服务实际上还是暴漏在了公网上。并且这样做会带来传统的基于DNS负载均衡解决方案的缺点,在这些方案中,即时某些服务已经不健康,甚至已经不存在的情况下(AWS中,服务器可以随时消失),流量仍然会路由到这些服务上去。

Netflix怎样使用Eureka?

在Netflix,Eureka除了作为中间层服务负载均衡外,还用于以下目的:

  • 和Netflix Asgard(一个使在云环境中部署变得更容易的开源服务组件)一起用于红/黑部署。Eureka与Asgard协作,在出现问题的情况下可以快速、无缝的切换部署的新/旧版本的服务-特别是考虑到发布100个实例来部署一个版本可能需要很长时间。
  • 对于已部署的cassandra来说,将实例从流量中取出来进行维护。
  • 对于memcached服务来说,标识集群节点列表。
  • 用于携带特定服务的其他额外元数据。

何时使用Eureka?

你有许多中间层服务运行在AWS,并且你不希望将他们注册到AWS ELB或将他们暴露在公网。你可能正在寻找一个简单的循环负载均衡解决方案,或者你愿意根据你的需求对Eureka进行封装。你不需要使用外部缓存(如memcached)对用户会话信息进行保存和加载以保持状态。更重要的是,如果你的架构适合于基于客户端的负载均衡模型,那么Eureka是契合的。

服务的服务端和客户端是如何通讯的?

通讯技术可以是你喜欢的任何东西。Eureka帮助你找到你想要进行通讯的服务端信息,但不会对客户端和服务端之间的通讯协议或通讯方式进行任何限制。例如,你可以使用Eureka获取目标服务器地址,并使用诸如thrift,http(s)或任何其他RPC机制协议。

高层架构

高层架构图

上面的架构描述了Eureka是如何部署在Netflix上的,这也是你通常运行它的方式。每个区域只有一个eureka集群,它只知道该区域的实例。每个区域至少有一个eureka服务器来处理区域故障。
服务注册到Eureka,然后每30秒发送心跳更新他们的租约。如果客户不能更新租约几次,它将在90秒内从服务器注册中心剔除。注册信息和更新被复制到集群中的所有eureka节点。来自任何区域的客户端可以查找注册中心信息(每30秒发生一次)来定位它们所需的服务(可能在任何区域)并进行远程调用。

非JAVA的服务端和客户端

对于非Java的服务,您可以选择自行实现eureka的客户端部分,或者您可以运行“side car”,它本质上是一个Java应用程序,其内置的eureka客户端可以处理注册和心跳。REST端点也暴露了所有Eureka Client进行的操作(本质是基于非JAVA语言通过HTTP实现心跳和注册处理等)。非java客户端可以使用REST来查询其他服务的信息。

可配置性

使用Eureka,你能够在集群运行时将某个几点从集群中移除。你能够调整内部配置,从超时到线程池。Eureka使用archaius并且如果你拥有配置源实现,很多配置都可以动态调整。

弹性

在AWS云里,我们很难不去思考我们构建的所有东西的弹性。Eureka得益于我们获得的经验,客户端和服务器都有弹性。

Eureka客户端能够处理一个或多个Eureka服务器的故障。由于Eureka客户端有注册表缓存信息,因此即使所有的Eureka服务器都被关闭,它们也可以运行得相当好。

Eureka服务器对其他Eureka服务器宕机具有有弹性。即使在客户端和服务器之间的网络分区中,服务器也具有内置的弹性,以防止大规模停机。

多分区

在多个AWS区域部署Eureka是一项相当简单的任务。区域之间的Eureka集群之间并不会相互通信。

监控

Eureka使用servo跟踪客户端和服务端上的大量信息,用于性能、监控和警报。这些数据通常注册到JMX,并可以导出到Amazon Cloud Watch。