Spring Cloud Netflix Eureka Server源碼分析之預熱篇

微信公衆號:I am CR7
若有問題或建議,請在下方留言;
最近更新:2018-11-25java

如何使用

  • 引入maven依賴:
1<dependency>
2    <groupId>org.springframework.cloud</groupId>
3    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
4    <version>2.0.2.RELEASE</version>
5</dependency>
複製代碼
  • 啓動類添加@EnableEurekaServer註解
1@EnableEurekaServer
2@SpringBootApplication
3public class EurekaServerApplication {
4
5    public static void main(String[] args) {
6        SpringApplication.run(EurekaServerApplication.class, args);
7    }
8}
複製代碼

經過上述兩個步驟,咱們就能啓動一個eureka server。接下來,筆者會從這兩個方面來進行進一步分析,讓你們明白這背後的故事。git

spring-cloud-starter-netflix-eureka-server

項目結構

咱們來看下第一部分中引入的依賴包spring-cloud-starter-netflix-eureka-server【本例採用2.0.2.RELEASE版本】項目結構圖:
github

image
image

一看上圖,沒有任何代碼,只有pom文件和spring.provides文件。當時一想,確定又是該死的網絡致使包沒下載全。刪除本地倉庫後reimport一次,仍是這樣。無奈,去github上看下源碼,這究竟是怎麼回事。OMG!!!這就是項目本來的模樣。

Why???

原來,spring-cloud-starter-*是爲了經過starter對項目的依賴進行統一的管理,利用maven的傳遞依賴解析機制,將netflix-eureka-server相關的依賴庫聚合到一塊兒,從而實現針對特定功能來定製依賴的starter。spring.provides文件提供了pom更新的上下文。spring

友情連接:What are spring-boot-starter jars?springboot

pom文件

請看pom文件的內容:微信

 1<dependencies>
2    <dependency>
3        <groupId>org.springframework.cloud</groupId>
4        <artifactId>spring-cloud-starter</artifactId>
5    </dependency>
6    <dependency>
7        <groupId>org.springframework.cloud</groupId>
8        <artifactId>spring-cloud-netflix-eureka-server</artifactId>
9    </dependency>
10    <dependency>
11        <groupId>org.springframework.cloud</groupId>
12        <artifactId>spring-cloud-starter-netflix-archaius</artifactId>
13    </dependency>
14    <dependency>
15        <groupId>org.springframework.cloud</groupId>
16        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
17    </dependency>
18    <dependency>
19        <groupId>com.netflix.ribbon</groupId>
20        <artifactId>ribbon-eureka</artifactId>
21    </dependency>
22</dependencies>
複製代碼

恭喜你,順利找到了netflix eureka server的關鍵jar包:spring-cloud-netflix-eureka-server。網絡

@EnableEurekaServer

請看源碼:app

1@Target(ElementType.TYPE)
2@Retention(RetentionPolicy.RUNTIME)
3@Documented
4@Import(EurekaServerMarkerConfiguration.class)
5public @interface EnableEurekaServer {
6
7}
複製代碼

@Import註解會導入EurekaServerMarkerConfiguration類,構建bean實例。maven

看一眼EurekaServerMarkerConfiguration的源碼:ide

 1@Configuration
2public class EurekaServerMarkerConfiguration {
3
4    @Bean
5    public Marker eurekaServerMarkerBean() {
6        return new Marker();
7    }
8
9    class Marker {
10    }
11}
複製代碼
What???

這個類要作什麼?建立了一個Marker的實例。別急,此處留個懸念,我們繼續往下看。

小結

經過在啓動類中添加@EnableEurekaServer註解,會建立EurekaServerMarkerConfiguration的bean實例。

spring-cloud-netflix-eureka-server

項目結構

image
image

根據SpringBoot自動加載原理,它會在對SpringApplication對象實例化時自動加載META-INF/spring.factories文件,將該配置文件中指定的配置類載入到Spring容器。
咱們來看下該文件的內容:

1org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
2  org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration
複製代碼

小結

經過在pom文件中引入spring-cloud-starter-netflix-eureka-server包,當咱們啓動springboot容器時,會自動加載到spring-cloud-netflix-eureka-server項目裏的META-INF/spring.factories文件,從而自動加載該文件中指定的配置類EurekaServerAutoConfiguration。

EurekaServerAutoConfiguration

1@Configuration
2@Import(EurekaServerInitializerConfiguration.class)
3@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)
4@EnableConfigurationProperties({ EurekaDashboardProperties.class,
5        InstanceRegistryProperties.class })
6@PropertySource("classpath:/eureka/server.properties")
7public class EurekaServerAutoConfiguration extends WebMvcConfigurerAdapter {
8    //省略
9}
複製代碼

此處只保留類聲明部分代碼,內部細節會在下一篇文章中詳細分析。

咱們來看@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)

@ConditionOnBean註解表示當spring容器中存在指定class類對應的實例時纔會加載當前的這個bean。

也就是說加載EurekaServerAutoConfiguration這個bean的前提是spring
容器中必須有EurekaServerMarkerConfiguration.Marker的實例。根據上述小結咱們知道,@EnableEurekaServer註解正是完成了這件事情。

小結

回顧咱們前面遺留下的那個問題:"EurekaServerMarkerConfiguration有什麼用"?
經過上述的分析,有沒有發現這樣一個邏輯:

  • netflix eureka server核心配置類是EurekaServerAutoConfiguration,其加載的前提----->先構建EurekaServerMarkerConfiguration.Marker實例
  • EurekaServerMarkerConfiguration.Marker實例前提----->先構建EurekaServerMarkerConfiguration實例
  • EurekaServerMarkerConfiguration實例是經過在EnableEurekaServer類中@Import導入的,必須得先用@EnableEurekaServer註解

因此,@EnableEurekaServer註解成爲了開啓netflix eureka server神祕大門的"鑰匙"。

總結

本文做爲預熱篇,從如何使用入手,根據對依賴包和註解這兩個方面的分析,讓你們明白啓用一個netflix eureka server須要具有的條件和內部實現的原理。 後續會逐步對netflix eureka server和client的內部實現原理進行深刻分析,歡迎你們多多關注。

相關文章
相關標籤/搜索