EnableDiscoveryClient、EnableEurekaClient

2,854 阅读3分钟

Spring Cloud版本:Angle -> Brixton -> Camden -> Dalston -> Edgware -> Finchley

一、Dalston或更早期的版本

为了启用服务注册发现功能。需要在主启动类上增加@EnableDiscoveryClient或者@EnableEurekaClient注解,例如以下代码:

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

EnableEurekaClient源码:

@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源码:

@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版的SpringCloud,
其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已经没用了。