前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >防止内卷,拒绝潜规则|工兵踩地雷之Spring Cloud Alibaba核心注册原理|35岁程序员那些事

防止内卷,拒绝潜规则|工兵踩地雷之Spring Cloud Alibaba核心注册原理|35岁程序员那些事

作者头像
35岁程序员那些事
发布2022-09-23 17:03:27
2120
发布2022-09-23 17:03:27
举报

程序员不能忽略每一个细节

用过Spring Cloud Alibaba或者Spring Cloud 的开发人员应该都知道注解@EnableDiscoveryClient,但是,在实际的项目开发中,估计很多开发人员都很少会去关注它,因为它太不起眼了。

很多开发会觉得Spring Cloud Alibaba不是很简单吗?我百度一下就可以搜索到一大堆原理分析及项目Demo,但是你是否真的从系统思维的角度去分析Spring Cloud Alibaba存在的价值。

笔者一般都会这么看待这个问题。

我会打开源码,找到这个注解@EnableDiscoveryClient,具体如下:

代码语言:javascript
复制
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//重点关注这个类
@Import(EnableDiscoveryClientImportSelector.class)
public @interface EnableDiscoveryClient {
  //重点关注这个方法
  boolean autoRegister() default true;
}

好吧,通过观察发现,这个是一个注解驱动类,并且默认就开启自动配置。你会恍然大悟,原来我在项目中,按照如下方式就可以开启服务注册与订阅(基于Spring Cloud Alibaba)。

代码语言:javascript
复制
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
//加上一个注解
@EnableDiscoveryClient
public class DistributedServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DistributedServerApplication.class, args);
    }
}

如果是对技术有洁癖的开发人员 ,肯定还是会想,这个怎么做到的呢?于是就会打开EnableDiscoveryClientImportSelector类,部分代码演示如下。

代码语言:javascript
复制
@Order(Ordered.LOWEST_PRECEDENCE - 100)
public class EnableDiscoveryClientImportSelector
    extends SpringFactoryImportSelector<EnableDiscoveryClient> {
  @Override
  public String[] selectImports(AnnotationMetadata metadata) {
    ...
    //默认autoRegister=true
    if (autoRegister) {
      List<String> importsList = new ArrayList<>(Arrays.asList(imports));
      //默认使用Spring Boot的自动装配原理,初始化AutoServiceRegistrationConfiguration类,注意需要关注这个类
      importsList.add(  "org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration");
      imports = importsList.toArray(new String[0]);
    }
    ...
  }
}

好吧,看到这里也许你会觉得,这个不就是Spring Boot的自动装配的原理吗?很简单啊,但是你又要想想,它是怎么将Spring Cloud ALibaba与Spring Cloud 的服务注册与订阅的底层原理关联起来的呢?

如果是我,我会继续往下看AutoServiceRegistrationConfiguration类,如下所示。

代码语言:javascript
复制
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(AutoServiceRegistrationProperties.class)
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
    matchIfMissing = true)
public class AutoServiceRegistrationConfiguration {
  //这是一个什么类,我相信大家第一反应都是这么认为的,我擦。
  //那么重点关注注解@EnableConfigurationProperties,它会让AutoServiceRegistrationProperties类,完成Spring IOC容器中的Bean的装配,也就是IOC容器中会有这么一个Bean对象(Bean的类型为AutoServiceRegistrationProperties类)
}

好吧,这个时候你才有点理解了,原来是利用了Spring Boot 的条件注解,控制Bean的装配。那么你又有没有想过,为什么要使用条件注解控制这个Bean的初始化,从因果关系的角度去想,肯定是有地方要靠这个Bean来做开关呢。

于是,我尝试着去查一下,还真被我猜中了,具体如下。

代码语言:javascript
复制
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties
@ConditionalOnNacosDiscoveryEnabled
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
    matchIfMissing = true)
@AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class,
    AutoServiceRegistrationAutoConfiguration.class,
    NacosDiscoveryAutoConfiguration.class })
public class NacosServiceRegistryAutoConfiguration {
  ...
  //好吧,我的亲爹,原来是为了控制NacosRegistration的初始化
  @Bean
  @ConditionalOnBean(AutoServiceRegistrationProperties.class)
  public NacosRegistration nacosRegistration(
      ObjectProvider<List<NacosRegistrationCustomizer>> registrationCustomizers,
      NacosDiscoveryProperties nacosDiscoveryProperties,
      ApplicationContext context) {
    return new NacosRegistration(registrationCustomizers.getIfAvailable(),
        nacosDiscoveryProperties, context);
  }
  //原来也是为了控制NacosAutoServiceRegistration的初始化
  @Bean
  @ConditionalOnBean(AutoServiceRegistrationProperties.class)
  public NacosAutoServiceRegistration nacosAutoServiceRegistration(
      NacosServiceRegistry registry,
      AutoServiceRegistrationProperties autoServiceRegistrationProperties,
      NacosRegistration registration) {
    return new NacosAutoServiceRegistration(registry,
        autoServiceRegistrationProperties, registration);
  }
  ...
}

分析完之后,是不是很熟悉NacosServiceRegistryAutoConfiguration类,没错这个就是Spring Cloud Alibaba的项目spring-cloud-starter-alibaba-nacos-discovery中的一个普通的Java 类。

好吧,是不是通过我这样梳理之后,感觉原来如此,恍然大悟。

总结

35岁程序员,还是要具备代码细节能力,应了行业内大佬说的话,要有清零的思维,把自己当作一个技术小白,重新认识自己。

感恩节是美国人民独创的一个古老节日,也是美国人合家欢聚的节日。1941年,美国国会正式将每年11月第四个星期四定位“感恩节”,作为程序员,我们要感恩这个内卷的行业,到逼我们变得如此的“读书破万卷”

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构随笔录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档