Spring-cloud学习笔记—Eureka源码剖析之EurekaServer启动过程
1.找到Eireka-Server的jar包
首先找到Eireka-Server的jar包
META-INF包下面有个spring.factories配置文件,这个文件是SpringBoot自动装配的配置文件,springboot应⽤启动时会加载EurekaServerAutoConfiguration⾃动配置类
2.Eireka Server启动过程分析
1. 入口:SpringCloud充分利用了SpringBoot的自动装配的特点,帮助Eureka装配EurekaServerAutoConfiguration
2. 首先观察类头分析
@Configuration
@Import({EurekaServerInitializerConfiguration
.class})
@ConditionalOnBean({Marker
.class})
@EnableConfigurationProperties({EurekaDashboardProperties
.class, InstanceRegistryProperties
.class})
@PropertySource({"classpath:/eureka/server.properties"})
public class EurekaServerAutoConfiguration extends WebMvcConfigurerAdapter {
... ...
@Configuration:配置类@Import:导入了一个EurekaServerInitializerConfiguration类,说明EurekaServerInitializerConfiguration也要做一些初始化的动作@ConditionalOnBean:要装配当前EurekaServerAutoConfiguration配置类需要一个前提条件,前提是容器中需要另一个bean,这个bean是一个叫Marker的bean,这个bean是从哪来的@EnableConfigurationProperties:读取配置信息的@PropertySource:读取配置信息的EurekaServerAutoConfiguration:配置类也是要做一些东西的,如下图:
3. 分析上图中的第一步:@ConditionalOnBean注解
需要有⼀个marker的bean,才能装配Eureka Server,那么这个marker其实是由@EnableEurekaServer注解决定的 也就是说只有添加了@EnableEurekaServer注解,才会有后续的动作,这是成为⼀个EurekaServer的前提
4. 分析EurekaServerAutoConfiguration配置类
5. 点击com.netflix.eureka.cluster.PeerEurekaNodes类,可以看到其中的start方法,在start方法中构建了一个线程池
6. 回到EurekaServerAutoConfiguration配置类中,发现注入Eureka上下文对象的方法
7. 进入DefaultEurekaServerContext类中,看到initialize方法,@PostConstruct注解表示在当前对象构造器执行完毕后就会执行被该注解修饰的方法,启动刚才的peerEurekaNodes.start(),目的是把节点更新的任务启动
8. 回到EurekaServerAutoConfiguration配置类中,发现一个EurekaServerBootstrap(Eureka服务的启动引导类),估计后续这个类应该会被进行一些使用
9. 在EurekaServerAutoConfiguration配置类中,看到jerseyFilterRegistration方法
10. 回到类头查看@Import({EurekaServerInitializerConfiguration.class})中的EurekaServerInitializerConfiguration类,发现实现了一个SmartLifecycle接口,这个接口里面继承了Lifecycle接口,里面有个start方法
在这个start方法中可以重写我们的逻辑整个容器的bean对象都创建完之后,通过start方法去执行一些操作
11. 点击eurekaServerBootstrap.contextInitialized中的contextInitialized方法,同时也进入了EurekaServerBootstrap类
12. 重点关注initEurekaServerContext()里面的内容
13. 研究⼀下上图中的syncUp⽅法
14. 继续研究com.netflix.eureka.registry.AbstractInstanceRegistry的register(提供实例注册功能)
如图所示 这个registry就是我们的注册表,是一个ConcurrentHashMap,里面的String是key,表示服务名称一个服务下面可以有很多个实例,所以value也是一个Map,这个Map里面的key是实例id,Lease<InstanceInfo>是实例的封装对象这就是我们的注册表,内存中的一个hashMap所以说EurekaServer还是将他的注册信息保存在内存中了
15. 继续研究com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl的openForTraffic
上面是单例的,下面是集群模式,我们看下面图片所示,进入openForTraffic方法后
16. 进⼊postInit()⽅法查看