程序员笔记|详解尤里卡缓存机制

  

引言

  

尤里卡是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年代更新使用的服务注册信息,只保存状态为向上的服务。

程序员笔记|详解尤里卡缓存机制