追根溯源-达内培训负责整理
既然找到了EurekaClientAutoConfiguration这个配置类,那么肯定有初始化和NetFlix相关类,仔细一看,就是
@Bean(destroyMethod = "shutdown")@ConditionalOnMissingBean(value = EurekaClient.class, search = SearchStrategy.CURRENT)@org.springframework.cloud.context.config.annotation.RefreshScope@Lazypublic EurekaClient eurekaClient(ApplicationInfoManager manager, EurekaClientConfig config, EurekaInstanceConfig instance) {manager.getInfo(); // force initializationreturn new CloudEurekaClient(manager, config, this.optionalArgs,this.context);}
终于发现和NetFlix的链接的地方,CloudEurekaClient继承的DiscoveryClient其实就是NetFlix的服务发现类,这样,就可以好好分析是怎么初始化的.
直击要害
CloudEurekaClient在初始化的时候主要是调用父类DiscoveryClient的构造函数,会做很多事,其中注册服务和发现服务是通过调度任务来完成,调度任务的初始化是在initScheduledTasks这个而方法中,其中服务发现的代码
ate void initScheduledTasks() { if (clientConfig.shouldFetchRegistry()) { // registry cache refresh timer int registryFetchIntervalSeconds = clientConfig.getRegistryFetchIntervalSeconds(); int expBackOffBound = clientConfig.getCacheRefreshExecutorExponentialBackOffBound(); scheduler.schedule( new TimedSupervisorTask( "cacheRefresh", scheduler, cacheRefreshExecutor, registryFetchIntervalSeconds, TimeUnit.SECONDS, expBackOffBound, new CacheRefreshThread() ), registryFetchIntervalSeconds, TimeUnit.SECONDS); }
首先判断是否需要进行服务发现,然后通过一个定时任务去刷新缓存信息.TimedSupervisorTask是支持timeout的调度任务,刷新缓存逻辑实际是在CacheRefreshThread()中,往后看就会看到通过Http请求和Erureka服务器交互.服务注册的代码紧接着在服务发现后面
if (clientConfig.shouldRegisterWithEureka()) { ... // Heartbeat timer scheduler.schedule( new TimedSupervisorTask( "heartbeat", scheduler, heartbeatExecutor, renewalIntervalInSecs, TimeUnit.SECONDS, expBackOffBound, new HeartbeatThread() ), renewalIntervalInSecs, TimeUnit.SECONDS); // InstanceInfo replicator instanceInfoReplicator = new
以上就是达内培训给大家做的内容详解,更多关于IT知识的学习,请继续关注达内培训