1.Eureka是一个服务注册和发现模块
(1)使用Eureka实现服务治理
(2)Eureka分为服务端和客户端
(3)一个基于 REST 的服务,用于定位服务
2.Eureka的一些概念
(1)Register:服务注册
<1>当Eureka客户端向Eureka Server注册时,它提供自身的元数据
<2>元数据包含:IP地址、端口,运行状况指示符URL,主页等
(2)Renew:服务续约
<1>Eureka客户会每隔30秒发送一次心跳来续约
<2>通过续约来告知Eureka Server该Eureka客户仍然存在,没有出现问题
<3>Eureka Server在90秒没有收到Eureka客户的续约,它会将实例从其注册表中删除
(3)Fetch Registries:获取注册列表信息
<1>Eureka客户端从服务器获取注册表信息,并将其缓存在本地
<2>客户端会使用该信息查找其他服务,从而进行远程调用
<3>该注册列表信息定期(每30秒钟)更新一次
<4>每次返回注册列表信息可能与Eureka客户端的缓存信息不同,Eureka客户端自动处理
<5>由于某种原因导致注册列表信息不能及时匹配,Eureka客户端则会重新获取整个注册表信息
<6>Eureka客户端和Eureka 服务器可以使用JSON/XML格式进行通讯
<7>在默认的情况下Eureka客户端使用压缩JSON格式来获取注册列表的信息
(3) Cancel:服务下线
<1>Eureka客户端在程序关闭时向Eureka服务器发送取消请求
<2>发送请求后,该客户端实例信息将从服务器的实例注册表中删除
<3>该下线请求不会自动完成,它需要调用以下内容:
DiscoveryManager.getInstance().shutdownComponent();
(4)Eviction 服务剔除
<1>默认情况下,当Eureka客户端连续90秒没有向Eureka服务器发送服务续约(即心跳)
<2>Eureka服务器会将该服务实例从服务注册列表删除,即服务剔除
3.Eureka Client注册一个实例为什么这么慢
(1)Eureka Client一启动(不是启动完成),不是立即向Eureka Server注册
<1>它有一个延迟向服务端注册的时间,默认的延迟时间为40秒
(2)Eureka Server的响应缓存
<1>Eureka Server维护每30秒更新的响应缓存
<2>所以实例刚刚注册,它不会出现在调用/eureka/apps REST端点的结果中
(3)Eureka Server刷新缓存
<1>Eureka客户端保留注册表信息的缓存,该缓存每30秒更新一次
<2>因此,客户端决定刷新其本地缓存并发现其他新注册的实例可能需要30秒
(4)LoadBalancer刷新Ribbon负载平衡器从本地客户端获取服务注册列表信息
<1>此缓存每30秒刷新一次
<2>所以,可能需要30多秒才能使用新注册的实例
(5)综上几个因素:
<1>一个新注册的实例,不能马上被Eureka Server发现
<2>刚注册的Eureka Client也不能立即被其他服务调用
4.Eureka 的自我保护模式
(1)当一个新的Eureka Server出现时,它尝试从相邻节点获取所有实例注册表信息
<1>如果从Peer节点获取信息时出现问题,Eureka Serve会尝试其他的Peer节点
<2>如果服务器能够成功获取所有实例,则根据该信息设置应该接收的更新阈值
<3>如果Eureka Serve接收到的续约低于为该值配置的百分比
<4>则服务器开启自我保护模式,即不再剔除注册列表的信息