您的位置:首页 > 编程语言 > Java开发

springboot-cloud-7-eureka-source

2017-09-14 15:55 260 查看

pre start

开始EnableEurekaClient注解


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
// 导入EnableDiscoveryClientImportSelector 配置
@Import({EnableDiscoveryClientImportSelector.class})
public @interface EnableDiscoveryClient {
boolean autoRegister() default true;
}


主要是加载配置文件到达开启服务
selectImports : 如xml中import 其它xml文件
selectImports: 加载META-INF/spring.factories 的类


//加载配置 如xml中配置 import(spring bean生命周期 )
public String[] selectImports(AnnotationMetadata metadata) {
String[] imports = super.selectImports(metadata);
AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(this.getAnnotationClass().getName(), true));
boolean autoRegister = attributes.getBoolean("autoRegister");
if(autoRegister) {
List<String> importsList = new ArrayList(Arrays.asList(imports));
importsList.add("org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration");
imports = (String[])importsList.toArray(new String[0]);
}

return imports;
}
//开启条件 配置 spring.cloud.discovery.enabled = true
protected boolean isEnabled() {
return ((Boolean)(new RelaxedPropertyResolver(this.getEnvironment())).getProperty("spring.cloud.discovery.enabled", Boolean.class, Boolean.TRUE)).booleanValue();
}


// String[] imports = super.selectImports(metadata);
//执行父类的加载 会执行META-INF/spring.factories 中的配置文件
List<String> factories = new ArrayList(new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames(this.annotationClass, this.beanClassLoader)));


开启默认配置
spring.cloud.service-registry.auto-registration =true


@Configuration
//开启配置  加载AutoServiceRegistrationProperties
@EnableConfigurationProperties({AutoServiceRegistrationProperties.class})
public class AutoServiceRegistrationConfiguration {
public AutoServiceRegistrationConfiguration() {
}
}


server start EurekaServerAutoConfiguration

@Import(EurekaServerInitializerConfiguration.class) 导入配置
其中继承SmartLifecycle 加入spring生命周期


@Override
public void start() {
new Thread(new Runnable() {
@Override
public void run() {
try {
//TODO: is this class even needed now?
//初始化加载                 eurekaServerBootstrap.contextInitialized(EurekaServerInitializerConfiguration.this.servletContext);
log.info("Started Eureka Server");

publish(new EurekaRegistryAvailableEvent(getEurekaServerConfig()));
EurekaServerInitializerConfiguration.this.running = true;
publish(new EurekaServerStartedEvent(getEurekaServerConfig()));
}
catch (Exception ex) {
// Help!
log.error("Could not initialize Eureka servlet context", ex);
}
}
}).start();
}

protected void initEurekaServerContext() throws Exception {
//省略xml解析
EurekaServerContextHolder.initialize(this.serverContext);

log.info("Initialized server context");

// Copy registry from neighboring eureka node
//同步相邻服务下的节点信息
int registryCount = this.registry.syncUp();
//注册自己为up状态 开启任务renew 与 ecic 任务
this.registry.openForTraffic(this.applicationInfoManager, registryCount);

// Register all monitoring statistics.
EurekaMonitors.registerAllStats();
}
// 定时renew 与 evic 任务
protected void postInit() {
renewsLastMin.start();
if (evictionTaskRef.get() != null) {
evictionTaskRef.get().cancel();
}
evictionTaskRef.set(new EvictionTask());
evictionTimer.schedule(evictionTaskRef.get(),
serverConfig.getEvictionIntervalTimerInMs(),
serverConfig.getEvictionIntervalTimerInMs());
}


DefaultEurekaServerContext

@PostConstruct
@Override
public void initialize() throws Exception {
logger.info("Initializing ...");
peerEurekaNodes.start();
registry.init(peerEurekaNodes);
logger.info("Initialized");
}

public void start() {
taskExecutor = Executors.newSingleThreadScheduledExecutor(
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r, "Eureka-PeerNodesUpdater");
thread.setDaemon(true);
return thread;
}
}
);
try {
//resolvePeerUrls  serverUrl 地址
updatePeerEurekaNodes(resolvePeerUrls());
Runnable peersUpdateTask = new Runnable() {
@Override
public void run() {
try {
updatePeerEurekaNodes(resolvePeerUrls());
} catch (Throwable e) {
logger.error("Cannot update the replica Nodes", e);
}

}
};
taskExecutor.scheduleWithFixedDelay(
peersUpdateTask,
serverConfig.getPeerEurekaNodesUpdateIntervalMs(),
serverConfig.getPeerEurekaNodesUpdateIntervalMs(),
TimeUnit.MILLISECONDS
);
} catch (Exception e) {
throw new IllegalStateException(e);
}
for (PeerEurekaNode node : peerEurekaNodes) {
logger.info("Replica node URL:  " + node.getServiceUrl());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  eureka