在上篇中已經(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)類(lèi)。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 類(lèi)。
@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)的類(lèi)。具體開(kāi)關(guān)的類(lèi)在上面的注釋中。
/**
* Responsible for adding in a marker bean to activate
* {@link EurekaServerAutoConfiguration}
*
* @author Biju Kunjummen
*/
EurekaServerMarkerConfiguration.Marker 對(duì)象用于激活 EurekaServerAutoConfiguration 類(lèi)。
那 EurekaServerAutoConfiguration 類(lèi)是在什么時(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 類(lèi)。
- @ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class):當(dāng) Spring 中有 EurekaServerMarkerConfiguration.Marker 類(lèi)的實(shí)例存在就把 EurekaServerAutoConfiguration 也導(dǎo)入到 Spring 的容器中。
public class EurekaServerInitializerConfiguration
implements ServletContextAware, SmartLifecycle, Ordered
- ServletContextAware:實(shí)現(xiàn)這個(gè)類(lèi)可以獲取到 ServletContext 容器上下文。
- SmartLifecycle:當(dāng) Spring 容器加載所有 bean 并完成初始化之后,會(huì)接著回調(diào)實(shí)現(xiàn)該接口的類(lèi)中對(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è)線(xiàn)程,在線(xiàn)程里面 Start 了 Eureka Server。eurekaServerBootstrap 是一個(gè)自動(dòng)注入 EurekaServerBootstrap 的對(duì)象。EurekaServerBootstrap 在上一篇中已經(jīng)說(shuō)過(guò)了,它是 Eureka Server 的啟動(dòng)類(lèi)。最后看看它的 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 類(lèi)
- Spring 容器在初始化后調(diào)用了 EurekaServerInitializerConfiguration 對(duì)象的 start() 方法
- start() 中啟動(dòng)了一個(gè)線(xiàn)程,調(diào)用了 Erueka Server 的啟動(dòng)類(lèi):EurekaServerBootstrap。
-
Web
+關(guān)注
關(guān)注
2文章
1271瀏覽量
69746 -
容器
+關(guān)注
關(guān)注
0文章
499瀏覽量
22128 -
eureka
+關(guān)注
關(guān)注
0文章
4瀏覽量
1774 -
SpringBoot
+關(guān)注
關(guān)注
0文章
174瀏覽量
201
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
啟動(dòng)Spring Boot項(xiàng)目應(yīng)用的三種方法
Spring Boot嵌入式Web容器原理是什么
Spring Boot定時(shí)任務(wù)的重寫(xiě)方法
Spring Boot從零入門(mén)1 詳述
「Spring認(rèn)證」什么是Spring GraphQL?
![「<b class='flag-5'>Spring</b>認(rèn)證」什么是<b class='flag-5'>Spring</b> GraphQL?](https://file.elecfans.com//web2/M00/0F/3B/pYYBAGESF82AX69eAAG9KGVFbn4969.jpg)
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面向接口的方式讀取配置文件
![<b class='flag-5'>Eureka</b> Server面向接口的方式讀取配置文件](https://file1.elecfans.com/web2/M00/A9/33/wKgZomUjwlCAMsEpAAAqOGXZfFU548.jpg)
Spring Boot Actuator快速入門(mén)
Spring Boot的啟動(dòng)原理
![<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的<b class='flag-5'>啟動(dòng)</b>原理](https://file1.elecfans.com/web2/M00/A9/C0/wKgZomUovNCAdZmWAADhZidr2zI277.jpg)
Spring Boot 的設(shè)計(jì)目標(biāo)
![<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的設(shè)計(jì)目標(biāo)](https://file1.elecfans.com/web2/M00/A8/04/wKgaomUo6gmAEQN0AAESfDw9EW8049.jpg)
安全啟動(dòng)Secure Boot流程
![安全<b class='flag-5'>啟動(dòng)</b>Secure <b class='flag-5'>Boot</b><b class='flag-5'>流程</b>](https://file1.elecfans.com/web2/M00/AC/20/wKgaomVDXzqAMMjWAAB2ByVt58c732.jpg)
評(píng)論