来源:https://www.cnblogs.com/jieqing/p/8394001.html

刚开始看到Eureka这个单词的时候真心不会念,查了后发现他有一个好听的名字,来,大家一起念 [ jʊ'rikə ]

简介

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

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

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

什么是自我保护模式?

默认配置下,如果Eureka Server每分钟收到心跳续约的数量低于一个阈值(instance的数量 (60/每个instance的心跳间隔秒数) 自我保护系数),并且持续15分钟,就会触发自我保护。在自我保护模式中,EurekaServer会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该EurekaServer节点就会自动退出自我保护模式。它的设计哲学前面提到过,那就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。该模式可以通过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,那是因为集群不够大,并且基本不会遇到用做注册中心的机器一半以上都挂了的情况。所以实际上也没什么大问题。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

为什么Eureka比ZooKeeper更适合做注册中心?相关推荐

  1. 为什么Eureka比ZooKeeper更适合做服务发现?

    Eureka的优势 1.在Eureka平台中,如果某台服务器宕机,Eureka不会有类似于ZooKeeper的选举leader的过程:客户端请求会自动切换到新的Eureka节点:当宕机的服务器重新恢复 ...

  2. zookeeper注册中心 kerberos_ZooKeeper 并不适合做注册中心

    zookeeper 的 CP 模型不适合注册中心 zookeeper 是一个非常优秀的项目,非常成熟,被大量的团队使用,但对于服务发现来讲,zookeeper 真的是一个错误的方案. 在 CAP 模型 ...

  3. 下列哪个适合做链栈_很多朋友在问:多层实木生态板和颗粒板哪个更适合做衣柜呢?...

    多层实木生态板和颗粒板哪个更适合做衣柜呢?这是很多消费者非常关心的问题,济南定制家具为你解答. 考虑到衣柜一般是家庭使用,所以我们一般看好衣柜的质量和环保,当消费者去板材市场选购济南定制家具板材,商家 ...

  4. 链表!比数组更适合做增删操作的数据结构

    什么是链表? 链表和数组的对比:在大多数语言中,数组的大小是固定的,从数组的起点或中间添加或删除元素的成本很高,因为需要移动元素. 链表中的每一个元素在内存中不是连续放置的,和它左右两侧元素是没有关系 ...

  5. 五位专家跟你讲讲为啥Python更适合做AI/机器学习

    摘要: 为什么Python会在这股深度学习浪潮中成为编程语言的头牌?听听大牛如何解释吧! 原文地址:http://click.aliyun.com/m/43988/ 1.Python网络编程框架Twi ...

  6. 下列哪个适合做链栈_朋友圈人格图鉴:三天可见 vs 全部可见,哪个更适合做恋人?...

    你们的朋友圈里有没有这样几种人? << 朋友圈大赏 >> 你可能已经对这些朋友圈的风格习以为常,其实,每个人在朋友圈展示的语言.行为,可能默默揭示着一个人自己原本是怎样的人.想 ...

  7. 你觉得你有那些特质让你比别人更适合做产品经理?

    面试中我们可能会被问到这样一个问题,你觉得你有哪些特质让你比别人更适合做产品经理?产品小白尤其会被问到这个问题.那针对这个问题我们该如何回答呢?今天就来和大家聊聊这个话题. 面试题分析: 面试官一是想 ...

  8. Mac 更适合做开发?从零把 Mac 打造成开发利器

    点击我爱计算机视觉标星,更快获取CVML新技术 本文作者:guoweiye,腾讯 PCG 开发工程师 很多人都说 Mac 比 Windows 更适合做开发,那关键是要把 Mac 配置好,下面就来和大家 ...

  9. 传统到敏捷的转型中,谁更适合做Scrum Master?

    摘要:本文主要讲述的是从传统到敏捷Scrum团队转型中,对Scrum Master这一角色的分析. 本文分享自华为云社区<传统到敏捷的转型中,谁更适合做Scrum Master?>,作者: ...

最新文章

  1. 优化内存中DataTable搜索速度,IP区域汇总
  2. Python 技巧篇 - 英文单词首字母大小写转换功能实例演示,字符串切片实现
  3. 改变服务器控件的显示属性,2.6.1 设置Style特性和其他属性
  4. 公司电脑用域账号访问团队文件夹
  5. text 两端对齐 小程序_小程序实现文字两端对齐
  6. 1017.UML类图笔记
  7. java程序在JVM中是如何运行的?
  8. 黑莓 os6 html5,黑莓OS 6内置浏览器HTML5性能超越其他平台
  9. python3.5安装教程linux_安装Python 3.6在Ubuntu 16.04上
  10. 工作流框架的设计要点
  11. IDEA2019安装教程
  12. Mode首席执行官Paul Dawes:从销售工程师到科技领导者
  13. 【贪心】Songs Compression
  14. 一张图看懂阿里云网络产品[七]共享流量包
  15. 第一次系统发版的过程(一)
  16. 关于Winxp U盘无法复制磁盘写保护解决办法
  17. 哲学家就餐(linux多线程)
  18. 面向对象与面向过程思考
  19. 计算地图经纬点之间的距离
  20. ERP : 钢铁行业解决方案

热门文章

  1. linux oraclerman自动备份,Linux平台下的Oracle自动备份案例(使用RMAN)
  2. MongoDB的update和set的用法
  3. poj3517(约瑟夫环问题)
  4. HDU5154拓扑排序模版题
  5. CF570D Tree Requests(dsu on tree)
  6. 枚举 ---- B. RPG Protagonist[Educational Codeforces Round 94 (Rated for Div. 2)]数学枚举
  7. php ascii转native,编码转换工具native2ascii的使用
  8. java二叉树镜像_给定一个二叉树,检查它是否是镜像对称的。
  9. Linear Regression(一)——
  10. Uva 11300 分金币