下面是 Spring Cloud 对应的 Spring Boot 版本信息:
Spring Cloud 版本 | Spring Boot 版本 |
2020.0.x aka Ilford | 2.4.x |
Hoxton | 2.2.x, 2.3.x (Starting with SR5) |
Greenwich | 2.1.x |
Finchley | 2.0.x |
Edgware | 1.5.x |
Dalston | 1.5.x |
在 Spring Cloud 的 Dalston 版本或更早版本中,为了启用服务注册发现功能。需要在主启动类上增加 @EnableDiscoveryClient 或者 @EnableEurekaClient 注解,例如:
package com.hxstrive.springcloud.eureka.client; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); } }
我们查看一下 @EnableEurekaClient 的源码:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @EnableDiscoveryClient public @interface EnableEurekaClient { }
在 @EnableEurekaClient 中使用了 @EnableDiscoveryClient 注解。因此,从使用角度来看 @EnableEurekaClient 和 @EnableDiscoveryClient 两者已经没有什么区别了,官方建议使用 @EnableDiscoveryClient 注解。
(1)@EnableDiscoveryClient 注解是基于 spring-cloud-commons 依赖,并且在 classpath 中实现。
(2)@EnableEurekaClient 注解是基于 spring-cloud-netflix 依赖,只能用作 Eureka。
(3)@EnableEurekaClient 只适用于 Eureka 作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
从 Spring Cloud 1.0.0.RC1 版本开始,就已经不推荐使用 @EnableEurekaClient 和 @EnableHystrix 了。服务注册发现功能被抽象后放入 spring-cloud-commons 库,该库的 @EnableDiscoveryClient 可以取代旧的 @EnableEurekaClient,使用注解 @EnableDiscoveryClient 就能启用服务注册发现功能。同理,@EnableHystrix 也被 @EnableCircuitBreaker 取代了。
@EnableEurekaClient 注解的源码如下:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface EnableEurekaClient { }
@EnableEurekaClient 注解之前版本中的 @EnableDiscoveryClient 注解已经取消了,而且也没有用到任何 @Import 注解。因此,在我们的代码中不用再添加@EnableEurekaClient 注解了,即使添加了也没有任何用。
目前 Spring Cloud 只需在 classpath 中存在以 spring-cloud-starter-netflix 为前缀的依赖库(例如:spring-cloud-starter-netflix-eureka-client)就自动启用了服务注册发现功能。使用配置项 可禁止服务注册发现功能。Spring 容器在查询 META-INF/spring.factories 文件的过程中,如果找到了 EnableDiscoveryClient 的配置,就会实例化该配置对应的服务注册发现,例如:Eureka、Consul、Zookeeper等。
打开 IDEA,在项目的“External Libraries”中找到 spring-cloud-netflix-eureka-client-3.0.0.jar 依赖中的 META-INF\spring.factories 文件,如下图:
META-INF\spring.factories 文件内容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.cloud.netflix.eureka.config.EurekaClientConfigServerAutoConfiguration,\ org.springframework.cloud.netflix.eureka.config.DiscoveryClientOptionalArgsConfiguration,\ org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration,\ org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration,\ org.springframework.cloud.netflix.eureka.reactive.EurekaReactiveDiscoveryClientConfiguration,\ org.springframework.cloud.netflix.eureka.loadbalancer.LoadBalancerEurekaAutoConfiguration org.springframework.cloud.bootstrap.BootstrapConfiguration=\ org.springframework.cloud.netflix.eureka.config.EurekaConfigServerBootstrapConfiguration org.springframework.boot.Bootstrapper=\ org.springframework.cloud.netflix.eureka.config.EurekaConfigServerBootstrapper
在 META-INF\spring.factories 文件的 Spring Boot 自动配置项 org.springframework.boot.autoconfigure.EnableAutoConfiguration 中发现了一个关键配置类 EurekaDiscoveryClientConfiguration。
因此服务注册发现功能是否启动,是由配置类 EurekaDiscoveryClientConfiguration 控制的,在 Spring Cloud Edgware 版本中,如果开启了 Spring Boot 的自动配置,那么 EurekaDiscoveryClientConfiguration 就会生效,因此不是靠 @EnableDiscoveryClient 注解来控制了。
Dalston 版本的 Spring Cloud,其 spring-cloud-netflix-eureka-client 工程的版本号为 1.3.6.RELEASE,如下图:
该工程下面的 META-INF\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.bootstrap.BootstrapConfiguration=\ org.springframework.cloud.netflix.eureka.config.EurekaDiscoveryClientConfigServiceBootstrapConfiguration org.springframework.cloud.client.discovery.EnableDiscoveryClient=\ org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration
在 Dalston 版本下,使用注解 @EnableDiscoveryClient 才会使配置 EurekaDiscoveryClientConfiguration 生效。
【注意】
(1)在 Edgware 版本中,官方建议使用 spring-cloud-netflix-eureka-client 作为 starter。
(2)在 Dalston 版本中,官方建议使用 spring-cloud-starter-eureka 作为 starter。
由于 spring-cloud-starter-eureka 的间接依赖,spring-cloud-netflix-eureka-client 会出现在 classpath 中。因此 spring 启动时会扫描到 spring-cloud-netflix-eureka-client.jar 包中的 META-INF\spring.factories 文件。
如果当前工程使用了 @EnableDiscoveryClient 注解,按照 META-INF\spring.factories 中的配置,配置类 EurekaDiscoveryClientConfiguration 会生效,进而开启服务注册发现功能。
在 Spring Cloud 的 Dalston 及其之前的版本中:
从 2014 年的 Spring Cloud 1.0.0.RC1 版本开始,官方就推荐使用 @EnableDiscoveryClient 来取代 @EnableEurekaClient。
@EnableEurekaClient 源码中使用了注解 @EnableDiscoveryClient,因此如果要使用 eureka 的注册发现服务,两者功能是一样的。
@EnableDiscoveryClient 注解在 spring.factories 配置中通过配置项 EurekaDiscoveryClientConfiguration 来开启服务注册发现功能。
在 Dalston 之后的版本中(不含Dalston):
在 META-INF\spring.factories 配置中,配置类 EurekaDiscoveryClientConfiguration 被配置到 Spring Boot 的自动配置注解中,与 @EnableDiscoveryClient 注解没有关系了,也就是说只要开启了 Spring Boot 的自动配置,服务注册发现功能就会启用。
@EnableEurekaClient 源码中没有使用注解 @EnableDiscoveryClient,此时 @EnableEurekaClient 注解已经没用了。
https://blog.csdn.net/lizhiqiang1217/article/details/89883519