在以前,没有学习springcloud以前,学习了dubbo,dubbo是一个远程调用(RPC)框架,当时使用的是zookeeper注册中心,可是在springcloud2.x以前,springcloud是没有zookeeper的,那么是如何实现远程调用的呢?git
springcloud在2019年也就是springcloud2以后才添加的zookeeper,在这以前,都是使用的springcloud自带的eureka注册中心实现的远程调用。github
eureka是springcloud的核心,许多的服务都须要依赖eureka实现。spring
eureka与zookeeper的比较:服务器
在以前使用的是zookeeper,如今学习eureka了解到,eureka也是一个注册中心,那么两个注册中心有什么区别呢?(若是都同样的话,为何要开发它)网络
首先回顾zookeeper:框架
zookeeper保证的是数据的一致性(CP特性),zookeeper是一主多从机制,也就是三台zookeeper只有一台是leader,其余的两台是follower,消费者请求进来后,不管是进入leader仍是follower,都会被移交给leader进行处理。ide
zookeeper的缺陷:由于保证了数据的一致性,那么若是leader宕机的话,就会读取到脏数据,以前zookeeper中有详细的介绍学习
Eureka:spa
eureka保证的是服务的可用性(AP特性),eureka集群中每一个节点都是平等的,所以在服务注册时,就须要在每一个节点都注册一份,三台节点中的数据都是同样的。这样就不会出现zookeeper中leader宕机读取脏数据的状况。解决了zookeeper的缺陷。code
eureka的自我保护机制:
若是长时间不激活eureka的时候就会出现自我保护机制。
eureka在启动后,生产者每隔一段时间就会向eureka中发送心跳,eureka接收生产者的心跳,当网络延迟/服务器宕机等状况发生后,生产者不在向eureka发送心跳,eureka从接收不到心跳开始,默认90后,就会踢出这个生产者(Provider),可是若是出现大面积的生产者宕机——生产者的机房停电了,全部的服务器都没法发送心跳,这时eureka就不会踢出任何一个服务(会将全部的服务都保留下来,这就是AP性)
Eureka为何不会踢出大量的服务?
若是把eureka中的全部服务都踢出,当consumer进来后,发现没有可用的服务了,就会报错500,整个项目于就瘫痪了。
当大面积服务没有心跳,可是eureka不踢出的话,consumer进来后,仍然能够获取到服务,能够获取到数据,这个数据可能不是最新的数据(假如说由于网络延迟,致使eureka没有接收到心跳,这样eureka不会讲服务所有踢出,也就是说consumer仍然能够找到provider,provider仍然能够工做,只是由于网络延迟的缘由,可能如今获取的数据,其实已经被删除了,只不过删除的操做发生网络拥堵尚未到生产者中,这就会形成数据的不一致)
AP性:保证服务的可用性,不保证数据的一致性
CP性:保证数据的一致性,不保证服务的可用性
能够关,可是不能这么作
若是如今有一个服务就是不须要eureka的自我保护机制,那么能够想办法让eureka的自我保护失效。
方法:provider告诉eureka我每隔5秒给你发送一次心跳,若是你八秒后仍没有接受到个人心跳,那么你就将我踢出。
# 规定本身向eureka发送心跳的时间 # 单位是秒 eureka.instance.lease-renewal-interval-in-seconds=5 # 当eureka最后一次检测到心跳的时间间隔(单位是秒) # eg:15:05:20是最后一次检测到心跳-->检测8秒以后仍是没法检测心跳的时候直接剔除 eureka.instance.lease-expiration-duration-in-seconds=8
eureka中设置,默认等待provider10秒,10秒后尚未接受到心跳,就将provider踢出
# eureka本身检测服务的心跳时间(90秒) # 单位是毫秒,先把eureka检测心跳的时间缩短为10秒 # 也就是说每一个10秒就会检测一次服务的心跳 eureka.server.eviction-interval-timer-in-ms=10000