微信公衆號:I am CR7
若有問題或建議,請在下方留言;
最近更新:2018-11-25java
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>
複製代碼
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【本例採用2.0.2.RELEASE版本】項目結構圖:
github
原來,spring-cloud-starter-*是爲了經過starter對項目的依賴進行統一的管理,利用maven的傳遞依賴解析機制,將netflix-eureka-server相關的依賴庫聚合到一塊兒,從而實現針對特定功能來定製依賴的starter。spring.provides文件提供了pom更新的上下文。spring
友情連接:What are spring-boot-starter jars?springboot
請看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。網絡
請看源碼: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}
複製代碼
這個類要作什麼?建立了一個Marker的實例。別急,此處留個懸念,我們繼續往下看。
經過在啓動類中添加@EnableEurekaServer註解,會建立EurekaServerMarkerConfiguration的bean實例。
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。
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有什麼用"?
經過上述的分析,有沒有發現這樣一個邏輯:
因此,@EnableEurekaServer註解成爲了開啓netflix eureka server神祕大門的"鑰匙"。
本文做爲預熱篇,從如何使用入手,根據對依賴包和註解這兩個方面的分析,讓你們明白啓用一個netflix eureka server須要具有的條件和內部實現的原理。 後續會逐步對netflix eureka server和client的內部實現原理進行深刻分析,歡迎你們多多關注。