Nacos源码学习-服务注册(客户端篇)

发布于:2024-12-18 ⋅ 阅读:(69) ⋅ 点赞:(0)

本文主要记录个人学习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> {
		//省略具体代码内容
		}
  1. public abstract class AbstractAutoServiceRegistration< R extends Registration >:定义了一个泛型抽象类,R 代表一个具体的注册信息类,这个类必须是 Registration 类或其子类的实例。
  2. implements AutoServiceRegistration:实现了 AutoServiceRegistration 接口,该接口定义了自动服务注册需要实现的方法,比如启动和停止服务注册。
  3. implements ApplicationContextAware:实现了 ApplicationContextAware 接口,这个接口允许类在Spring应用上下文中获取 ApplicationContext 的引用,从而可以访问Spring容器中的其他Bean。
  4. 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调试一下,比较简单。主要体会这里抽象方法的设计、设计模式等,值得我们反复阅读。


网站公告

今日签到

点亮在社区的每一天
去签到