服务端初始化
在项目依赖中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