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 })导入了两个配置类
EurekaDashboardProperties : 配置 EurekaServer的管控台
InstanceRegistryProperties : 配置期望续约数量和默认的通信数量
通过@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()重新注册操作;