简介

Eureka本身是Netflix开源的一款提供服务注册和发现的产品,并且提供了相应的Java封装。在它的实现中,节点之间相互平等,部分注册中心的节点挂掉也不会对集群造成影响,即使集群只剩一个节点存活,也可以正常提供发现服务。哪怕是所有的服务注册节点都挂了,Eureka Clients(客户端)上也会缓存服务调用的信息。这就保证了我们微服务之间的互相调用足够健壮。

Zookeeper主要为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。曾经是Hadoop项目中的一个子项目,用来控制集群中的数据,目前已升级为独立的顶级项目。很多场景下也用它作为Service发现服务解决方案。

对比

在分布式系统中有个著名的CAP定理(C-数据一致性;A-服务可用性;P-服务对网络分区故障的容错性,这三个特性在任何分布式系统中不能同时满足,最多同时满足两个);

Zookeeper

Zookeeper是基于CP来设计的,即任何时刻对Zookeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性,但是它不能保证每次服务请求的可用性。从实际情况来分析,在使用Zookeeper获取服务列表时,如果zookeeper正在选主,或者Zookeeper集群中半数以上机器不可用,那么将无法获得数据。所以说,Zookeeper不能保证服务可用性。

诚然,在大多数分布式环境中,尤其是涉及到数据存储的场景,数据一致性应该是首先被保证的,这也是zookeeper设计成CP的原因。但是对于服务发现场景来说,情况就不太一样了:针对同一个服务,即使注册中心的不同节点保存的服务提供者信息不尽相同,也并不会造成灾难性的后果。因为对于服务消费者来说,能消费才是最重要的——拿到可能不正确的服务实例信息后尝试消费一下,也好过因为无法获取实例信息而不去消费。(尝试一下可以快速失败,之后可以更新配置并重试)所以,对于服务发现而言,可用性比数据一致性更加重要——AP胜过CP。

Eureka

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

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

一个新的Eureka Server节点启动后,会首先尝试从邻近节点获取所有实例注册表信息,完成初始化。Eureka Server通过getEurekaServiceUrls()方法获取所有的节点,并且会通过心跳续约的方式定期更新。默认配置下,如果Eureka Server在一定时间内没有接收到某个服务实例的心跳,Eureka Server将会注销该实例(默认为90秒,通过eureka.instance.lease-expiration-duration-in-seconds配置)。当Eureka Server节点在短时间内丢失过多的心跳时(比如发生了网络分区故障),那么这个节点就会进入自我保护模式。

什么是自我保护模式?默认配置下,如果Eureka Server每分钟收到心跳续约的数量低于一个阈值(instance的数量(60/每个instance的心跳间隔秒数)自我保护系数),并且持续15分钟,就会触发自我保护。在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该Eureka Server节点就会自动退出自我保护模式。它的设计哲学前面提到过,那就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。该模式可以通过eureka.server.enable-self-preservation = false来禁用,同时eureka.instance.lease-renewal-interval-in-seconds可以用来更改心跳间隔,eureka.server.renewal-percent-threshold可以用来修改自我保护系数(默认0.85)。

总结

ZooKeeper基于CP,不保证高可用,如果zookeeper正在选主,或者Zookeeper集群中半数以上机器不可用,那么将无法获得数据。Eureka基于AP,能保证高可用,即使所有机器都挂了,也能拿到本地缓存的数据。作为注册中心,其实配置是不经常变动的,只有发版和机器出故障时会变。对于不经常变动的配置来说,CP是不合适的,而AP在遇到问题时可以用牺牲一致性来保证可用性,既返回旧数据,缓存数据。

所以理论上Eureka是更适合做注册中心。而现实环境中大部分项目可能会使用ZooKeeper,那是因为集群不够大,并且基本不会遇到用做注册中心的机器一半以上都挂了的情况。所以实际上也没什么大问题。

