Eureka源码--Eureka Client
Eureka Server与Eureka Client之间的维系主要通过心跳的方式实现,心跳(Heartbeat)即Eureka Client定时向Eureka Server汇报当前的本服务实例的状态。Eureka Server需要随时维持最新的服务实例信息,所以在注册表中的每个服务实例都需要定期发送心跳到Server中以使自己的注册保持最新的状态(数据一般直接保存在内存中)。这意味着Eureka Client不需要为每次服务间请求都向注册中心请求依赖服务实例信息,Eureka Client将定时从Eureka Server中拉取Eureka Server中的注册表中的所有信息,并将注册表信息缓存到本地,用于服务发现。
Eureka Client定时发送服务注册、心跳连接、服务下架请求,和eureka服务端进行通信。在client中,可以配置备用服务器地址,如果client无法从主服务器中获取注册信息时,则会尝试从备用服务器中获取。可以使用shouldFetchRegistry关闭服务发现功能,这样该客户端就不会去注册中心获取注册信息,只会把自己注册到eureka服务端中。
客户端需要重点关注以下几点:
从Eureka Server中拉取注册表信息
全量拉取注册表信息
增量式拉取注册表信息
注册表缓存刷新定时器与续约(心跳)定时器
服务注册与服务按需注册
服务实例的下线
查看spring-cloud-netflix-eureka-client的src/main/resource.META-INF/spring.factories,查看Eureka Client有哪些自动配置类:
排除掉与配置中心相关的自动配置类,从中可以找到三个与Eureka Client密切相关的自动配置类:EurekaClientAutoConfiguration、RibbonEurekaAutoConfiguration、EurekaDiscoveryClientConfiguration。下面分别对这些类做一个分析,看一下一个eureka client需要做哪些初始化配置。
EurekaClientAutoConfiguration
Eureke Client的自动配置类,负责了Eureka Client中关键的bean的配置和初始化。
EurekaClientConfig
提供了Eureka Client注册到Eureka Server所需要的配置信息,SpringCloud为其提供了一个默认配置类的EurekaClientConfigBean,可以在配置文件中通过前缀eureka.client+属性名进行覆盖。
ApplicationInfoManager
该类管理了服务实例的信息类InstanceInfo,其内包括Eureka Server上的注册表所需要的信息,代表了每个Eureka Client提交到注册中心的数据,用以供服务发现。同时管理了实例的配置信息EurekaInstanceConfig,SpringCloud提供了一个EurekaInstanceConfigBean的配置类进行默认配置,也可以在配置文件application.yml中通过eureka.instance+属性名进行自定义配置。
EurekaInstanceConfigBean
继承了EurekaInstanceConfig接口,是Eureka Client注册到服务器上需要提交的关于服务实例自身的相关信息,主要用于服务发现:
通常这些信息在配置文件中的eureka.instance前缀下进行设置,SpringCloud通过EurekaInstanceConfigBean配置类提供了相关的默认配置。以下是一些比较关键的属性,这些信息都将注册到注册中心上。
与服务注册中心交换信息
在EurekaClientAutoConfiguration的配置类中注入了EurekaDiscoveryClient,EurekaDiscoveryClient继承了DiscoveryClient,DiscoveryClient来源于spring-cloud-client-discovery,是SpringCloud中定义的用来服务发现的顶级接口,在SpringCloud的各类服务发现组件中(如Netflix Eureka或者Consul)都有相应的实现。通过查看EurekaDiscoveryClient中的代码,会发现它是通过组合类EurekaClient实现接口的功能。
它提供从服务注册中心中根据serviceId的获取到对应的服务实例信息的能力。当一个服务实例拥有DiscoveryClient的具体实现时,就可以从Eureka Server中发现其他的服务实例。Eureka Client中注入了DiscoveryClient,并从Eureka Server获取服务实例的信息。其中,有三个线程池的任务类,一个用于心跳连接,一个用于服务发现,这两个封装到了scheduler,schedule用于管理它们。
下面的代码就是用来从备用服务器中获取服务的,备用服务器可以在配置文件中配置。
全量拉取:把eureka的所有注册信息全部拉取下来;增量拉取:把eureka最近更新(默认3分钟,可配置)的注册信息拉取下来。以全量拉取还是以增量拉取是可以配置的,可以配置只拿全量,不拿增量。下面就是服务发现的主要逻辑实现。