本文主要记录个人学习Nacos在服务注册时客户端是如何处理的相当代码片段。如果你也刚好刷到这篇文章,希望对你有所帮助。
Java:1.8
Springboot:2.6.2
spring-cloud-starter-alibaba-nacos-discovery: 2021.0.5.0
Maven: 3.5.4
开发工具:idea
这里假设你们已经对Spring Cloud生态有所了解,其中spring-cloud-commons
,它是Spring项目的核心组件之一,它提供了 Spring Cloud 组件之间共享的一些公共类和功能(其实是做了很多的抽象,由其他组件来具体实现),这个模块的主要作用是为不同的 Spring Cloud 子项目提供一个通用的库,以减少代码重复并确保一致性。本次要学习的服务注册正是来源于这个组件下的org.springframework.cloud.client.serviceregistry
包:
从包名和类名可以看到基本是跟服务注册相关的一些类,其中重点关注一下org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration
这个抽象类
public abstract class AbstractAutoServiceRegistration<R extends Registration>
implements AutoServiceRegistration, ApplicationContextAware, ApplicationListener<WebServerInitializedEvent> {
//省略具体代码内容
}
- public abstract class AbstractAutoServiceRegistration< R extends Registration >:定义了一个泛型抽象类,R 代表一个具体的注册信息类,这个类必须是 Registration 类或其子类的实例。
- implements AutoServiceRegistration:实现了 AutoServiceRegistration 接口,该接口定义了自动服务注册需要实现的方法,比如启动和停止服务注册。
- implements ApplicationContextAware:实现了 ApplicationContextAware 接口,这个接口允许类在Spring应用上下文中获取 ApplicationContext 的引用,从而可以访问Spring容器中的其他Bean。
- implements ApplicationListener< WebServerInitializedEvent >:实现了
ApplicationListener
接口,并指定了它监听的事件类型为WebServerInitializedEvent
。这意味着这个类可以监听Web服务器初始化完成的事件,比如服务注册。
这个抽象类里定义了一套标准的接口和方法和实现注册、销毁等动作(具体代码可以去源码自己看,这里就不贴出来了)。这样做的好处使得不同的服务注册中心(如 Eureka、Consul、Zookeeper)可以被统一管理。
接下来我们再看一下它的实现类com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration
public class NacosAutoServiceRegistration
extends AbstractAutoServiceRegistration<Registration> {
private static final Logger log = LoggerFactory
.getLogger(NacosAutoServiceRegistration.class);
private NacosRegistration registration;
public NacosAutoServiceRegistration(ServiceRegistry<Registration> serviceRegistry,
AutoServiceRegistrationProperties autoServiceRegistrationProperties,
NacosRegistration registration) {
super(serviceRegistry, autoServiceRegistrationProperties);
this.registration = registration;
}
//省略其他内容
}
这里我们看到他有一个构造函数,查看一下这个构造函数调用的位置,是这里NacosServiceRegistryAutoConfiguration
,我们再看这个自动配置类在哪里使用的,发现是spring.factories文件中:
至此,我们总结一下服务注册时客户端这边做的动作:
项目引入 spring-cloud-starter-alibaba-nacos-discovery 以后,利用Spring的自动装配,在它的spring.facotries中加载了 NacosServiceRegistryAutoConfiguration, NacosServiceRegistryAutoConfiguration 中加载了一个叫 NacosAutoServiceRegistration 的Bean,这个Bean的父类实现了 ApplicationListener 这个接口,并监听了WebServerInitializedEvent类型的事件,在Tomcat启动后会发布WebServerInitializedEvent的事件,事件被监听到以后,就会调用 NacosServiceRegistry的 register 方法向Nacos服务端注册实例,临时实例使用 RPC 调用,永久实例使用 HTTP 调用。
好了,这篇文章到这里也就结束了,我没有贴大段的代码,具体代码可以实际去本地debug调试一下,比较简单。主要体会这里抽象方法的设计、设计模式等,值得我们反复阅读。