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

相关文章
相关标签/搜索