spring cloud eureka server源码分析

前言

spring cloud eureka server作为一个服务注册发现中心,现在已经被Netflix抛弃,停止更新了,spring cloud的服务注册发现有很多更成熟的替代,因此这里对eureka server源码的分析,仅作学习用,学习一下成熟的开源依赖里的思想和模式。

源码分析

@EnableEurekaServer

@EnableEurekaServer是一个eureka server服务必须声明的注解,我们从这个注解入手,看看eureka server做了什么。
spring cloud eureka server源码分析_第1张图片
注解里基本没什么东西,只有一个@Import要注意一下,那么接下来看@Import导入的这个类。

EurekaServerMarkerConfiguration

spring cloud eureka server源码分析_第2张图片
这是一个有@Configuration注解的配置类,里面只有一个内部类的Bean,暂时不知道什么作用,先放着,@EnableEurekaServer注解看到这里也断了,究竟有什么用呢?

spring.factories

上面由于@EnableEurekaServer注解只涉及两个类,对源码的研究暂时断了,接下来我们从spring boot的spi机制入手,直接来看spring-cloud-netflix-eureka-server依赖包里的META-INF/spring.factories文件。
spring cloud eureka server源码分析_第3张图片
这里通过EnableAutoConfiguration属性的配置,导入了一个类org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration。接下来看看EurekaServerAutoConfiguration这个类。

EurekaServerAutoConfiguration

spring cloud eureka server源码分析_第4张图片
注意@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)这个注解,只有当EurekaServerMarkerConfiguration.Marker的Bean存在spring 容器时,才加载这个EurekaServerAutoConfiguration。原来@EnableEurekaServer注解对于eureka server的开关作用是这样用的。

EurekaServerAutoConfiguration这个类里面包含了大量的Bean注册,包括仪表盘DashBoard的controller的注册,其他Bean的注册。
最重要的下面两个Bean

spring cloud eureka server源码分析_第5张图片
jersey是一个restful的web服务框架,这里拦截了所有路径上的请求,并转发到@Path标注的相应的处理方法上。

还有一个上面重要的点@Import(EurekaServerInitializerConfiguration.class)
我们一起来看一下EurekaServerInitializerConfiguration类

EurekaServerInitializerConfiguration

spring cloud eureka server源码分析_第6张图片
这里实现了SmartLifecycle接口,会在spring容器启动后,自动调用start方法
spring cloud eureka server源码分析_第7张图片
看一下这个初始化方法。

spring cloud eureka server源码分析_第8张图片
spring cloud eureka server源码分析_第9张图片
由于不是aws,所以这个aws的绑定就不看了。这个syncUp方法,会往eureka集群同步eureka server注册中心的信息。EurekaMonitors.registerAllStats();注册所有监控
openForTraffic
spring cloud eureka server源码分析_第10张图片
会将自身的状态从starting设置为up,并同步到eureka集群上的所有节点。
postInit方法,会开启一个定时任务,剔除失效的注册。

总结

eureka的核心还是用Jersey构建的Restful的web服务,所有的服务的注册都是依靠这些web服务,例如服务注册com.netflix.eureka.resources.ApplicationResource#addInstance,服务移除com.netflix.eureka.resources.InstanceResource#cancelLease,都是调用这些接口。

你可能感兴趣的:(eureka,spring,cloud,spring)