Eureka的一些概念:
Register:服务注册
当eureka client向eureka server注册时,它提供了自身的元数据,比如ip地址、端口、运行状况指示符URL、主页等。当eureka client启动的时候,会自动将自身的信息发送到eureka server。引入eureka-client的jar包,里面有个类DiscoveryClient,这个包含client向server注册的方法register()。服务注册并不是马上注册,跟踪源码,我们发现,服务注册会默认延迟40秒
public int getInitialInstanceInfoReplicationIntervalSeconds() {
return configInstance.getIntProperty(
namespace + INITIAL_REGISTRATION_REPLICATION_DELAY_KEY, 40).get();
}
Renew:服务续约
eureka client 每隔30秒发送一次心跳来续约。通过续约来告知eureka server,这个client仍然在存在。没有出现异常,如果连续90秒,server没有收到来自client的续约,那么server将会从服务列表中,将其删除,建议不要更改续约时间。续约调用的也是DiscoveryClient类的renew()方法。服务端的续约是在eureka-core的InstanceResource类,接口方法为renewLease(),它是REST接口。
Fetch registries:获取服务注册列表信息
eureka client可以请求服务器server,获取服务注册列表信息,将其缓存在本地。客户端client会使用该信息查找其他服务,从而进行远程调用。该注册列表信息定期每隔30秒,会更新一次,可以通过修改参数eureka.server.responseCacheUpdateIntervalMs来修改时间。返回的服务列表信息,可能和客户端缓存的信息不一样,客户端会自动处理。由于某种原因,客户端不会自动更新的时候,客户端会重新获取整个注册表信息。客户端和服务器之间用json/xml格式进行通信。
cancle:服务下线
eureka client在程序关闭时向eureka 服务器发送取消请求。发送请求后,该客户端实例信息从服务器实例注册表中删除。该下线请求不会自动完成。它需要调用以下内容
DiscoveryManager.getInstance().shutdownComponent();
Eviction:服务剔除
在默认情况下,当eureka client连续90秒没有向eureka server发送续约,也就是心跳,eureka 服务器会将该服务实例从服务列表中剔除,即服务删除
Eureka 的自我保护模式
当一个新的Eureka Server出现时,它尝试从相邻节点获取所有实例注册表信息。如果从Peer节点获取信息时出现问题,Eureka Serve会尝试其他的Peer节点。如果服务器能够成功获取所有实例,则根据该信息设置应该接收的更新阈值。如果有任何时间,Eureka Serve接收到的续约低于为该值配置的百分比(默认为15分钟内低于85%,会统计服务的心跳比率,如果15分钟内心跳比率低于85%,就会进入自我保护模式),则服务器开启自我保护模式,即不再剔除注册列表的信息。
这样做的好处就是,如果是Eureka Server自身的网络问题,导致Eureka Client的续约不上,Eureka Client的注册列表信息不再被删除,也就是Eureka Client还可以被其他服务消费。