1、服务注册
在微服务架构中,一个服务提供者本质上也是一个Eureka
客户端。启动时,会调用Eureka所提供的服务注册相关方法,向Eureka
服务器注册自己的信息。同时,在Eureka
服务器会维护一个已注册的服务列表。注册服务列表使用一个嵌套HashMap
保存信息,数据结构如下:
HashMap
的第一层为应用名称和对应的服务实例。HashMap
的第二层为服务实例及其对应的注册信息,包括宿主服务IP
地址、服务端口、运行状况指示符、URL
等数据。
当服务实例状态发生变化时(如微服务自身检测认为服务不可用的时候),就会向Eureka
服务器更新自己的服务状态,同时用replicateToPeers()向其他Eureka
服务器节点做状态同步。
但是,当我们在服务配置文件中将eureka.client.register-with-eureka
属性配置为false
时,则不会执行上述的处理。
2、服务续约(心跳机制)
当服务启动并成功注册到Eureka
服务器后,Eureka
客户端会默认以每隔30
秒的频率向Eureka
服务器发送一次心跳。
发送心跳起始就是执行服务续约(Renew)操作,避免自己的注册信息被Eureka
服务器剔除。续约的处理逻辑和与服务注册逻辑基本一致:首先更新自身状态,然后同步到其他Eureka服务器节点。
eureka.instance.lease-renewal-interval-in-seconds=30 #默认
对于Eureka服务器来说如果在默认的时间内(90
秒),也就是连续3
次没有收到客户端的心跳,则会将该服务实例从所维护的服务注册表中剔除,以禁止流向该实例的流量。不过,如果当Eureka服务器处于自我保护模式,则不会清除该服务实例信息。
eureka.instance.lease-expiration-duration-in-seconds=90 #默认
TIPS: 注意,如果该值设置得太大,即使服务实例已经不存在,也可能会有流量路由到该服务实例,造成服务调用失败。而如果设置太小,很可能因为网络问题导致服务实例误被Eureka服务器从服务注册表中剔除。因此,Eureka官方建议我们最好不要修改这两个属性的配置。
3、服务下线与踢出
当服务实例关闭时,服务实例会先向Eureka服务器发送服务下线请求。发送请求后,该服务实例信息将从Eureka服务器的实例注册表中删除。
4、服务获取
Eureka
客户端在启动时会从Eureka
服务器中获取注册表信息,并将其缓存在本地。
Eureka
客户端会使用该信息查找相应的服务,并进行调用。该注册列表信息定期(默认为30
秒)从Eureka服务器进行同步。每次返回注册列表信息可能与Eureka
客户端的缓存信息不同,由Eureka
客户端自动处理。
如果由于某种原因导致注册列表信息不能及时匹配,Eureka
客户端则会重新获取整个注册表信息。
Eureka
服务器缓存注册列表信息,并对整个注册表及其中的每一个服务实例信息进行压缩,压缩内容和没有压缩的内容完全相同。
Eureka
客户端和Eureka
服务器可以使用JSON/XML
格式进行通信。在默认的情况下Eureka
客户端使用压缩JSON
格式来获取注册列表的信息。