Spring Cloud中,除了可以使用Eureka作为注册中心外,还可以通过配置的方式使用Zookeeper作为注册中心。

ZooKeeper是Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。

在分布式领域有一个很著名的CAP理论:一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。

一致性

是指数据在多个副本之间能够保持一致的特性,等同于所有节点访问同一份最新的数据副本。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一致的状态。

可用性是指每次请求都能获取到正确的响应,但是不保证获取的数据为最新数据。

分区容错性是指分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障。这3个特性中任何分布式系统只能保证两个。

由于分区容错性在分布式系统中是必须要保证的,因此我们只能在可用性和一致性之间进行权衡。

Eureka和Zookeeper最大的不同就是,Eureka保证的是可用性、分区容错性,而ZooKeeper保证的是一致性、分区容错性。

 

ZooKeeper中节点有主从之分,在ZooKeeper集群中,通常节点有多个,如果服务器节点启动或者运行过程中leader服务器宕机了,就会通过选举模式选出一个leader(“老大”),被称为Master“主节点”。

leader服务器为客户端提供读和写服务,在ZooKeeper中当其进入选举模式时,就无法正常对外提供服务。

 

而在Eureka中,集群节点的地位是相同的,虽不能保证一致性,但至少可以提供注册服务。

 

如果某台服务器宕机,Eureka不会有类似于ZooKeeper的选举leader的过程,客户端请求会自动切换到新的节点。

当宕机的服务器恢复后,Eureka会再次将其纳入服务集群管理之中。

 

所以,Eureka作为单纯的服务注册中心要比Zookeeper更加“专业”。因为注册服务更重要的是可用性,我们可以接受短期内达不到一致性的状况。