【Nacos】注册中心源码入口

364 阅读1分钟

当我们项目启动的时候,会发现在控制台上有这么一行日志,内容如下:

{com.alibaba.cloud.nacos.registry.NacosServiceRegistry}-nacos registry, IDCP xxx-service 127.0.0.1:9998 register finished

于是我们走到NacosServiceRegistry里面,找到这行日志是在register方法打印出来的。

那为什么项目启动的时候会执行这个方法呢?凭什么?

我们首先要搞清楚NacosServiceRegistry.register()是被NacosAutoServiceRegistration.register()调用的。

然后NacosAutoServiceRegistration实现了AbstractAutoServiceRegistration。

而AbstractAutoServiceRegistration是一个监听器,实现了ApplicationListener,就是说它对WebServerInitializedEvent这个事件感兴趣。当某个时间点发布了这么一个事件,那么AbstractAutoServiceRegistration就会触发onApplicationEvent方法,最终走到NacosServiceRegistry.register()里面去。

那是什么时候会发布WebServerInitializedEvent呢?是谁发布这个事件的呢?

不用想,肯定是在springboot项目启动的时候发布了这么一个事件。

springboot项目使用的是AnnotationConfigServletWebServerApplicationContext这个上下文,当项目启动的时候,它的父类ServletWebServerApplicationContext就会发布一个WebServerInitializedEvent,如下代码:

@Overrideprotected void finishRefresh() {   
    super.finishRefresh();   
    WebServer webServer = startWebServer();   
    if (webServer != null) {
        publishEvent(new ServletWebServerInitializedEvent(webServer, this)); 
    }
}

那问题又来了,AbstractAutoServiceRegistration是一个抽象类,它的实现类NacosAutoServiceRegistration在什么时候实例化的?

在spring-cloud-common包下有个spring.factory,通过这个文件,就可以实现自动配置,将AbstractAutoServiceRegistration的实现类实例化。

同理,在spring-cloud-starter-alibaba-nacos-discovery包下也有一个spring.factory文件,它也会将必要的类(NacosServiceRegistry)都实例化好。

至此,springboot、springcloud、nacos就串到一起了,凭的就是基于事件的编程模型。

总结: