Spring Cloud版本:Angle -> Brixton -> Camden -> Dalston -> Edgware -> Finchley
一、Dalston或更早期的版本
 为了启用服务注册发现功能。需要在主启动类上增加@EnableDiscoveryClient或者@EnableEurekaClient注解,例如以下代码:

@EnableEurekaClient
@SpringBootApplication
public class ScjzfpRestApplication {

    public static void main(String[] args) {
        SpringApplication.run(ScjzfpRestApplication.class, args);
    }
}

EnableEurekaClient源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@EnableDiscoveryClient
public @interface EnableEurekaClient {

}

 EnableEurekaClient 中使用了EnableDiscoveryClient。因此,从使用角度来看两者已经没有什么区别了,官方建议使用EnableDiscoveryClient。
区别:
 @EnableDiscoveryClient注解是基于spring-cloud-commons依赖,并且在classpath中实现。
 @EnableEurekaClient注解是基于spring-cloud-netflix依赖,只能为eureka作用。
 @EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
 从Spring Cloud 1.0.0.RC1版本开始,就已经不推荐使用EnableEurekaClient和EnableHystrix了。服务注册发现功能被抽象后放入spring-cloud-commons库,该库的EnableDiscoveryClient可以取代旧的EnableEurekaClient,使用注解EnableDiscoveryClient就能启用服务注册发现功能。 同理,EnableHystrix也被EnableCircuitBreaker取代了。
二、Edgware或者更新的版本
EnableEurekaClient源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface EnableEurekaClient {

}

 之前版本中的@EnableDiscoveryClient注解已经取消了,而且也没有用到任何@Import注解,因此,在代码不用再添加EnableEurekaClient注解。
 EnableDiscoveryClient注解现在也没用了 。只要依赖了以spring-cloud-starter-netflix为前缀的库(例如spring-cloud-starter-netflix-eureka-client),就启用了服务注册发现功能。使用配置项spring.cloud.service-registry.auto-registration.enabled=false即可禁止服务注册发现功能。spring容器在查询spring.factories的过程中,如果找到了EnableDiscoveryClient的配置,就会实例化该配置对应的服务注册发现:例如eureka、consul、zookeeper等。
 EnableDiscoveryClient不是必须的,只要classpath中存在DiscoveryClient的实现就可以保证将应用注册到注册中心了,只依赖以spring-cloud-starter-netflix为前缀的库(例如spring-cloud-starter-netflix-eureka-client),就启用了服务注册发现功能,利用spring容器通过META-INF/spring.factories文件加载配置的能力。
 打开工程spring-cloud-netflix-eureka-client(Edgware版对应的该工程版本号为1.4.0.RELEASE),去看src\main\resources\META-INF目录下的spring.factories文件,发现在springboot的自动配置项中,出现了一个关键配置EurekaDiscoveryClientConfiguration,如下图:
在这里插入图片描述
 服务注册发现功能是否启动,是由配置类EurekaDiscoveryClientConfiguration控制的,在Edgware版本中,如果开启了springboot的自动配置,那么EurekaDiscoveryClientConfiguration就会生效,因此不是靠EnableDiscoveryClient注解来控制了;
 Dalston版的Spring Cloud,其spring-cloud-netflix-eureka-client工程的版本号为1.3.6.RELEASE,打开该工程下面的spring.factories文件,内容如下:
在这里插入图片描述
在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包中的spring.factories文件。
 如果当前工程使用了EnableDiscoveryClient注解,按照spring.factories中的配置,配置类EurekaDiscoveryClientConfiguration会生效,进而开启服务注册发现功能。

三、总结:
在Spring Cloud的Dalston及其之前的版本中:
 1、从2014年的Spring Cloud 1.0.0.RC1版本开始,官方就推荐使用EnableDiscoveryClient来取代EnableEurekaClient。
 2、EnableEurekaClient源码中使用了注解EnableDiscoveryClient,因此如果要使用eureka的注册发现服务,两者功能是一样的。
 3、EnableDiscoveryClient注解在spring.factories配置中通过配置项EurekaDiscoveryClientConfiguration来开启服务注册发现功能;

在Dalston之后的版本中(不含Dalston):
 1、在spring.factories配置中,配置类EurekaDiscoveryClientConfiguration被配置到springboot的自动配置注解中,与EnableDiscoveryClient注解没有关系了,也就是说只要开启了springboot的自动配置,服务注册发现功能就会启用。
 2、 EnableEurekaClient源码中没有使用注解EnableDiscoveryClient,此时EnableEurekaClient已经没用了。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