要使用eureka的客户端,只需要引入spring-cloud-starter-netflix-eureka-client
的包就可以了;
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
可以看到,主要依赖spring-cloud-netflix-eureka-client
;找到spring-cloud-netflix-eureka-client
包的spring.factories
文件;
查看文件内容
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.netflix.eureka.config.EurekaClientConfigServerAutoConfiguration,\
org.springframework.cloud.netflix.eureka.config.EurekaDiscoveryClientConfigServiceAutoConfiguration,\
org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration,\
org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,\
org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.netflix.eureka.config.EurekaDiscoveryClientConfigServiceBootstrapConfiguration
EurekaClientConfigServerAutoConfiguration
类,在eureka客户端中,没有ConfigServerProperties.class;这个不生效;@Configuration
@EnableConfigurationProperties
@ConditionalOnClass({ EurekaInstanceConfigBean.class, EurekaClient.class,
ConfigServerProperties.class })
public class EurekaClientConfigServerAutoConfiguration {
EurekaDiscoveryClientConfigServiceAutoConfiguration
类,我们yml配置文件中,没有指定spring.cloud.config.discovery.enabled
属性,这个自动装配不生效@ConditionalOnBean({ EurekaDiscoveryClientConfiguration.class })
@ConditionalOnProperty(value = "spring.cloud.config.discovery.enabled", matchIfMissing = false)
public class EurekaDiscoveryClientConfigServiceAutoConfiguration {
EurekaClientAutoConfiguration
类,看名字就知道,这个就是eureka客户端自动装配的主要配置类了@Configuration
@EnableConfigurationProperties
@ConditionalOnClass(EurekaClientConfig.class)
@Import(DiscoveryClientOptionalArgsConfiguration.class)
@ConditionalOnBean(EurekaDiscoveryClientConfiguration.Marker.class)
@ConditionalOnProperty(value = "eureka.client.enabled", matchIfMissing = true)
@ConditionalOnDiscoveryEnabled
@AutoConfigureBefore({ NoopDiscoveryClientAutoConfiguration.class,
CommonsClientAutoConfiguration.class, ServiceRegistryAutoConfiguration.class })
@AutoConfigureAfter(name = {
"org.springframework.cloud.autoconfigure.RefreshAutoConfiguration",
"org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration",
"org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration" })
public class EurekaClientAutoConfiguration {
要想这个类,可以被自动装配,类上的生效条件中,只有@ConditionalOnBean(EurekaDiscoveryClientConfiguration.Marker.class)
这个内部类Marker的实例被创建的时候,才会生效;其他的条件,都是成功的;而EurekaDiscoveryClientConfiguration
类,spring.factories文件中,自动装配的类;
在EurekaClientAutoConfiguration
类中,装配了什么组件,大家有兴趣的自己看一看吧,另外装配了什么组件,单独的看,也可能并没有什么意义,很多的东西,要结合功能的效果,以及业务上的东西,结合上下文看;去系统的看源码;
RibbonEurekaAutoConfiguration
类,eureka客户端,调用服务端的时候,也是使用的ribbon的服务@Configuration
@EnableConfigurationProperties
@ConditionalOnRibbonAndEurekaEnabled
@AutoConfigureAfter(RibbonAutoConfiguration.class)
@RibbonClients(defaultConfiguration = EurekaRibbonClientConfiguration.class)
public class RibbonEurekaAutoConfiguration {
}
EurekaDiscoveryClientConfiguration
类;上面也说了,注入了内部类Marker的实例,让eureka的主配置类生效;其他的组件,有兴趣的可以自己看下(开启健康检查功能eureka.client.healthcheck.enabled=true
;注入EurekaClientConfigurationRefresher组件,实现ApplicationListener接口,是个监听组件);
@Configuration
@EnableConfigurationProperties
@ConditionalOnClass(EurekaClientConfig.class)
@ConditionalOnProperty(value = "eureka.client.enabled", matchIfMissing = true)
@ConditionalOnDiscoveryEnabled
public class EurekaDiscoveryClientConfiguration {
@Bean
public Marker eurekaDiscoverClientMarker() {
return new Marker();
}
@EnableEurekaClient
看注解的内容,就是一个普通的注解,没有导入其他的组件或者实例,到spring的容器中
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface EnableEurekaClient {
}
从上面的eureka的客户端自动装配的代码中,也没有发现,哪个装配类,再自动装配的时候,需要有@EnableEurekaClient
注解为前提;所以说,这个注解,是个假注解?不标注在主启动类上,也能把服务注册到eureka的服务端中?
测试一下:
1、启动eureka的服务端的项目badger-spring-cloud-eureka
2、注释掉主类上的@EnableEurekaClient
的注解,启动项目badger-spring-cloud-api
3.服务正常启动,项目也正常被注入到eureka中
4.总结:@EnableEurekaClient
注解,在springboot2.x之后,确实可以不使用,项目也可以被正常注入,我又去看了下springboot1.5.x版本对应的eureka的部分代码,几乎跟2.x版本,相差不大;在1.5.x版本中,不标注@EnableEurekaClient
注解,不知道还能注册到注册中心去,大家可以下去自己测试一下。