注册中心 ZooKeeper、Eureka、Nacos 对比

前言

服务注册中心本质上是为了解耦服务提供者和服务消费者。

对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的。更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数量和分布往往是动态变化的,也是无法预先确定的。因此,原本在单体应用阶段常用的静态 LB 机制就不再适用了,需要引入额外的组件来管理微服务提供者的注册与发现,而这个组件就是服务注册中心。

CAP 理论

  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
  • 分区容错性(Partition tolerance) (在网络分区的情况下,被分隔的节点仍能正常对外服务)

大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。因为分布式系统 P 是客观存在的(分布式,网络不可控,必须满足出现问题后系统的正常运行),所以我们要在 CP 和 AP 之间进行抉择

Zookeeper

Zookeeper 保证 CP。当选择 CP 时,相当于放弃系统的可用性,换取一致性

在 Zookeeper 集群中,有如下三种角色

角色作用
Leader事务请求的唯一调度者和处理者 (事务请求为除查询之外的请求)
Follower处理非事务请求,参与 Leader 选举投票
Observer处理非事务请求,不参与选举投票

在 Leader 服务器失效时,会重新从 Follower 服务器中选举一个新的服务器作为 Leader 服务器。在重新选举 Leader 服务器的过程中,事务请求会被挂起,选举完 Leader 服务器之后才会执行这些请求。即为了保证一致性,放弃了系统的可用性

zookeeper 使用的 ZAB 协议进行主从数据同步,ZAB 协议认为只要是过半数节点写入成为,数据就算写成功了,然后会告诉客户端 A 数据写入成功,如果这个时候客户端 B 恰好访问到还没同步最新数据的 zookeeper 节点,那么读到的数据就是不一致性的,因此 zookeeper 无法保证写数据的强一致性,只能保证最终一致性,而且可以保证同一客户端的顺序一致性。

Eureka

但是,当我们向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接挂掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。Eureka 看明白了这一点,因此在设计时就优先保证可用性。

Eureka 保证 AP。和 Zookeeper 集群中有三种角色不同的是,Eureka 集群中每个节点扮演相同的角色,他们通过互相注册的方式来感知对方的存在,当有注册信息时,他们会同步给集群内的其他节点。

当客户端从某个 eureka 节点获取信息失败,或者注册失败,会自动切换到另一个 eureka 节点。只要有一台 eureka 节点可用,就能保证注册服务可用。

Nacos

Nacos 就是第一代微服务中的注册中心 Eureka 和 Spring Cloud Config 配置中心的合体,在第二代微服务 Spring Cloud Alibaba 中被广泛使用,你完全可以使用 nacos 替换 eureka 和 config 这两个组件。Nacos 支持基于 DNS 和基于 RPC 的服务发现,Nacos 一大特性是即支持 CP,也支持 AP。可以根据需要灵活选择。

默认是 AP 模式,保证服务可用性

CP 的形式底层集群使用 raft 协议(选举)保证数据的一致性,在网络分区产生抖动的情况下不可以继续注册服务。

AP 模式仅支持服务临时注册的,注册中心列表存在内存里,不是持久化的,在网络分区产生抖动的情况下仍然可以继续注册我们的服务列表

Nacos 除了注册中心之外,也能充当配置中心的作用。且配置中心可以按照 namespace,group 等维度来进行数据隔离,来达到不同环境之间配置隔离的功能。

另外值得一提的是,Nacos 作为配置中心的持久化机制可以依赖于 Mysql 来完成(默认依赖于内置数据库)。只需要将 Nacos 目录下的 sql 脚本放到 mysql 中执行(会生成 11 个表),然后在 nacos 配置文件里面配一下 mysql 的账号密码即可。这样使用 mysql 作为数据源的方式相比于 nacos 内置数据库来说更容易管理

总结

特性ZookeeperEurekaNacos
一致性协议CPAPCP+AP
健条检查Keep AliveClient BeatTCP/HTTP/MYSQL/Client Beat
负载均衡策略Ribbon权重/ metadata/Selector
雪崩保护
自动注销实例支持支持支持
访问协议TCPHTTPHTTP/DNS
监听支持支持支持支持
多数据中心不支持支持支持
跨注册中心同步不支持不支持支持
SpringCloud 集成支持支持支持
Dubbo 集成支持不支持支持
K8S 集成不支持不支持支持