Eureka源码-服务端初始化

152 阅读2分钟

服务端初始化

在项目依赖中spring-cloud-netflix-eureka-server 找到spring.factories文件

   org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
     org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration

EurekaServerAutoConfiguration初始化

@Configuration(proxyBeanMethods = false)
//EurekaServer初始化配置
@Import(EurekaServerInitializerConfiguration.class)
//对于EurekaServerMarkerConfiguration 这个就是一个标识  在@EurekaServer注册里面也进行了import
//在启动的时候EurekaServerMarkerConfiguration.Marker就会存在
@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)
@EnableConfigurationProperties({ EurekaDashboardProperties.class,
    InstanceRegistryProperties.class })
@PropertySource("classpath:/eureka/server.properties")
public class EurekaServerAutoConfiguration implements WebMvcConfigurer {
  .....
@Configuration(proxyBeanMethods = false)
public class EurekaServerInitializerConfiguration
    implements ServletContextAware, SmartLifecycle, Ordered {
  @Override
  public void start() {
    new Thread(() -> {
      try {
        // eurekaServerBootstrap在EurekaServerAutoConfiguration已经进行了初始化
        eurekaServerBootstrap.contextInitialized(
            EurekaServerInitializerConfiguration.this.servletContext);
        log.info("Started Eureka Server");
      }catch (Exception ex) {
      }
    }).start();
  }
}

EurekaServerBootStrap类中的contextInitialized方法

//设置一些eureka的配置信息
initEurekaEnvironment();
//初始化Eureka Server context,也会从临近的eureka server 节点copy对应的注册信息
// int registryCount = this.registry.syncUp();
initEurekaServerContext();

EurekaServerContext初始化

@Bean
@ConditionalOnMissingBean
public EurekaServerContext eurekaServerContext(ServerCodecs serverCodecs,
			PeerAwareInstanceRegistry registry, PeerEurekaNodes peerEurekaNodes) {
		return new DefaultEurekaServerContext(this.eurekaServerConfig, serverCodecs,
				registry, peerEurekaNodes, this.applicationInfoManager);
}

DefaultEurekaServerContext中核心代码如下:

/**
 * 表示本地server 上下文,并提供组件的get方法
 */
@Singleton
public class DefaultEurekaServerContext implements EurekaServerContext {
    //省去了构造器和一些getter等方法
    @PostConstruct
    @Override
    public void initialize() {
        //eureka server节点启动
        peerEurekaNodes.start();
        //registry初始化,具体执行的试PeerAwareInstanceRegistryImpl#init方法
        registry.init(peerEurekaNodes);
    }
}

PeerEurekaNodes#start详解

默认情况下 每10分钟定时更新PeerEurekaNode

public void start() {
  //初始化任务执行器 
  taskExecutor = Executors.newSingleThreadScheduledExecutor(
    ...
  );
  try {
    //更新节点信息
    updatePeerEurekaNodes(resolvePeerUrls());
    Runnable peersUpdateTask = new Runnable() {
      @Override
      public void run() {
        updatePeerEurekaNodes(resolvePeerUrls());
      }
    };
    //定时更新节点信息
    taskExecutor.scheduleWithFixedDelay(
      peersUpdateTask,
      //Eureka节点之间更新信息 默认试10分钟
      serverConfig.getPeerEurekaNodesUpdateIntervalMs(),
      serverConfig.getPeerEurekaNodesUpdateIntervalMs(),
      TimeUnit.MILLISECONDS
    );
  }
}

PeerAwareInstanceRegistryImpl初始化

@Override
public void init(PeerEurekaNodes peerEurekaNodes) throws Exception {
  this.numberOfReplicationsLastMin.start();
  this.peerEurekaNodes = peerEurekaNodes;
  initializedResponseCache();
  //定时更新租约阀值
  scheduleRenewalThresholdUpdateTask();
  //如果配置了远程region,则把远程region的中设置到regionNameVSRemoteRegistry
  initRemoteRegionRegistry();
}

总结

  • EurekaServer端加入了@EnableEurekaServer ,则会创建bean EurekaServerMarkerConfiguration.Marker
  • 有了Markerbean了,也就是激活了EurekaServerAutoConfiguration,在该类中创建EurekaServerBootstrap、PeerAwareInstanceRegistry、PeerEurekaNodes、EurekaServerContext等核心类
  • EurekaServerBootstrap会做一些初始化动作 eurekaServer上下文初始化设置等
  • EurekaServerContext进行创建初始化的时候:启动peerEurekaNodes、初始化PeerAwareInstanceRegistry