eureka的多级缓存

1、概念

  • eureka是采用的C-S模式的服务注册中心。
  • 分为Server和Client,Server提供服务的注册和发现,Client可以做为服务的提供者,也可以作为服务的消费者。
  • 采用的是AP的模式,更加注重数据的高可用

2、服务端和客户端之间的服务注册信息获取

  • 服务端启动之后,客户端每隔30s会主动将自己的信息注册到服务端
  • 同时客户端也会每隔30s主动获取服务端(注册中心)的注册表,将获取到的注册表存放在本地的缓存中,获取的方式有两种(全量获取和增量获取)
  • 全量获取的情况有
    (1)、配置中禁用了增量获取
    (2)、首次请求的时候增量获取(或者本地注册表为空的情况)
    (3)、如果增量同步失败,还会强制全量获取
  • 增量获取的条件
    (1)、开启了增量获取开关
    (2)、非首次获取
    全量获取这个好理解,直接去Server的三级缓存中获取数据,但是增量获取就稍微复杂一点点
  • 增量获取的流程

(1)、增量变化服务注册信息存储在一个ConcurrentLinkedQueue中(变量:rencentlyChangedQueue)
(2)、队列中存储3min内有改动的服务注册信息
(3)、客户端增量获取数据的时候获取两种信息(3min内改动的注册信息和全量注册信息的hash值)
(4)、客户端按照本地的注册和获取的增量的注册信息进行整合,得到完整的注册信息
(5)、客户端对完整的注册信息进行hash计算,然后比较计算所的hash值和获取的全量的hash值是否相同,不相同则去服务端获取全量的注册信息

eureka的多级缓存_第1张图片

 

增量获取流程图

3、服务端的自我保护机制

4、服务端的缓存机制

  • 服务端采用三级缓存(registry,readWriteCacheMap,readOnlyCacheMap)来存储注册表信息。
    三级缓存的工作原理如下图:

    eureka的多级缓存_第2张图片

    三级缓存工作原理图

  • 三级缓存的目的是为了将注册服务和获取服务区分开,避免了高并发的同时对一个缓存的读写操作,有效避免读写冲突。保证性能。
  • 三级缓存的主要流程是:
    (假设registry一级缓存,readWriteCacheMap二级缓存,readOnlyCacheMap三级缓存)

 

(1)、客户端将服务信息注册在一级缓存registry中。(每30s一次心跳续约)
(2)、一级缓存registry收到注册信息后,先清空二级缓存readWriteCacheMap中的注册信息,然后在同步新数据给readWriteCacheMap二级缓存。
(3)、二级缓存按照30s一次的频率给三级缓存readOnlyCacheMap同步数据
(4)、其他的客户端连接注册中心Server30s一次的频率从三级缓存readOnlyCacheMap中获取,如果readOnlyCacheMap中获取不到,则直接去一级缓存registry中获取。
(5)、一级缓存中默认每隔60s检查服务续期,如果90秒内,服务还没有续期,则删除注册信息。同时同步给二级三级缓存。
(6)、服务下线时,一级缓存registry中的注册信息删除,同时删除二级缓存的数据。30s后二级同步三级缓存时发现二级缓存已失效,则删除三级缓存的注册表信息。则会期间会有时间的延迟。
(7)、二级缓存的默认有效期是180s(3min),3min后数据会失效,然后二级缓存数据清空
  • 三级缓存的弊端:
    三级缓存的问题很明显,就是服务下线之后,不能及时通知到三级缓存中,注册信息的获取者(客户端)拿到的注册信息不是实时的。(当让客户端的获取也不是实时的,要间隔30s才会去主动获取)



作者:chanyi
链接:https://www.jianshu.com/p/f3d6775cdd2e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(微服务,eureka)