起源:https://www.cnblogs.com/jieqi...
作者:jieqing
刚开始看到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()办法获取所有的节点,并且会通过心跳续约的形式定期更新。默认配置下,如果Eureka
Server在肯定工夫内没有接管到某个服务实例的心跳,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,那是因为集群不够大,并且根本不会遇到用做注册核心的机器一半以上都挂了的状况。所以实际上也没什么大问题。
举荐
- Netflix 微服务架构设计解析
- 为什么阿里规定须要在事务注解@Transactional中指定rollbackFor?
- 下一代构建工具 Gradle ,比 Maven 强在哪里!
- 如何让你的Nginx 晋升10倍性能?
- 面试必须要明确的 Redis 分布式锁实现原理!
学习材料分享
12 套 微服务、Spring Boot、Spring Cloud 核心技术材料,这是局部材料目录:
- Spring Security 认证与受权
- Spring Boot 我的项目实战(中小型互联网公司后盾服务架构与运维架构)
- Spring Boot 我的项目实战(企业权限治理我的项目))
- Spring Cloud 微服务架构我的项目实战(分布式事务解决方案)
- ...
公众号后盾回复
arch028
获取材料::