SpringCloud微服务架构(一)Eureka,对比zookeeper有何不同?

注册中心Eureka

注册中心
SpringCloud微服务架构(一)Eureka,对比zookeeper有何不同?_第1张图片
注册中心的结构有点类似于MessageQueue,服务的提供者跟消费者第一步都是要先注册到注册中心。但是它的特点在于不用每次都去注册中心获取,而是会把信息存到本地缓存,从缓存中获取,性能特别快,另外它内部配有心跳检测机制,当注册中心信息改变,自动获得最新信息至本地,同时心跳机制保证分布式环境下,服务宕机后,自动从注册中心移除!

Eureka
Eureka是Netfix开源的一款服务注册及发现的产品,并提供了相对应的java封装,在Eureka的实现中,节点之间是相互对等的,部分注册节点宕机不会影响集群,即使集群中只有一个节点,也能正常提供服务,哪怕是所有节点宕机,Eureka的客户端也能从缓存服务调用信息,这就保证了我们微服务之间的互相调用足够健壮。

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

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

Eureka遵守的是AP原则,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节点在短时间内丢失过多的心跳时(比如发生了网络分区故障),那么这个节点就会进入自我保护模式。

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

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

总结
ZooKeeper基于CP,不保证高可用,如果zookeeper正在选主,或者Zookeeper集群中半数以上机器不可用,那么将无法获得数据。Eureka基于AP,能保证高可用,即使所有机器都挂了,也能拿到本地缓存的数据。作为注册中心,其实配置是不经常变动的,只有发版(发布新的版本)和机器出故障时会变。对于不经常变动的配置来说,CP是不合适的,而AP在遇到问题时可以用牺牲一致性来保证可用性,既返回旧数据,缓存数据。
所以理论上Eureka是更适合作注册中心。而现实环境中大部分项目可能会使用ZooKeeper,那是因为集群不够大,并且基本不会遇到用做注册中心的机器一半以上都挂了的情况。所以实际上也没什么大问题。

如何搭建SpringCloud中的Eureka

  1. IDEA新建一个项目,选择Spring Initializr

SpringCloud微服务架构(一)Eureka,对比zookeeper有何不同?_第2张图片
2. 添加Euraka依赖
SpringCloud微服务架构(一)Eureka,对比zookeeper有何不同?_第3张图片
3. yml文件中配置好Euraka的相关参数

server:
 port: 8761

spring:
 application:
   name: deom-springcloud-eureka
#eureka详细配置可参考http://huhanlin.com/2018/07/09/springcloud%E8%BF%9B%E9%98%B6-eureka%E9%85%8D%E7%BD%AE/
eureka:
 instance:
   hostname: ${hostname:localhost}
   #Spring就会自动为我们获取第一个非回环IP地址,注册至服务。
   preferIpAddress: true
   #表示eureka client间隔多久去拉取服务注册信息
   lease-renewal-interval-in-seconds: 2
   #表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间
   lease-expiration-duration-in-seconds: 6
 server:
   #集群里eureka节点的变化信息更新的时间间隔,单位为毫秒。用户可以使用Archaius提供的DNS机制或动态配置来动态更改信息。
   peerEurekaNodesUpdateIntervalMs: 60000
   #eurekaserver的健康检测,当出现出现网络分区、eureka在短时间内丢失过多客户端时,会进入自我保护模式,
   #即一个服务长时间没有发送心跳,eureka也不会将其删除。
   enableSelfPreservation: false
   #过期实例应该启动并运行的时间间隔
   evictionIntervalTimerInMs: 5000
 client:
   #实例是否在eureka服务器上注册自己的信息以供其他服务发现
   registerWithEureka: false
   #此客户端是否获取eureka服务器注册表上的注册信息
   fetchRegistry: false
   serviceUrl:
     #Eureka服务器的连接,默认为http://XXXX:X/eureka/,但是如果采用DNS方式获取服务地址,则不需要配置此设置。
     defaultZone: http://localhost:8761/eureka/
   healthcheck:
     enabled: true
     #询问Eureka服务url信息变化的时间间隔
   eurekaServiceUrlPollIntervalSeconds: 60

logging:
 level:
   root: INFO


  1. 启动类上添加@EnableEurekaServer,启动项目,访问http://localhost:8761即可

SpringCloud微服务架构(一)Eureka,对比zookeeper有何不同?_第4张图片
代码demo可参考git:https://github.com/a870368162/springcloud-demo

你可能感兴趣的:(SpringCloud)