Eureka的主要用途是服务注册与发现中心,它由三个组成部分:服务注册中心、服务提供者、服务消费者。其采用最终一致性设计。
服务注册中心:提供服务注册与发现的功能。服务提供者启动时,会通过 Eureka客户端向Eureka集群中的某个Eureka节点注册信息。当Eureka收到新的服务注册信息后,会将该消息同步给整个Eureka集群。这里的同步方式是广播,对Eureka集群的节点进行一次普通的广播。注意其他节点收到对端节点的消息后并不会再次广播,从而避免广播风暴。当服务消费者向某一Eureka节点请求某一服务提供者的信息时,Eureka节点会查找存储在缓存中的服务注册列表,并告知其服务提供者的信息。
服务提供者:提供服务的应用,它将自己注册在Eureka集群上,供服务消费者进行发现和消费。服务提供者除了要把自身注册在Eureka集群外,还需要每隔一段时间向Eureka集群发送一次心跳来续约,来告知Eureka集群自身运行正常。Eureka集群每隔一段时间也会删除注册列表中没有进行续租的服务提供者信息。
服务消费者:消费服务提供者提供的服务,通过服务注册中心去获取服务。
Eureka集群如下图所示:
Eureka集群结构图
Eureka的内存数据结构由一张哈希表和多个列表组成。第一张哈希表中的Key是服务应用名称的索引,Value对应服务实例信息,在Value中还连着另外一张列表,该列表上列出了每个能提供该服务的节点信息和最后续租时间。最后续租时间一方面是给租约模块提供参照的时间,另一方面是用来比较同一个服务提供者发起同一条服务注册的时间新旧。Eureka内存数据库结构如下图所示:
Eureka内存数据库结构图
了解完Eureka结构核心概念和内存数据库,对整个Eureka的工作流程就比较好理解了,下面是Eureka的工作流程:
- Eureka 集群启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间通过定时同步注册表,每个 Eureka节点都存在独立完整的服务注册表信息。
- Eureka客户端启动时根据配置的 Eureka 服务端地址去注册中心注册服务。
- Eureka 客户端会每 30s 向 Eureka集群发送一次心跳请求,证明客户端服务正常。
- 当Eureka 集群90s 内没有收到 Eureka 客户端的心跳,注册中心则认为该节点失效,会注销该实例。
- 单位时间内 单个Eureka节点统计到有大量的 Eureka 客户端没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端。
- 当 Eureka客户端心跳请求恢复正常之后,Eureka节点自动退出自我保护模式。
- Eureka客户端定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地。
- 服务调用时,Eureka客户端会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存。
- Eureka 客户端获取到目标服务器信息,发起服务调用。
- Eureka 客户端程序关闭时向 Eureka 集群发送取消请求,Eureka 集群将实例从注册表中删除。