spring cloud nacos 服务注册

nacos作为服务注册、发现以及配置中心,在spring cloud alibaba生态中起着非常重要的作用。本篇随笔我们来简单聊聊nacos是如何帮助我们来注册服务的。

自动装配

nacos借助spring boot的自动装配来带动自身服务的启动
在spring-cloud-starter-alibaba-nacos-discovery-2.2.3.RELEASE.jar的META-INF/spring.factories文件中存在着很多类似键值对结构的数据,打开文件可以看到EnableAutoConfiguration下有很多的自动配置类

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration,\
com.alibaba.cloud.nacos.ribbon.RibbonNacosAutoConfiguration,\
com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration,\
com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration,\
com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\
com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration,\
com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration,\
com.alibaba.cloud.nacos.NacosServiceAutoConfiguration

服务注册过程

一般分析源码的时候,我们会大体上看一下所有的自动配置文件,其实很多时候我们从文件名称上就可以推断出那个类是最重要的
这里就不再分析为什么会找到NacosServiceRegistryAutoConfiguration了。
这里有两个英文单词还是要区分一下的,后面代码中多有涉及,一个是:registry指的是登记处;registration指的是登记这一动作。

这里先来看下NacosServiceRegistryAutoConfiguration
在这个类中使用@Bean向容器中注册了三个Bean:NacosServiceRegistry、NacosRegistration、NacosAutoServiceRegistration
从名字就可以看出最重要的应该是NacosAutoServiceRegistration
先来看下它的类图:

从类图上可以看出NacosAutoServiceRegistration的父类AbstractAutoServiceRegistration实现了两个比较重要的接口:ApplicationListener以及ApplicationContextAware
ApplicationContextAware使Bean可以获取到上下文对象
ApplicationListener提供了事件监听机制

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
	this.context = applicationContext;
	this.environment = this.context.getEnvironment();
}
// 这里监听的是一个WebServerInitializedEvent事件
// 在finishRefresh时startWebServer之后发布了一个ServletWebServerInitializedEvent事件
// 这里就是注册实例的入口了
@Override
@SuppressWarnings("deprecation")
public void onApplicationEvent(WebServerInitializedEvent event) {
	bind(event);
}

// 调用过程追踪
org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration#onApplicationEvent
      org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration#bind(event)
            org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration#start
                  com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration#register
                        com.alibaba.cloud.nacos.registry.NacosServiceRegistry#register
                              com.alibaba.nacos.client.naming.NacosNamingService#registerInstance(serviceName, groupName, Instance)
                                    com.alibaba.nacos.client.naming.net.NamingProxy#registerService
                                          com.alibaba.nacos.client.naming.net.NamingProxy#reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.POST)
posted @ 2020-11-02 14:10  coding_疯魔  阅读(358)  评论(0)    收藏  举报