概述:Eureka是SpringCloud全家桶中一个主要组件,用于服务的注册与发现,近期公司打算重构微服务架构,对Eureka集群部署做了一番研究。
Eureka 是 Netflix 开源的服务注册发现组件,服务端通过 REST 协议暴露服务,提供应用服务的注册和发现的功能。
所有的Eureka服务都被称为实例(instance)。Eureka包含Eureka Server和Eureka Client
EurekaClient又分为服务提供者(Service Provider)和服务消费者(Service Consumer),每个client都可视为一个instance(实例) Service Provider :服务提供者,向 Eureka-Server 注册自身服务、续约(发送心跳)、下线等操作 Service Consumer:服务消费者,它从Eureka-Server获取服务列表,分为全量获取和增量获取。
Eureka Server接收到心跳时,会更新对应的服务实例的信息,如果实例信息发生变化,则将实例加入最近变更实例队列中。服务消费者会创建一个timer定时更新服务实例,第一次全量拉取服务实例,之后就是增量拉取,也就是从变更队列拉取变更实例信息。
Eureka Server集群部署
在生产环境中,由于外界或网络因素,单节点Server可能并不适用,支持集群部署体现出了Eureka的高可用性。
多个Eureka Server相互注册,组成一个集群,通过eureka.client.service-url.defaultZone配置,把每个eureka-server视为一个服务提供者注册到其他server上。

Eureka配置
-
eureka.instance.*: Eureka实例配置,Eureka不论是做Server,Client都需要的公共配置项。对应的配置类为org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean。
-
eureka.server.*: Eureka Server配置的选项,即使用eureka做注册中心时才需要配置这个选项。对应的配置类为org.springframework.cloud.netflix.eureka.EurekaServerConfigBean。
-
eureka.client.*: Eureka Client配置的选项,即服务需要向注册中心注册或使用注册中心中的服务时才需要配置这些选项。对应的配置类为org.springframework.cloud.netflix.eureka.server.EurekaClientConfigBean
Eureka Client
Eureka Client分为服务提供者与服务消费者两个角色,client端注册Eureka需要把集群地址配在eureka.client.service-url.defaultZone上,其实也可以配置某一个Eureka Server上,因为Eureka Server的服务同步机制。
Eureka Server服务同步
每个Eureka服务发生变化时,各个服务之间定时同步,中间过程中每个服务可能不一致,最终会保证服务的一致性。
为保证集群中所有Eureka Server节点的状态同步,所有以下操作都会同步到集群的所有服务上:服务注册(Registers),服务更新(Renewals),服务取消(Cancels),服务超时(Expirations)和服务状态变更(Status Changes)。 具体是com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl
服务注册:注册之后复制到其他所有节点


服务取消:


Eureka Server保护机制:
Eureka Server自我保护机制是指当由于网络等各方面原因导致Eureka Server每分钟应收到的心跳数小于实际收到的心跳数,会触发Eureka Server的保护机制,所有服务都不会移除下线。
在这里需要解释一下应收到的心跳数如何计算:

假如有3个实例注册在eureka server上,那么正常情况下Renews(last min)即每分钟接收到的心跳数就是6,期望接收到的心跳数就是
6*0.85=5.1,那么期望接收到的心跳数就是5(如果不为整数,就是去尾法),当最近1分钟接收到的心跳数小于期望心跳数,就会开启保护机制。