SpringCloud Eureka服务注册
什么是Eureka?
Eureka是基于REST(具像状态传输)的服务,主要用于AWS云中定位服务,以实现中间层服务器的负载平衡和故障转移。我们将此服务称为Eureka服务器。当然现在大部分公司都用它来当做微服务发现的模块。Eureka还附带了一个基于java的客户端组件Eureka客户端,这使得与服务的交互更加容易。
下图为Eureka服务端和客户端的交互图
上面的架构描述了Eureka在Netflix上的部署方式,这是您通常运行它的方式。每个区域有一个eureka集群,它只知道该区域中的实例。每个区域至少有一个eureka服务器来处理区域故障。服务在Eureka注册,然后每30秒发送一次心跳来续签租约。如果客户端有几次无法续订租约,那么它将在大约90秒内从服务器注册表中取出。将注册信息和更新复制到集群 中的所有eureka节点。任何区域的客户机都可以查找注册表信息(每30秒发生一次)来定位其服务(可能在任何区域)并进行远程调用。
1 对于非java的服务和客户端
对于非基于Java的服务,您可以选择用其服务语言实现eureka的客户端部分,或者您可以运行一个sideCar,它本质上是一个Java应用程序,带有一个处理注册和心跳的嵌入式eureka客户端。基于REST的端点还公开给Eureka客户机支持的所有操作。非java客户机可以使用REST端点查询关于其他服务的信息。
2 理解eureka客户端服务器通信
Register:服务注册
当Eureka客户端向Eureka Server注册时,它提供自身的元数据,比如IP地址、端口,运行状况指示符URL,主页等。
Renew:服务续约
Eureka客户会每隔30秒发送一次心跳来续约。 通过续约来告知Eureka Server该Eureka客户仍然存在,没有出现问题。 正常情况下,如果Eureka Server在90秒没有收到Eureka客户的续约,它会将实例从其注册表中删除。 建议不要更改续约间隔。
Fetch Registries:获取注册列表信息
Eureka客户机从服务器获取注册表信息并在本地缓存它。之后,客户端使用这些信息来查找其他服务。通过获取上一个获取周期和当前获取周期之间的增量更新,定期(每30秒)更新此信息。delta信息在服务器中保存的时间更长(大约3分钟),因此获取的delta可能再次返回相同的实例。Eureka客户端自动处理重复的信息。
在获得增量之后,Eureka客户机通过比较服务器返回的实例计数来与服务器协调信息,如果由于某种原因信息不匹配,则再次获取整个注册表信息。Eureka服务器缓存delta、整个注册表以及每个应用程序的压缩有效负载和未压缩信息。负载还同时支持JSON/XML格式。Eureka客户端使用jersey apache客户端以压缩JSON格式获取信息。
Cancel:服务下线
在停机时,Eureka客户端向Eureka服务器发送一个取消请求。这将从服务器的实例注册表中删除该实例,从而有效地从通信流中删除该实例。这是在Eureka客户端关闭时完成的,应用程序应该确保在关闭期间调用以下命令。
DiscoveryManager.getInstance().shutdownComponent();
Eviction 服务剔除
在默认的情况下,当Eureka客户端连续90秒没有向Eureka服务器发送服务续约,即心跳,Eureka服务器会将该服务实例从服务注册列表删除,即服务剔除。
参考:https://github.com/Netflix/eureka/wiki/Eureka-REST-operations
3 理解Eureka点对点通信
集群同步类型:
Heartbeat :心跳续约
Register : 注册
Cancel : 下线
StatusUpdate : 添加覆盖状态
DeleteStatusOverride : 删除覆盖状态
Eureka客户端试图与同一区域的Eureka服务器通信。如果与服务器的对话出现问题,或者服务器不在同一区域,则客户机将故障转移到其他区域的服务器。
一旦服务器开始接收流量,在服务器上执行的所有操作将复制到服务器所知道的所有对等节点。如果某个操作由于某种原因失败,则在服务器之间复制的下一个心跳上协调信息。
当Eureka服务器启动时,它试图从邻近节点获取所有实例注册表信息。如果从节点获取信息存在问题,服务器会在放弃之前尝试所有的对等点。如果服务器能够成功地获取所有实例,它将根据这些信息设置应该接收的更新阈值。如果任何时候,续订低于为该值配置的百分比(在15分钟内低于85%),服务器将停止实例过期以保护当前实例注册中心信息。
在Netflix中,上述保护称为自我保护模式,主要用于在一组客户机和Eureka服务器之间存在网络分区故障的情况下进行保护。在这些场景中,服务器试图保护它已经拥有的信息。
1、Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
2、Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
3、当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。