SpringCloud 注解之@EnableEurekaServer与@EnableEurekaClient原理

  • SpringCloud 版本Hoxton.SR1
  • SpringBoot 版本2.2.1.RELEASE
  • 关键字@EnableEurekaServer,@EnableEurekaClient底层实现
  • 首先SpringCloud承载于SpringBoot之上,而SpringBoot又依赖Spring相关组件,那么我们分析这些注解时势必要联想到SpringBoot和Spring之上。

1. @EnableEurekaServer

  • 我们点开注解会发现 :
    image.png
    ,@EnableXXX注解被@Import(...)修饰,我在SpringBoot专题里面启动源码解析过程中提到:容器会优先注册资源类(启动类)bean定义,bean定义解析阶段是通过 ConfigurationClassPostProcessor后置处理器处理的,对此部分知识有盲区的同学可以参考我之前的SpringBoot启动源码解析系列
    SpringBoot启动 源码深度解析(一)
    SpringBoot启动 源码深度解析(二)
    SpringBoot启动 源码深度解析(三)
    SpringBoot启动 源码深度解析(四)
    顺着解析@Import注解的思路接着往下看,我们发现导入的类是 EurekaServerMarkerConfiguration.class,点进去发现:
    image.png
    ,咋一看此类好像没有什么用处,那么此时我们看源码的时候就要从几个方面入手了:
  • 若你的英文阅读能力良好,那么我建议从注释入手,一些比较标准的框架,一般注释都会很清晰,也可以很直观的看出来当前类的功能
  • 可以 将鼠标放在类上,输入 CTRL + 鼠标左键,查看有哪些类引用了当前类
  • 一般上面两种方式可以定位到当前类的作用了,我们尝试使用第一种方式查看究竟。注释中提到了 EurekaServerAutoConfiguration类,从字面意思可以看出来当前类是个自动装配类,我们找到这个类如下:
    image.png
    ,此处又引出一个注解或者一类注解 @ConditionalOnXXX,此类注解被 Spring的条件注解@Conditional修饰,意在满足某种条件或者不存在某种条件 才会去自动装配当前类。可以看出只有存在 EurekaServerMarkerConfiguration.Marker.class类型的Bean才会去装配当前类(关于自动装配的功能,读者可以自己去查阅资料或者我后续会推出自动装配的功能解读)。
  • 此时我们就很清晰了, EurekaServerMarkerConfiguration.Marker内部类是 EurekaServerAutoConfiguration实现自动装配的必要条件,而@EnableEurekaServer中又被@Import修饰,所以标注上@EnableEurekaServer之后会触发一系列的自动装配功能,当然此注解也可以替换为任意带有@Import(EurekaServerMarkerConfiguration.class)的自定义注解。
  • 此处的@EnableEurekaServer就类似个发动机,正如 Enable名字一样,而且形如其他带有@EnableXXX的注解也都是相同的套路。

2. @EnableEurekaClient

  • 查看注解源码发现:
    image.png

    此时我们会发现,这个@EnableEurekaClient的套路咋跟@EnableEurekaServer的套路咋不一样了,世界观突然颠覆了...

  • 那我们暂时先不管套路的问题,此时发现注释里面也没有提到相关的类,只是说加上此注解之后会实现客户端的自动发现。那我们就使用另外一种方法查询哪些类包含这个注解:
    image.png
    ,卧槽 ?只有启动类引用到了,没有其他类用到... 这尼玛什么情况~
    于是查阅 spring-cloud-netflix-eureka-client-1.3.x GitHub地址 发现 1.3的 @EnableEurekaClient:
    image.png
    ,但是从之后的版本开始@EnableDiscoveryClient注解就已经被删除了,但是注释啥的都没变!!! @EnableEurekaClient还没说明白,咋又出来个@EnableDiscoveryClient,看官莫急,等我慢慢道来。
  • @EnableEurekaClient :根据官方说明是,只要classpath下包含spring-cloud-netflix-eureka-client的相关class,即可实现Eureka的自动装配。另外根据作者亲测,应用只要包含spring-cloud-netflix-eureka-client的相关class,即使不使用@EnableEurekaClient注解也可以实现客户端的注册,带上注解之后会显得更清晰,说明这是一个客户端
  • @EnableDiscoveryClient:此注解的作用更强大的地方在于,客户端自动发现,包括但不限于 Eureka注册中心,还可以发现zookeeper、console、nacos等注册中心。

结语:相信此时我们对Eureka的服务端与客户端的Enable注解驱动已经有所了解了。本篇更偏重的是服务注册与发现的原理分析,下一篇我们将继续探究Eureka服务端与Eureka客户端的具体实现细节,精确分析到每个重要的关键类甚至关键方法

  1. ☛ 文章要是勘误或者知识点说的不正确,欢迎评论,毕竟这也是作者通过阅读源码获得的知识,难免会有疏忽!
  2. 要是感觉文章对你有所帮助,不妨点个关注,或者移驾看一下作者的其他文集,也都是干活多多哦,文章也在全力更新中。
  3. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处!

你可能感兴趣的:(SpringCloud 注解之@EnableEurekaServer与@EnableEurekaClient原理)