nacos源码入门

nacos官方文档地址:nacos官方文档

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
简单来说,nacos就是一个注册中心、配置中心,这篇博客,我们主要来学习nacos作为注册中心,在业务应用启动的时候,是如何将当前业务应用的信息注册到nacos中的

注册中心源码

首先在 我们的业务应用中,在使用nacos的时候,需要引入nacos相关的jar包


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery
    ${latest.version}

在这个jar包中,我们看spring.factories这个文件中,自动注入的bean有哪些,主要看第一个,因为下面几个看起来都和注册中心没有关系
nacos源码入门_第1张图片
在这个bean中,会通过@Bean的形式,注入了三个bean,这三个bean是极其重要的(☆☆☆)这个打个星
nacos源码入门_第2张图片

在介绍这三个bean之前,需要先介绍一个bean

org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration#onApplicationEvent

AbstractAutoServiceRegistration

这个bean是监听了WebServerInitializedEvent事件,在监听到这个事件之后,会进行一些列的逻辑,我们来看下
nacos源码入门_第3张图片
主要关注这里的register()方法
nacos源码入门_第4张图片

protected void register() {
    this.serviceRegistry.register(getRegistration());
}

getRegistration()

可以看到,在register()方法中,只有一行代码,但是这里是核心的逻辑

我们先看getRegistration()的逻辑

com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration#getRegistration

可以看到,这里在getRegistration()注册信息的时候,实际上,是通过构造函数传进来的,这里的构造函数,可以看下前面打星的地方(☆☆☆)
nacos源码入门_第5张图片

this.serviceRegistry.register

在这里,我们可以看到,是根据入参的registration,从这个对象中获取到对应的instance信息,然后调用nameService的registerInstance()方法,这里的serviceRegistry的实现类是:

com.alibaba.cloud.nacos.registry.NacosServiceRegistry#register

nacos源码入门_第6张图片
从registration中获取到当前的ip和端口
nacos源码入门_第7张图片
这里我们知道最后会通过namingService进行服务注册,如果我们点进去,我们会发现,namingService实际上已经是nacos-api的类了

com.alibaba.nacos.client.naming.NacosNamingService#registerInstance(java.lang.String,
com.alibaba.nacos.api.naming.pojo.Instance)

可以看到,这里会开启一个心跳,然后继续调用serviceProxy的注册方法
nacos源码入门_第8张图片

注册心跳:
会发现,这里注册心跳,使用的是ScheduledExecutorService.schedule()方法,我们知道,schedule方法只会执行一次,按道理来讲,既然是心跳服务,那一定是需要定时去发送心跳的,我们接着来看下这里的task

nacos源码入门_第9张图片
会发现,在task方法中,执行了之后,会继续调用schedule方法,触发下次调用
nacos源码入门_第10张图片

在namingProxy的registerService()方法中,会构建一个http请求,去调用nacos服务端的代码,这里服务端是如何处理的,暂时先不关心,后面单独起博客去记录
nacos源码入门_第11张图片

回归到NacosDiscoveryAutoConfiguration

我们再把思路拉会到这个bean中,这个bean中,注入的三个bean分别是:
NacosAutoServiceRegistration(别名A类)
NacosRegistration(别名B类)
NacosServiceRegistry(别名C类)
为了便于描述这三个bean之间的关系,我们分别命名别名为A、B、C类

根据前面的代码,我们会发现,在注册的过程中,实际上就是通过这个类中注入的三个bean来完成注册的

先说结论,实际上是A类会监听WebServerInitializedEvent,在监听到这个事件之后,会通过B类获取到当前业务系统的ip和端口信息,最后去调度,通过C类的注册方法,完成服务的注册

NacosAutoServiceRegistration

会发现,这个类继承了AbstractAutoServiceRegistration,这个类的作用,可以看博客的开头
nacos源码入门_第12张图片

NacosRegistration

我们发现,在使用NacosRegistration.getPort()的时候,是通过nacosDiscoveryProperties对象获取的
nacos源码入门_第13张图片
nacosDiscoveryProperties是通过构造函数注入的,所以我们接着往上看
nacos源码入门_第14张图片

nacos源码入门_第15张图片

最终我们会发现,是通过解析配置文件中,以spring.cloud.nacos.discovery开头的配置信息
nacos源码入门_第16张图片
这也是nacos官网,告诉我们在配置文件中,要这样配置的原因
nacos源码入门_第17张图片

NacosServiceRegistry

这个类,可以看 this.serviceRegistry.register 这一小节,不再阐述

总结

对于nacos注册中心,业务应用是如何注册的,再总结下

  1. 在应用启动之前,我们需要引入springcloud-nacos相关的jar包
  2. 在jar包中,会通过springboot自动注入的功能,注入了NacosRegistration、NacosServiceRegistry、NacosAutoServiceRegistration这三个bean
  3. 其中NacosAutoServiceRegistration是继承了spring-cloud-common中的一个abstract类,在这个抽象类中,spring-cloud会定义好,服务注册的流程(简单来说,就是监听到WebServerInitializedEvent事件之后,会调用serviceRegistry.register()方法,方法的入参是通过registration类来获取的)
  4. spring-cloud-common中定义了注册的规则,至于底层的实现是nacos,还是zookeeper,还是其他注册中心,springcloud不关心,业务引入的是哪个类型的注册中心,这里就会调用对应的实现类去注册
  5. 所谓的注册,实际上在和nacos交互的时候,会通过http请求的方式去交互

你可能感兴趣的:(微服务,spring,java,spring,boot)