Eureka使用及集群部署

3,715 阅读4分钟

概述: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上。

这里需要注意的是,如果我们需要通过ip互相注册,则eureka.client.instance.hostname主机名不要配,因为默认是以主机名方式注册,同时需要设置eureka.instance.prefer-ip-address=true,默认false。 如果我们需要通过主机名互相注册,则需要使用hostname。(示例使用的域名方式注册)

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

服务注册:注册之后复制到其他所有节点

, 服务更新:

从源码可以看到更新操作其实是执行了一遍replicateToPeers方法执行心跳动作,也就是重新向server发送心跳,续约。

服务取消:

从源码可以看到服务取消就是调用replicateToPeers方法执行取消动作。 服务超时:

从源码可以看到服务取消就是调用replicateToPeers方法执行更新服务状态动作。

Eureka Server保护机制:

Eureka Server自我保护机制是指当由于网络等各方面原因导致Eureka Server每分钟应收到的心跳数小于实际收到的心跳数,会触发Eureka Server的保护机制,所有服务都不会移除下线。

在这里需要解释一下应收到的心跳数如何计算:

在Eureka监控界面有Renews threshold和Renews(last min),Renews threshold指eureka server期望收到的心跳数,根据eureka的配置, LeaseRenewalIntervalInSeconds :eureka客户端发送心跳的频率,默认30s LeaseExpirationDurationInSeconds:eureka server多久接收不到心跳清除instance实例,默认90s RenewalPercentThreshold:eureka server 阈值因子,默认是 0.85 ,如果阈值比最小值大,则自我保护模式开启

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