Skip to content
字数
811 字
阅读时间
4 分钟

Eureka客户端流程。

1.根据配置文件初始化bean,创建客户端实例信息 InstanceInfo

2.第一次全量拉取注册中心服务列表(url=/apps),初始化周期任务:

2.1 CacheRefreshThread 定时刷新本地缓存服务列表,若是客户端第一次拉取,则会全量拉取,后面则增量拉取.若增量拉取失败则全量拉取,配置属性为eureka.client.registryFetchIntervalSeconds=30默认拉取一次;

2.2 HeartbeatThread 通过renew()续约任务,维持于注册中心的心跳(url=/apps/ {id}),若返回状态码为404则说明该服务实例没有在注册中心注册,执行register()向注册中心注册实例信息;

2.3 ApplicationInfoManager.StatusChangeListener 注册实例状态监听类,监听服务实例状态变化,向注册中心同步实例状态;

2.4 InstanceInfoReplicator 定时刷新实例状态,并向注册中心同步,默认eureka.client.instanceInfoReplicationIntervalSeconds=30执行一次.若实例状态有变更,则重新执行注册;

服务注册

EurekaServer通过@EnableEurekaServer 激活。注解可以导入EurekaServerMarkerConfifiguration配置类实例化了一个Marker的bean对象,此对象是实例化核心配置类的前提条件。

EurekaServerAutoConfiguration 是Eureka服务端的自动配置类,这个配置类实例化的前提条件是上下文中存EurekaServerMarkerConfifiguration.Marker 这个bean,通过@EnableConfifigurationProperties({ EurekaDashboardProperties.class, InstanceRegistryProperties.class })导入了两个配置类

  1. EurekaDashboardProperties : 配置 EurekaServer的管控台

  2. InstanceRegistryProperties : 配置期望续约数量和默认的通信数量

  3. 通过@Import({EurekaServerInitializerConfiguration.class})引入启动配置类

    EurekaServerInitializerConfifiguration实现了SmartLifecycle,也就意味着Spring容器启动时会去执行start()方法。加载所有的EurekaServer的配置

EurekaServerAutoConfifiguration实例化了以下重要的class:

EurekaController:EurekaServer的管控台的Controller类

EurekaServerBootstrap:

FilterRegistrationBean:jersey相关配置类,其中jerseyApplication 方法,在容器中存放了一个jerseyApplication对象,jerseyApplication()方法里的东西和Spring源码里扫描@Component逻辑类似,扫描@Path和@Provider标签,然后封装成beandefifinition,封装到Application的set容器里。通过fifilter过滤器来过滤url进行映射到对象的Controller

Jersey暴漏接口

服务端接受客户端的注册:在ApplicationResource.addInstance()方法中可以看到 this.registry.register(info, "true".equals(isReplication));父类的register方法可以看到整个注册的过程

服务端接受客户端的续约

在InstanceResource的renewLease方法中完成客户端的心跳(续约)处理,其中最关键的方法就是this.registry.renew(this.app.getName(), this.id, isFromReplicaNode),父类的renew方法可以看到整个续约的过程

服务剔除:在AbstractInstanceRegistry.postInit()方法,在此方法里开启了一个每60秒调用一次EvictionTask.evict()的定时器。

服务发现

自动装载:在服务消费者导入的坐标中有 spring-cloud-netflix-eureka-client-2.1.0.RELEASE.jar 找到其中的 spring.factories 可以看到所有自动装载的配置类

服务注册:register()

服务下架:@PreDestroy shutdown()

心跳续约: 在com.netflix.discovery.DiscoveryClient.HeartbeatThread中定义了续约的操作,查看renew()方 法,首先向注册中心执行了心跳续约的请求,StatusCode为200成功,若为404则执行register()重新注册操作;