SpringCloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient
发布日期:2021-06-21 17:45:59 浏览次数:37 分类:技术文章

本文共 3815 字,大约阅读时间需要 12 分钟。

下文是从stackoverflow上面找到的对这两者的解释:

There are multiple implementations of "Discovery Service" (eureka, consul, zookeeper). @EnableDiscoveryClient lives in spring-cloud-commons and picks the implementation on the classpath.  @EnableEurekaClient lives in spring-cloud-netflix and only works for eureka. If eureka is on your classpath, they are effectively the same.

原文地址为:What’s the difference between EnableEurekaClient and EnableDiscoveryClient?

意思也就是spring cloud中discovery service有许多种实现(eureka、consul、zookeeper等等),@EnableDiscoveryClient基于spring-cloud-commons, @EnableEurekaClient基于spring-cloud-netflix。

其实用更简单的话来说,就是如果选用的注册中心是eureka,那么就推荐@EnableEurekaClient,如果是其他的注册中心,那么推荐使用@EnableDiscoveryClient。


1、@EnableEurekaClient

我们具体的对@EnableEurekaClient的源码看一下,如下:

/** * Convenience annotation for clients to enable Eureka discovery configuration * (specifically). Use this (optionally) in case you want discovery and know for sure that * it is Eureka you want. All it does is turn on discovery and let the autoconfiguration * find the eureka classes if they are available (i.e. you need Eureka on the classpath as * well). * * @author Dave Syer * @author Spencer Gibb */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @EnableDiscoveryClient public @interface EnableEurekaClient { }

注解@EnableEurekaClient上有@EnableDiscoveryClient注解,可以说基本就是EnableEurekaClient有@EnableDiscoveryClient的功能,另外上面的注释中提到,其实**@EnableEurekaClient**z注解就是一种方便使用eureka的注解而已,可以说使用其他的注册中心后,都可以使用@EnableDiscoveryClient注解,但是使用@EnableEurekaClient的情景,就是在服务采用eureka作为注册中心的时候,使用场景较为单一。

Spring boot 2.0之后,@EnableEurekaClient已经不是由@EnableDiscoveryClient实现的了。

/**      * Convenience annotation for clients to enable Eureka discovery configuration      * (specifically). Use this (optionally) in case you want discovery and know for sure that      * it is Eureka you want. All it does is turn on discovery and let the autoconfiguration      * find the eureka classes if they are available (i.e. you need Eureka on the classpath as      * well).      *      * @author Dave Syer      * @author Spencer Gibb      */      @Target(ElementType.TYPE)      @Retention(RetentionPolicy.RUNTIME)      @Documented      @Inherited      public @interface EnableEurekaClient {            }

 

2、@EurekaDiscoveryClient

/** * Annotation to enable a DiscoveryClient implementation. * @author Spencer Gibb */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import(EnableDiscoveryClientImportSelector.class) public @interface EnableDiscoveryClient { }

注解@EnableDiscoveryClient上有注解@Import(EnableDiscoveryClientImportSelector.class)修饰,@Import不仅可以单独导入一个配置,另外也可以导入普通的java类,并将其声明为一个bean。此处导入EnableDiscoveryClientImportSelector.class后,加载我们用到的bean,EnableDiscoveryClientImportSelector.class源码如下:

/** * @author Spencer Gibb */ @Order(Ordered.LOWEST_PRECEDENCE - 100) public class EnableDiscoveryClientImportSelector extends SpringFactoryImportSelector
{ @Override protected boolean isEnabled() { return new RelaxedPropertyResolver( getEnvironment()).getProperty( "spring.cloud.discovery.enabled", Boolean.class, Boolean.TRUE); } @Override protected boolean hasDefaultFactory() { return true; } }

这个类中有一个覆盖父类的方法isEnabled(),返回默认为true,那么说明只要是引入了EnableDiscoveryClientImportSelector类,spring.cloud.discovery.enabled就处于enable状态。

EnableDiscoveryClientImportSelector继承了类SpringFactoryImportSelector。

在关键的方法selectImports中:

// Find all possible auto configuration classes, filtering duplicates List
factories = new ArrayList<>( new LinkedHashSet<>(SpringFactoriesLoader .loadFactoryNames(this.annotationClass, this.beanClassLoader)));

根据这一步来找到configuration class,这里的SpringFactoriesLoader.loadFactoryNames就是根据配置文件来load class,转到SpringFactoriesLoader.loadFactoryNames。

。。。。。

原文:

 

转载地址:https://blog.csdn.net/MyronCham/article/details/84312928 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:SpringCloud常见问题总结
下一篇:SpringCloud(七)Zuul路由网关

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2023年09月20日 22时52分23秒