本文的目录结构:
1、概念
2、服务端和客户端之间的服务注册信息获取
3、服务端的自我保护机制
4、服务端的缓存机制
5、eureka的Regin zone
6、eureka的数据结构
7、eureka的register机制
8、eureka的reNew机制
9、eureka的cancel机制
10、eureka的evict机制
11、eureka的配置
12、服务端的集群(节点复制和数据同步)
13、异常问题
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值是否相同,不相同则去服务端获取全量的注册信息
增量获取流程图
3、服务端的自我保护机制
4、服务端的缓存机制
-
服务端采用三级缓存(registry,readWriteCacheMap,readOnlyCacheMap)来存储注册表信息。
三级缓存的工作原理如下图:
三级缓存工作原理图 - 三级缓存的目的是为了将注册服务和获取服务区分开,避免了高并发的同时对一个缓存的读写操作,有效避免读写冲突。保证性能。
- 三级缓存的主要流程是:
(假设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才会去主动获取)
5、eureka的Regin zone
6、eureka的数据结构
7、eureka的register机制
8、eureka的reNew机制
9、eureka的cancel机制
10、eureka的evict机制
11、eureka的配置
12、服务端的集群(节点复制和数据同步)
- 服务中心为了实现高可用,集群中的多个节点相互注册支持集群
- 如果服务端Server-A单向注册到服务端Server-B,则Server-A视Server-B为Peer节点,如果有客户端注册到Server-A,则Server-A就会将注册信息同步给Server-B。但是Server-B不会将注册信息同步到Server-A中。
13、异常问题
1、eureka服务中心挂掉后,注册在服务中心的A,B服务是否还能互相访问?
(1)、如果AB服务之间从没有连接到eureka,eureka服务就挂掉,那么AB是无法互相访问的,因为并没有从注册中心获取到注册表信息,所以无法访问。
(2)、如果AB服务已经连接到过eureka,那么eureka挂掉之后,AB服务之间还是会保存注册表信息,所以还是可以访问的。
(待续。。。)
网友评论