一、Eureka简介
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud 将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
Eureka 包括 Eureka Server 和 Eureka Client,Eureka Server 即注册中心,Eureka Client 启动后会向 Eureka Server 注册自己,这样其他的 Eureka Client 访问 Eureka Server 即可拿到注册了的 Eureka Client 的信息。
Eureka Server Replicate
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。在此Zookeeper保证的是CP, 而Eureka则是AP。
与zookeeper相比,Eureka并不追求很强的一致性,而是认为A(k可用性)和P(分区容错性)更重要。
基于此,Eureka采用复制的方式进行注册信息的同步。
与zookeeperd的区别参考文章:https://www.cnblogs.com/snowjeblog/p/8821325.html
上图是官网给的基于集群部署的 Eureka 架构图,先看一下图上各个部件的表示含义以及它们之间的交互:
- Eureka Server:Eureka 服务端,多个 Eureka Server 可构成集群,集群中各节点完全对等。
- Eureka Client:Eureka 客户端,业务服务依赖它实现服务注册和服务发现功能。
- Application Service:服务提供者,依赖 Eureka Client 实现服务注册功能。
- Application Client:服务消费者,依赖 Eureka Client 实现服务发现功能。
- Register:Eureka Client 启动时会发起 Register 请求向 Eureka Server 注册自己。
- Renew:Eureka Client 会周期性的向 Eureka Server 发送心跳来续约,默认30s。
- Cancel:Eureka Client 关闭时会发送 Cancel 下线请求。
- Get:Eureka Client 会周期性的发送 Get 请求,从 Eureka Server 获取注册表信息,默认30s。
- Make Remote Call:服务消费者通过 Make Remote Call 访问服务提供者。
- Replicate:Eureka Server 之间通过 Replicate 实现数据同步。当 Eureka Client 有请求(Heartbeat, Register, Cancel, StatusUpdate, DeleteStatusOverride)到某一个 Eureka Server 节点,该节点完成自身对应的操作后,会通过 Replicate 将本次请求同步到其他节点。
注册表的存储结构:
上图 ConcurrentHashMap<String, Map<String, Lease>> register 就是注册表。ConcurrentHashMap 的 key 存储的是服务名称,value 的这个 Map 存储的是该服务对应的多个实例信息,Map 的 key 存储的是服务实例的id,value 的 Lease 就是实例信息,InstanceInfo 就代表了服务实例的具体信息,比如机器的ip地址、hostname 以及端口号,Lease 可以理解为 InstanceInfo 的包装类,维护了服务实例的一些动态数据,比如最近的心跳时间。另外,从源码中可以看到,register 是完全基于内存的,服务的注册、下线、故障,全部会在内存里维护和更新这个注册表。
对于Eureka缓存可参考文章:https://mp.weixin.qq.com/s/qjMphuPiihBmU2QtFMIfzw