@EnableDiscoveryClient 与 @EnableEurekaClient 的区别

本文将介绍 @EnableDiscoveryClient 与 @EnableEurekaClient 两个注解的区别。

下面是 Spring Cloud 对应的 Spring Boot 版本信息:

Spring Cloud 版本Spring Boot 版本
2020.0.x aka Ilford2.4.x
Hoxton2.2.x, 2.3.x (Starting with SR5)
Greenwich2.1.x
Finchley2.0.x
Edgware1.5.x
Dalston1.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 注解。

@EnableEurekaClient 与 @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 取代了。

Spring Cloud Edgware 或者更新版本

@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 文件,如下图:

@EnableDiscoveryClient 与 @EnableEurekaClient 的区别

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 注解来控制了。

Spring Cloud Dalston 版本

Dalston 版本的 Spring Cloud,其 spring-cloud-netflix-eureka-client 工程的版本号为 1.3.6.RELEASE,如下图:

@EnableDiscoveryClient 与 @EnableEurekaClient 的区别

该工程下面的 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

学习有两忌,自高和自狭。 —— 书摘
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号