ZooKeeper、Eureka谁是最好的注册中心?相关推荐

  1. Spring Cloud Eureka(一)搭建一个注册中心

    Spring Cloud Eureka(一)搭建一个注册中心 服务治理 名词解释 spring cloud eureka:spring cloud eureka 使用Netflix Eureka来服务 ...

  2. Spring Cloud Eureka 2 (Eureka Server搭建服务注册中心)

    工具:IntelliJ IDEA 2017.1.2 x64.maven3.3.9 打开IDE  file===>new===>project next next 选择相应的依赖 next ...

  3. 教你一招如何使用几行代码实现zookeeper作为springcloud的服务注册中心

    如果没有安装过zookeeper,请移步 zookeeper的单机安装 - 详细教程:https://blog.csdn.net/Kevinnsm/article/details/116134397 ...

  4. SpringCloud eureka 高集群注册中心

    高集群注册中心 你中有我,我中有你.相互注册,相互访问. 建立两个项目: 两个里面的依赖一样,启动类一样,yml文件里面几乎一样,知识端口换了一下.我们看图: 如果报错,可能就是两个启动类里面少了注解 ...

  5. (三)Alian 的 Spring Cloud Eureka Server(服务注册中心)

    目录 一.创建Eureka服务工程 1.1.第一步(创建工程) 1.2.第二步(springboot工程) 1.3.第三步(工程设置) 1.4.第四步(依赖选择) 二.配置 2.1.pom文件 2.2 ...

  6. 如何将注册中心从 Consul 平滑的迁移到 Nacos ?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 近日,国外的商业软件公司HashiCorp在官网宣布:不 ...

  7. 服务注册中心,Eureka与Zookeeper比较

    2019独角兽企业重金招聘Python工程师标准>>> 1. 前言 服务注册中心,给客户端提供可供调用的服务列表,客户端在进行远程服务调用时,根据服务列表然后选择服务提供方的服务地址 ...

  8. 注册中心对比Zookeeper、Eureka、Nacos、Consul和Etcd

    一.注册中心概念 1.1 什么是注册中心 注册中心主要有三种角色: 服务提供者(RPC Server):在启动时,向 Registry 注册自身服务,并向 Registry 定期发送心跳汇报存活状态. ...

  9. 服务注册中心AP和CP区别【Nacos|Eureka|Consul|Zookeeper】

    当下,分布式系统正变得越来越重要,大型网站几乎都是分布式的.分布式系统的最大难点,就是各个节点的状态如何同步.CAP 定理是这方面的基本定理,也是理解分布式系统的起点. CAP定理,又被称作布鲁尔定理 ...

最新文章

  1. 实时排行榜的后台数据功能实现
  2. 开工了!三位大咖给你指路:未来 3~5 年内,哪个方向的机器学习人才最紧缺?
  3. 图解|深入理解Linux高性能网络架构的那些事
  4. postgresql
  5. 操作系统实验报告9:进程间通信—管道和 socket 通信
  6. sklearn自学指南(part39)--Birch
  7. VC打包程序,并修改注册表(详细以后补充)
  8. 静心的最好的方法是什么?
  9. 1,2-二氨基苯行业调研报告 - 市场现状分析与发展前景预测
  10. input 单击 图标_input添加小图标
  11. 扇贝有道180910每日一句
  12. 北京圣思园Java教学视频全集迅雷下载
  13. 2019年9月全国计算机二级Office题库软件
  14. mysql默认的锁_mysql默认是悲观锁还是乐观锁
  15. 计算机组成原理——存储器系统
  16. 微信二维码海报推广示例
  17. 淘宝再次升级!这次的关键词是啥
  18. C++核心准则边译边学-P.9 不要浪费时间和空间
  19. 从回合霸王到网游巨头 网易游戏十年史
  20. strlen,strcpy,strcmp,strcat,strncpy,strncmp,strncat

热门文章

  1. 上海理工大学第二届“联想杯”全国程序设计邀请赛 - Experiment Class(几何+三分套三分)
  2. 洛谷 - P4755 Beautiful Pair(笛卡尔树+主席树)
  3. 洛谷 - P2762 太空飞行计划问题(最大权闭合图+路径打印)
  4. POJ - 1475 Pushing Boxes(bfs套bfs)
  5. angularjs全栈开发知乎_1-4【微信小程序全栈开发课程】原生小程序框架介绍
  6. ubuntu 电源按钮操作_Ubuntu电脑操作基础:桌面背景,屏保和电源
  7. 【Boost】boost库中thread多线程详解8——call_once仅运行一次
  8. socket通信的环形缓冲
  9. STL 之search,search_n,sort,binary_search
  10. WebRTC 中收集音视频编解码能力