在上篇中已經(jīng)說(shuō)過(guò)了 Eureka-Server 本質(zhì)上是一個(gè) web 應(yīng)用的項(xiàng)目,今天就來(lái)看看 Spring Boot 是怎么啟動(dòng) Eureka 的。
Spring Boot 啟動(dòng) Eureka 流程
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
上面的代碼是最最平常的 Spring Boot 啟動(dòng)類。Spring Boot 啟動(dòng) eureka 的關(guān)鍵注解就在 @EnableEurekaServer 上面。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({EurekaServerMarkerConfiguration.class})
public @interface EnableEurekaServer {
}
可以看到這注解導(dǎo)入了一個(gè) EurekaServerMarkerConfiguration 類。
@Configuration
public class EurekaServerMarkerConfiguration {
@Bean
public Marker eurekaServerMarkerBean() {
return new Marker();
}
class Marker {
}
}
EurekaServerMarkerConfiguration 向 Spring 容器注入了一個(gè) EurekaServerMarkerConfiguration.Marker 對(duì)象。Maker 是一個(gè)空對(duì)象,是一個(gè)標(biāo)記開(kāi)關(guān)的類。具體開(kāi)關(guān)的類在上面的注釋中。
/**
* Responsible for adding in a marker bean to activate
* {@link EurekaServerAutoConfiguration}
*
* @author Biju Kunjummen
*/
EurekaServerMarkerConfiguration.Marker 對(duì)象用于激活 EurekaServerAutoConfiguration 類。
那 EurekaServerAutoConfiguration 類是在什么時(shí)候加載的呢?
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration
如上圖,EurekaServerAutoConfiguration 啟動(dòng)的調(diào)用是在 spring.factories 中的,在 Spring Boot 的啟動(dòng)過(guò)程中,會(huì)加載所有的 spring.factories。這個(gè)時(shí)候會(huì)讀取并加載里面的內(nèi)容到 Spring 中。
- @Import(EurekaServerInitializerConfiguration.class):初始化 EurekaServerAutoConfiguration 的時(shí)候會(huì)導(dǎo)入 EurekaServerInitializerConfiguration 類。
- @ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class):當(dāng) Spring 中有 EurekaServerMarkerConfiguration.Marker 類的實(shí)例存在就把 EurekaServerAutoConfiguration 也導(dǎo)入到 Spring 的容器中。
public class EurekaServerInitializerConfiguration
implements ServletContextAware, SmartLifecycle, Ordered
- ServletContextAware:實(shí)現(xiàn)這個(gè)類可以獲取到 ServletContext 容器上下文。
- SmartLifecycle:當(dāng) Spring 容器加載所有 bean 并完成初始化之后,會(huì)接著回調(diào)實(shí)現(xiàn)該接口的類中對(duì)應(yīng)的 start() 方法
看一下 start() 方法里面調(diào)用了什么?
@Override
public void start() {
new Thread(new Runnable() {
@Override
public void run() {
try {
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() 啟動(dòng)了一個(gè)線程,在線程里面 Start 了 Eureka Server。eurekaServerBootstrap 是一個(gè)自動(dòng)注入 EurekaServerBootstrap 的對(duì)象。EurekaServerBootstrap 在上一篇中已經(jīng)說(shuō)過(guò)了,它是 Eureka Server 的啟動(dòng)類。最后看看它的 contextInitialized() 方法。
public void contextInitialized(ServletContext context) {
try {
initEurekaEnvironment();
initEurekaServerContext();
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);
}
}
contextInitialized 方法調(diào)用了 initEurekaEnvironment(),初始化 Eureka 的運(yùn)行環(huán)境;initEurekaServerContext(),初始化 Eureka 的上下文。
總結(jié)
Spring Boot 啟動(dòng) Erueka Server 經(jīng)歷了一下步驟:
- @EnableEurekaServer 注解
- 注入了 EurekaServerMarkerConfiguration.Marker 對(duì)象
- 判斷容器里是否有 EurekaServerMarkerConfiguration.Marker 對(duì)象注入了 EurekaServerAutoConfiguration
- 導(dǎo)入了實(shí)現(xiàn) SmartLifecycle 接口的 EurekaServerInitializerConfiguration 類
- Spring 容器在初始化后調(diào)用了 EurekaServerInitializerConfiguration 對(duì)象的 start() 方法
- start() 中啟動(dòng)了一個(gè)線程,調(diào)用了 Erueka Server 的啟動(dòng)類:EurekaServerBootstrap。
-
Web
+關(guān)注
關(guān)注
2文章
1287瀏覽量
71465 -
容器
+關(guān)注
關(guān)注
0文章
511瀏覽量
22459 -
eureka
+關(guān)注
關(guān)注
0文章
4瀏覽量
1813 -
SpringBoot
+關(guān)注
關(guān)注
0文章
175瀏覽量
403
發(fā)布評(píng)論請(qǐng)先 登錄
啟動(dòng)Spring Boot項(xiàng)目應(yīng)用的三種方法
Spring Boot嵌入式Web容器原理是什么
Spring Boot定時(shí)任務(wù)的重寫方法
Spring Boot從零入門1 詳述
「Spring認(rèn)證」什么是Spring GraphQL?

HAB boot的啟動(dòng)流程與實(shí)現(xiàn)步驟
Spring Boot特有的實(shí)踐
強(qiáng)大的Spring Boot 3.0要來(lái)了
Spring Boot Web相關(guān)的基礎(chǔ)知識(shí)
Eureka Server面向接口的方式讀取配置文件

Spring Boot Actuator快速入門
Spring Boot的啟動(dòng)原理

Spring Boot 的設(shè)計(jì)目標(biāo)

安全啟動(dòng)Secure Boot流程

評(píng)論