Eureka分为 Eureka Server、 Eureka Client。
1.服务提供者作为客户端,在启动时,会将自己的信息(元数据:ip、port、服务名等等)传送给服务端。
服务端会将此信息保存到map中。服务提供者会每隔30s向服务端发送心跳检测,如果90s内服务端没有收到客户端的心跳,就会将该实例剔除。
2.服务消费者会从注册中心拉取对应服务的信息,并存入本地做缓存。如果对应服务的信息发生改变,注册中心会重新通知消费者重新拉取。
3.服务端一般是集群化,来保证高可用。每当服务端收到注册信息后,会在集群和分区内进行数据同步。
元数据
Eureka的元数据有两种:标准元数据和⾃定义元数据。
- 标准元数据: 主机名、 IP地址、端⼝号等信息,这些信息都会被发布在服务注册表
中,⽤于服务之间的调⽤。 - ⾃定义元数据: 可以使⽤eureka.instance.metadata-map配置,符合KEY/VALUE的
存储格式。这 些元数据可以在远程客户端中访问。
客户端
服务提供者(也是Eureka客户端)要向EurekaServer注册服务,并完成服务续约等⼯作。
服务注册
1)当我们导⼊了eureka-client依赖坐标,配置Eureka服务注册中⼼地址
2)服务在启动时会向注册中⼼发起注册请求,携带服务元数据信息
3) Eureka注册中⼼会把服务的信息保存在Map中。
服务续约(服务提供者)
服务每隔30秒(默认)会向注册中心续约(心跳)一次,如果没有续约,租约在90秒后到期,然后服务会被失效。
此过程被称为心跳检测。
获取服务列表(服务消费者)
每个30秒服务会从注册中心中拉取一份服务列表,这个时间可以通过配置修改。
- 服务消费启动时,从EurekaServer服务列表获取只读备份,缓存到本地。(获取元数据?)
- 每隔30秒,会重新获取并更新数据
服务端
服务下线
1)当服务正常关闭操作时,会发送服务下线的REST请求给EurekaServer。
2)服务中⼼接受到请求后,将该服务置为下线状态
失效剔除
服务端会定时(可配置)进行检查,当服务端在一定时间(90s)内没有收到实例的心跳,会注销此实例。
自我保护机制
当⽹络分区故障发⽣时,微服务与Eureka Server之间⽆法正常通信,⽽微服务本身是正常运⾏的,此时不应该移除
这个微服务,所以引⼊了⾃我保护机制 。
此时:
- 不会剔除任何服务实例(可能是服务提供者和EurekaServer之间⽹络问题),保证了⼤多数服务依然可⽤
- Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可⽤,当⽹络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中
- 可配置是否开启自我保护机制,默认是打开。