引言
尤里卡是Netflix开源的,用于实现服务注册和发现的服务.Spring云尤里卡基于尤里卡进行二次封装,增加了更人性化的用户界面,使用更为方便。但是由于尤里卡本身存在较多缓存,服务状态更新滞后,最常见的状况是:服务下线后状态没有及时更新,服务消费者调用到已下线的服务导致请求失败。<强>本文基云尤里卡1.4.4.RELEASE于春天,在默认地区和区域的前提下,介绍尤里卡的缓存机制。强>
一,美联社特性
从盖理论看,尤里卡是一个美联社系统,优先保证可用性(A)和分区容错性(p),不保证强一致性(C),只保证最终一致性,因此在架构中设计了较多缓存。
二、服务状态
尤里卡服务状态enum类:<代码> com.netflix.appinfo.InstanceInfo.InstanceStatus 代码>
状态 说明 状态 说明 向上 在线 OUT_OF_SERVICE 失效 下来 下线 未知的 未知 开始 正在启动三,尤里卡服务器
在尤里卡高可用架构中,尤里卡服务器也可以作为客户向其他服务器注册,多节点相互注册组成尤里卡集群,集群间相互视为peer.Eureka客户机向服务器注册,续约,更新状态时,接受节点更新自己的服务注册信息后,逐个同步至其他同行节点。
【注意】如果服务器向服务器b节点单向注册,则服务器视服务器b为同行节点,服务器接受的数据会同步给服务器b,但服务器b接受的数据不会同步给服务器。
3.1缓存机制
尤里卡服务器存在三个变量:(<强>注册、readWriteCacheMap readOnlyCacheMap 强>)保存服务注册信息,默认情况下定时任务每30年代将readWriteCacheMap同步至readOnlyCacheMap,每60年代清理超过90年代未续约的节点,尤里卡客户每30年代从readOnlyCacheMap更新服务注册信息,而UI则从注册表更新服务注册信息。
<强>三级缓存强>
缓存 类型 说明 <强>注册强> ConcurrentHashMap <>强实时更新>强,类AbstractInstanceRegistry成员变量,界面端请求的是这里的服务注册信息 <强> readWriteCacheMap 强> 番石榴缓存/LoadingCache <>强实时更新>强,类ResponseCacheImpl成员变量,缓存时间180秒 <强> readOnlyCacheMap 强> ConcurrentHashMap <强>周期更新>强,类ResponseCacheImpl成员变量,默认每30年代<强> 强>从readWriteCacheMap更新,尤里卡客户默认从这里更新服务注册信息,可配置直接从readWriteCacheMap更新<强>缓存相关配置强>
# # # 配置 默认 说明 <代码> eureka.server.useReadOnlyResponseCache 代码> 真正的 客户端从<强> readOnlyCacheMap 强>更新数据,假则跳过readOnlyCacheMap直接从readWriteCacheMap更新 <代码> eureka.server.responsecCacheUpdateIntervalMs 代码> 30000 readWriteCacheMap更新至readOnlyCacheMap周期,默认30年代<强> 强> <代码> eureka.server.evictionIntervalTimerInMs 代码> 60000 清理未续约节点(驱逐)周期,默认60年代<强> 强> <代码> eureka.instance.leaseExpirationDurationInSeconds 代码> 90 清理未续约节点超时时间,默认90年代<强> 强>
<>强关键类强>
类名 说明 <代码> com.netflix.eureka.registry.AbstractInstanceRegistry 代码> 保存服务注册信息,持有注册表和responseCache成员变量 <代码> com.netflix.eureka.registry.ResponseCacheImpl 代码> 持有readWriteCacheMap和readOnlyCacheMap成员变量四,尤里卡端
尤里卡客户存在两种角色:<>强服务提供者强>和<强>服务消费者>强,作为服务消费者一般配合丝带或假装(假装内部使用丝带)使用.Eureka客户启动后,作为服务提供者立即向服务器注册,默认情况下每30年代续约(更新);作为服务消费者立即向服务器全量更新服务注册信息,默认情况下每30年代增量更新服务注册信息;带延时1 s向客户获取使用的服务注册信息,默认每30年代更新使用的服务注册信息,只保存状态为向上的服务。