Nacos、Eureka与Zookeeper区别

208 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1、Zookeeper

  Zookeeper采用CP保证数据的一致性的问题,原理是采用ZAB原子广播协议。当我们ZK领导者宕机或出现了故障,会自动重新实现选举新的领导角色,整个选举的过程中为了保证数据一致性的问题,整个微服务无法实现通讯(本地有缓存除外)。还有可运行的节点必须满足过半机制,整个zk才可以使用,要不然会奔溃。

 

zookeeper原理

zookeeper也可以作为注册中心,用于服务治理(zookeeper还有其他用途,例如:分布式事务锁等)

每启动一个微服务,就会去zk中注册一个临时子节点,

 

例如:5台订单服务,4台商品服务

(5台订单服务在zk中的订单目录下创建的5个临时节点)

(4台商品服务在zk中的商品目录下创建的4个临时接点)

 

每当有一个服务down机,由于是临时接点,此节点会立即被删除,并通知订阅该服务的微服务更新服务列表

(zk上有watch,每当有节点更新,都会通知订阅该服务的微服务更新服务列表)

 

每当有一个新的微服务注册进来,就会在对应的目录下创建临时子节点,并通知订阅该服务的微服务更新服务列表

(zk上有watch,每当有节点更新,都会通知订阅该服务的微服务更新服务列表)

 

每个微服务30s向zk获取新的服务列表

 

2、Eureka

Eureka采用AP设计理念架构注册中心,相互注册(你中有我,我中有你),完全去中心化,也就是没有主从之分,只要有一台Eureka节点存在整个微服务就可以实现通讯。

 

eureka原理

每一个微服务中都有eureka client,用于服务的注册与发现

(服务的注册:把自己注册到eureka server)

(服务的发现:从eureka server获取自己需要的服务列表)

 

每一个微服务启动的时候,都需要去eureka server注册

 

当A服务需要调用B服务时,需要从eureka服务端获取B服务的服务列表,然后把列表缓存到本地,然后根据ribbon的客户端负载均衡规则,从服务列表中取到一个B服务,然后去调用此B服务

当A服务下次再此调用B服务时,如果发现本地已经存储了B的服务列表,就不需要再从eureka服务端获取B服务列表,直接根据ribbon的客户端负载均衡规则,从服务列表中取到一个B服务,然后去调用B服务

 

微服务,默认每30秒,就会从eureka服务端获取一次最新的服务列表

 

如果某台微服务down机,或者添加了几台机器,

此时eureka server会通知订阅他的客户端,并让客户端更新服务列表,

而且还会通知其他eureka server更新此信息

 

心跳检测,微服务每30秒向eureka server发送心跳,

eureka server若90s之内都没有收到某个客户端的心跳,则认为此服务出了问题,

会从注册的服务列表中将其删除,并通知订阅它的客户端更新服务列表,

而且还会通知其他eureka server更新此信息

 

eureka server保护机制,通过打卡开关,可以让eureka server处于保护状态,主要是用于某eureka server由于网络或其他原因,导致接收不到其他微服务的心跳,此时不能盲目的将其他微服务从服务列表中删除。

具体规则:如果一段时间内,85%的服务都没有发送心跳,则此server进入保护状态,此状态下,可以正常接受注册,可以正常提供查询服务,但是不与其他server同步信息,也不会通知订阅它的客户端,这样就不会误杀其他微服务

 

Eureka Server 的优势

Eureka Server 也可以运行多个实例来构建集群,解决单点问题,但不同于 ZooKeeper 的选举 leader 的过程,Eureka Server 采用的是Peer to Peer 对等通信。这是一种去中心化的架构,无 master/slave 之分,每一个 Peer 都是对等的。在这种架构风格中,节点通过彼此互相注册来提高可用性,每个节点需要添加一个或多个有效的 serviceUrl 指向其他节点。每个节点都可被视为其他节点的副本。

 

在集群环境中如果某台 Eureka Server 宕机,Eureka Client 的请求会自动切换到新的 Eureka Server 节点上,当宕机的服务器重新恢复后,Eureka 会再次将其纳入到服务器集群管理之中。当节点开始接受客户端请求时,所有的操作都会在节点间进行复制(replicate To Peer)操作,将请求复制到该 Eureka Server 当前所知的其它所有节点中。

 

因此,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使得整个注册服务瘫痪。

 

3、Nacos

Nacos从1.0版本选择Ap和CP混合形式实现注册中心,默认情况下采用Ap保证服务可用性,CP形式底层采用Raft协议保证数据的一致性问题。

如果选择为Ap模式,注册服务的实例仅支持临时模式,在网络分区的的情况允许注册服务实例。

选择CP模式可以支持注册服务的实例为持久模式,在网络分区的产生了抖动情况下不允许注册服务实例。