前言
很多同学发现在不在SpringBoot启动类上标注@EnableEurekaClient注解也可以向注册中心注册,在这里记录下原因。
基本配置
SpringBoot工程作为EurekaClient向注册中心注册的基本配置如下:
- eureka client的开关,注册中心地址等
- SpringBoot启动类上标注@EnableEurekaClient注解
去掉@EnableEurekaClient也能成功注册的原因
假如我们去掉SpringBoot启动类上的@EnableEurekaClient注解,会发现服务启动后依然可以注册进Eureka。小朋友,你是否有很多问号?
原因解析:
-
自动配置类和
@ConditionalOnProperty
注解
EurekaClientAutoConfiguration
作为EurekaClient的自动配置类,类上带有@ConditionalOnProperty(value = "eureka.client.enabled", matchIfMissing = true)
这一行代码。
这一行的意思是只有当application.yaml(或者环境变量,或者系统变量)里,eureka.client.enabled
这个属性的值为true
才会初始化这个类(缺省值也为true,但是假如你手动赋值为false,就不会初始化这个类了)。
对应上了上面写的【基本配置】里的第一个配置。 -
EurekaAutoServiceRegistration类和@Bean注解
在EurekaClientAutoConfiguration类里,我们可以看到这样一个方法
这个方法的意思是通过@Bean注解,装配一个EurekaAutoServiceRegistration
对象作为Spring的bean,而我们从名字就可以看出来EurekaClient的注册就是EurekaAutoServiceRegistration
对象所进行操作的。同时,在这个方法上,也有这么一行
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
,我们可以看出来,EurekaClient的注册,原来其实是和两个配置项有关的,一个是eureka.client.enabled
,另一个是spring.cloud.service-registry.auto-registration.enabled
,只不过这两个配置默认都是true。假如做下试验,会发现这两个配置无论哪个我们手动配置成false,我们的服务都无法进行注册了。
-
Spring的SmartLifecycle
上面我们解释了这两个配置帮助我们在EurekaClient的自动配置类里装配了EurekaClient自动配置的Bean。我们来看一下这个Bean(即EurekaAutoServiceRegistration
类)。
我们可以看到EurekaAutoServiceRegistration
类实现了Spring的SmartLifecycle
接口,这个接口的作用是帮助一个类在作为Spring的Bean的时候,由Spring帮助我们自动进行一些和生命周期有关的工作,比如在初始化或者停止的时候进行一些操作。而我们最关心的注册(register)
这个动作,就是在SmartLifecycle
接口的start()
方法实现里完成的。而我们上一步讲到,
EurekaAutoServiceRegistration
类在EurekaClientAutoConfiguration
类里恰好被配置成Spring的Bean,所以这里的start()
方法是会自动被Spring调用的,我们不需要进行任何操作。
总结:
简而言之就是当我们引用了EurekaClient的依赖后,并且我们的两个开关不手动置为false,Spring就会自动帮助我们执行EurekaAutoServiceRegistration
类里的start()
方法,而注册的动作就是在该方法里完成的。
所以,我们的EurekaClient工程,并不需要显式的在SpringBoot的启动类上标注@EnableEurekaClient
注解。