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()); } }
相关文章推荐
- (三)SpringBoot+SpringCloud —— 高可用的Eureka注册中心
- Spring Cloud Spring Boot mybatis 企业分布式微服务云(一)服务注册与发现(Eureka)【Dalston版】
- (四)SpringBoot+SpringCloud —— Eureka注册中心的机制与配置
- (二)SpringBoot+SpringCloud —— 使用Eureka实现服务注册与发现
- springboot-cloud-1-eureka
- springboot-cloud-8-ribbon-source
- Spring cloud eureka+Client+Spring boot admin 服务注册监控
- Spring Cloud Spring Boot mybatis 企业分布式微服务云(一)服务注册与发现(Eureka)【Dalston版】
- spring-cloud-eureka-server之spring-cloud-1.3.4(Dalston.SR3)-boot(1.5.6) 学习笔记
- spring-cloud-eureka-client之spring-cloud-1.3.4(Dalston.SR3)-boot(1.5.6) 学习笔记
- 学习SPRING BOOT, SPRING CLOUD之Eureka和security
- 传统Java Web非Spring Boot项目从Spring Cloud Eureka中获取服务
- spring cloud eureka-server搭建
- Spring Cloud Spring Boot mybatis分布式微服务云架构(三十九)对log4j进行多环境不同日志级别的控制
- Spring Cloud Spring Boot mybatis分布式微服务云架构(十三)使用Spring Security安全控制
- Spring Cloud Eureka 入门 (三)服务消费者详解
- spring cloud-将spring boot服务注册到Eureka Server上
- SpringCloud Eureka参数配置项详解(转)
- spring cloud: 使用consul来替换eureka
- 每天学点SpringCloud(一):使用SpringBoot2.0.3整合SpringCloud