原始碼剖析 啟動Eureka Server(一)@EnableEurekaServer註解
Spring Cloud Netflix Eureka專案將Netflix公司的Eureka專案加以封裝,以適配Spring Boot自動化配置的機制,通過註解在Spring Boot專案啟動時啟動Eureka Server。
我們通過閱讀相關原始碼,看看這一過程是如何實現的。
回顧我們的eureka-demo中的eureka-server專案,在我們的專案啟動類Server上有一個@EnableEurekaServer註解。
@SpringBootApplication
@EnableEurekaServer
public class Server {
//...
}
檢視這個註解的定義
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(EurekaServerMarkerConfiguration.class)
public @interface EnableEurekaServer {
}
可以看到它Import匯入了EurekaServerMarkerConfiguration類
@Configuration
public class EurekaServerMarkerConfiguration {
@Bean
public Marker eurekaServerMarkerBean() {
return new Marker();
}
class Marker {
}
}
這個EurekaServerMarkerConfiguration會往Spring容器中注入一個eurekaServerMarkerBean,這個Marker是一個空類,那在這裡起到什麼作用呢?
仔細檢視這個類的註釋,可以看到它只是一個開關標記,用來啟用EurekaServerAutoConfiguration類的。
/**
* Responsible for adding in a marker bean to activate
* {@link EurekaServerAutoConfiguration}
*
* @author Biju Kunjummen
*/
檢視EurekaServerAutoConfiguration類的定義
@Configuration
@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)
@EnableConfigurationProperties({ EurekaDashboardProperties.class,
InstanceRegistryProperties.class })
@PropertySource("classpath:/eureka/server.properties")
public class EurekaServerAutoConfiguration extends WebMvcConfigurerAdapter
- @Configuration註解表示這是一個配置類,通過@Bean註解宣告一些注入到Spring IOC容器中的Bean。
- @ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class),表示只要Spring容器中有EurekaServerMarkerConfiguration.Marker.class類的例項存在,那麼就會將這個EurekaServerAutoConfiguration也注入到Spring容器中。
- @Import(EurekaServerInitializerConfiguration.class)表明它匯入了EurekaServerInitializerConfiguration這個類。
- 此外,這個EurekaServerAutoConfiguration繼承自WebMvcConfigurer,可以用來定義Spring MVC的一些配置。
在這個類中,我們並沒有發現與啟動Eureka相關的程式碼,那麼我們來看看它引入的這個EurekaServerInitializerConfiguration。
@Configuration
public class EurekaServerInitializerConfiguration
implements ServletContextAware, SmartLifecycle, Ordered {
可以看到,這也是一個配置類,同時它實現了ServletContextAware介面,可以在Servlet容器啟動後得到ServletContext容器上下文;它還實現了SmartLifecycle,這樣在spring 生命週期中會呼叫這個類相關的方法。比如在spring初始化時,會呼叫它start方法。
@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();
}
start方法中啟動了一個後臺執行緒,它會執行這一行程式碼。
eurekaServerBootstrap.contextInitialized(EurekaServerInitializerConfiguration.this.servletContext);
eurekaServerBootstrap是EurekaServerInitializerConfiguration類的成員變數,對應的類是EurekaServerBootstrap。
來看看這個類的contextInitialized方法
public void contextInitialized(ServletContext context) {
try {
initEurekaEnvironment();//初始化Eureka執行環境
initEurekaServerContext();//初始化Eureka執行上下文
context.setAttribute(EurekaServerContext.class.getName(), this.serverContext);
}
catch (Throwable e) {
log.error("Cannot bootstrap eureka server :", e);
throw new RuntimeException("Cannot bootstrap eureka server :", e);
}
}
這個方法呼叫了initEurekaEnvironment(),初始化Eureka執行環境;呼叫了initEurekaServerContext(),初始化Eureka執行上下文。關於這兩個方法的細節,我們在後面的文章再細說。
至此Eureka Server就隨著Spring容器的一起啟起了。
相關流程圖如下:
相關文章
- Spring Cloud原始碼分析之Eureka篇第二章:註冊中心啟動類上的註解EnableEurekaServerSpringCloud原始碼Server
- Eureka 原始碼分析之 Eureka Server原始碼Server
- kafka原始碼剖析(二)之kafka-server的啟動Kafka原始碼Server
- Eureka詳解系列(五)--Eureka Server部分的原始碼和配置Server原始碼
- SpringCloud元件 & 原始碼剖析:Eureka服務註冊方式流程全面分析SpringGCCloud元件原始碼
- Eureka Server啟動過程分析Server
- Flask 原始碼剖析——服務啟動篇Flask原始碼
- Spring-cloud學習筆記--- Eureka原始碼剖析之服務註冊介面SpringCloud筆記原始碼
- 【原始碼】Redis Server啟動過程原始碼RedisServer
- swoft2.0 原始碼剖析系列 01-註解器原始碼
- 註冊中心 Eureka 原始碼解析 —— 應用例項註冊發現(一)之註冊原始碼
- containerd 原始碼分析:啟動註冊流程AI原始碼
- Flutter 原始碼剖析(一)Flutter原始碼
- vue原始碼剖析(一)Vue原始碼
- Kafka 原始碼剖析(一)Kafka原始碼
- Eureka原理剖析
- Eureka詳解系列(四)--Eureka Client部分的原始碼和配置client原始碼
- Eureka原始碼分析原始碼
- gRPC-Server 啟動原始碼分析,一起弄懂它(八)RPCServer原始碼
- 精盡Spring Boot原始碼分析 - 剖析 @SpringBootApplication 註解Spring Boot原始碼APP
- 【SpringCloud】(五):服務註冊到Eureka ServerSpringGCCloudServer
- Java集合原始碼剖析——ArrayList原始碼剖析Java原始碼
- 【Java集合原始碼剖析】ArrayList原始碼剖析Java原始碼
- 【Java集合原始碼剖析】Vector原始碼剖析Java原始碼
- 【Java集合原始碼剖析】HashMap原始碼剖析Java原始碼HashMap
- 【Java集合原始碼剖析】Hashtable原始碼剖析Java原始碼
- 【Java集合原始碼剖析】TreeMap原始碼剖析Java原始碼
- 【zookeeper原始碼】啟動流程詳解原始碼
- nacos原理三-註冊中心原理&原始碼啟動.md原始碼
- 【Java集合原始碼剖析】LinkedList原始碼剖析Java原始碼
- 【Java集合原始碼剖析】LinkedHashmap原始碼剖析Java原始碼HashMap
- 剖析 React 原始碼:render 流程(一)React原始碼
- 註冊中心 Eureka 原始碼解析 —— 應用例項註冊發現(三)之下線原始碼
- 曹工說mini-dubbo(2)--分析eureka client原始碼,想辦法把我們的服務提供者註冊到eureka server(上)client原始碼Server
- mybatis原始碼-註解sqlMyBatis原始碼SQL
- 【一起學原始碼-微服務】Nexflix Eureka 原始碼四:EurekaServer啟動之完成上下文構建及EurekaServer總結原始碼微服務Server
- SQL Server啟動指令碼SQLServer指令碼
- Flutter原始碼剖析(一):原始碼獲取與構建Flutter原始碼