eureka原理
eureka分为服务端和客户端
客户端主要逻辑是在discoverclient这个类里面
在initScheduledTasks()这个方法里面主要会做三件事
1.定时更新服务注册表
2.定时服务续约
3.定时注册服务
在定时更新服务表时首次进行全量更新,否则进行增量更新
增量更新会返回增量实例的集合和所有实例的hashcode
把增量的实例合并到本地缓存后会计算此时所有实例的hashcode和服务端返回的全量的hashcode是否一致,不一致的话会调用全量更新。
eureka的定时操作并不是定死的每多少秒执行一次,他是调用的schedule(),scheduler里面传的task的run方法里面在catch里面捕获超时异常,如果超时的话,把传的时间*2,最后在finally里面再调用一次schedule,里面传的时间就是delay.get,如果发生超时就是传入的时间X2后会再执行一次,下次过来又回复因为在try里面是delay.set(传入的时间)
注册实例存放的map 是一个两层的concurrenthashmap,外层map的key为服务名称,内层map的key是instanceid
server端获取注册信息的接口是调用ApplicationsResource的getContainers那个方法
首先从只读缓存中获取,只读缓存中如果没有就从读写缓存中读写,读写缓存中没有就直接从内存注册表里获取,读写缓存默认180秒定时过期,schedule默认每30秒将读写缓存里的数据更新到只读缓存中去
register的时候会清空读写缓存,并往注册表里面写。