微信公众号: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的内部实现原理进行深刻分析,欢迎你们多多关注。