2、Nacos客户端自动服务注册流程

  如果您对Nacos工作流程和原理还不是很清楚的话,建议从前面的文章开始看:
  1、nacos功能简介

  Nacos注册中心支持AP和CP两种模式,其中AP模式是最常用的,服务注册到nacos-server后,nacos-server是将服务实例数据保存在内存中,这种方式的缺点就是没有进行持久化,nacos-server重启之后服务实例数据就会丢失,需要重新注册,因此这种模式下的所有的nacos-client对于服务端来说都是临时节点,那么与之相对应的就是持久节点,即CP模式,这种模式不仅仅会将客户端的实例数据保存在内存中,同时还会持久化到磁盘文件中,即使nacos-server服务重启,实例数据也不会丢失。

  我们最常用的就是AP模式,其实对于注册中心来说,即便重启后实例数据全部丢失,讲道理影响并不大,因为客户端与服务端都是有心跳机制的,如果服务端注册表中没有该客户端实例数据,那么客户端的心跳机制会进行重新注册,因此基本上不会有多大影响,但是AP给我们带来的好处却显而易见:高性能、高可用、低延迟。本文将对AP模式下的服务注册进行详细介绍,让我们一起来了解一下Nacos的高性能、高可用、低延迟的特性是如何保证的,这也正是Nacos的魅力所在。

  Nacos我会分成多个篇幅来进行讲解,本文主要说下Springboot项目服务自动注册流程,什么叫自动注册呢?举个例子:当我们的微服务启动的时候,就会自动注册到nacos,并没有要求我们手动去调用某个注册的方法来进行注册,这是如何做到的?下面将会进行详细讲解。

1、下载、编译源码
  前往Github:https://github.com/alibaba/nacos下载源码,导入到idea,nacos源码导入要求maven 3.2.5以上版本,否则可能编译时会有很多莫名其妙的问题。
在这里插入图片描述
上图为Nacos的源码结构,我使用的是1.4.1版本。其中比较核心的就是这几个包:
nacos-api: 核心api,主要提供一些核心的接口和类,如ConfigService、ConfigFactory、Listener等;
nacos-client: Nacos客户端与服务端交互的包;
nacos-common: 通用包,提供一些通用的常量类、工具类、数据模型以及一些核心的接口等等;
nacos-config: 配置管理的服务端包,采用SpringMVC对外提供配置发布、获取、删除、监听等一系列操作接口;
nacos-consistency: 数据一致性协议相关接口,如APProtocol、CPProcotol、ConsistencyProtocol等;
nacos-core: Nacos内核包,非常核心,如nacos-consistency中一致性协议的实现、集群管理等等,后面也会重点介绍;
nacos-naming: Nacos注册中心服务端包,采用SpringMVC对外提供关于服务注册与发现等一系列操作接口;
nacos-console: Nacos控制台,这也是Nacos服务的入口,同时也提供了命名空间操作相关接口等等;通过pom.xml可以看到它依赖了注册中心和配置中心两个服务端包:
在这里插入图片描述
  源码方式启动Nacos服务就需要找到该包下的com.alibaba.nacos.Nacos类启动即可,它是springboot项目;

nacos-config和nacos-naming包都是SpringMVC项目,如果项目不需要使用控制台或者不使用SDK(nacos-client)的话,也是可以单独使用nacos-config和nacos-naming的,可以通过OpenAPI进行调用。

  nacos-distribution: 通过maven将nacos源码进行打包,打包后的控制台服务的jar包就存放在该包的target路径下
在这里插入图片描述
  将压缩包拷出来解压出nacos-server.jar,java -jar nacos-server.jar即可启动Nacos服务。

2、服务注册流程
  现在开始进入正题,首先需要搭建一个微服务作为nacos的客户端,搭建方法不再赘述,参见Nacos官方文档:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
找到nacos注册中心的依赖包,打开spring.factories,找到Nacos注册中心的自动配置类:NacosServiceRegistryAutoConfiguration
在这里插入图片描述
在这里插入图片描述

Springboot项目启动的入口一般是各种自动配置类,这些自动配置类的加载会通过而读取spring.factories文件,并将文件中的类加载成bean放入Spring容器中,关于Springboot原理可以自行了解

NacosServiceRegistryAutoConfiguration这个类算是nacos客户端启动时的一个入口类了,代码:

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties
@ConditionalOnNacosDiscoveryEnabled
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
      matchIfMissing = true)
@AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class,
      AutoServiceRegistrationAutoConfiguration.class,
      NacosDiscoveryAutoConfiguration.class })
public class NacosServiceRegistryAutoConfiguration {

   @Bean
   public NacosServiceRegistry nacosServiceRegistry(
         NacosDiscoveryProperties nacosDiscoveryProperties) {
      return new NacosServiceRegistry(nacosDiscoveryProperties);
   }

   @Bean
   @ConditionalOnBean(AutoServiceRegistrationProperties.class)
   public NacosRegistration nacosRegistration(
         ObjectProvider<List<NacosRegistrationCustomizer>> registrationCustomizers,
         NacosDiscoveryProperties nacosDiscoveryProperties,
         ApplicationContext context) {
      return new NacosRegistration(registrationCustomizers.getIfAvailable(),
            nacosDiscoveryProperties, context);
   }

   @Bean
   @ConditionalOnBean(AutoServiceRegistrationProperties.class)
   public NacosAutoServiceRegistration nacosAutoServiceRegistration(
         NacosServiceRegistry registry,
         AutoServiceRegistrationProperties autoServiceRegistrationProperties,
         NacosRegistration registration) {
      return new NacosAutoServiceRegistration(registry,
            autoServiceRegistrationProperties, registration);
   }
}

@AutoConfigureAfter注解里有个主要的类:AutoServiceRegistrationAutoConfiguration,这个类里会注入AutoServiceRegistration的bean,这个bean后面会有用到,这里先不展开了。

整体看下NacosServiceRegistryAutoConfiguration这个类,有3个@Bean注解:

  • nacosServiceRegistry(nacosDiscoveryProperties)方法

  定义了NacosServiceRegistry的bean,并且为其属性nacosDiscoveryProperties赋值,即将从配置文件中读取到的配置信息赋值进去待用。这个bean非常重要,服务注册的核心代码就在这里面,后面会说;

  • nacosRegistration(……)方法

  这个方法也没干太多事,主要就是定义了NacosRegistration的bean,后面会有用;

  • nacosAutoServiceRegistration(NacosServiceRegistry,AutoServiceRegistrationProperties,NacosRegistration)

  这个方法就非常核心了,注意到它的参数中有2个就是前面定义的两个bean,其实就是为了这个方法服务的,由NacosAutoServiceRegistration类的构造器传入NacosAutoServiceRegistration类中:NacosAutoServiceRegistration(registry, autoServiceRegistrationProperties, registration),后面的流程都将以这句代码作为入口。

2.1 客户端服务注册入口
  跟踪代码(我就不一步一步讲了,可能会有跳跃,主要看主流程代码)到AbstractAutoServiceRegistration类,可以整体看下这个类的结构:
在这里插入图片描述
  其中AutoServiceRegistration就是前面提到的@AutoConfigureAfter注解里注入的bean。最主要的就是这个类实现了ApplicationListener这个接口,这是Spring提供的事件监听接口(Spring会在所有bean都初始化完成之后发布一个事件,ApplicationListener会监听所发布的事件),用来监听感兴趣的事件,这里监听的感兴趣的事件是WebServerInitializedEvent,这是springboot定义的一个事件,主要是tomcat启动时会发布一个ServletWebServerInitializedEvent事件,就是WebServerInitializedEvent的子类,这里就不详说了,只需要知道在项目启动的时候就会发布WebServerInitializedEvent事件,然后就会被AbstractAutoServiceRegistration监听到,进而就会执行onApplicationEvent方法,在这个方法里就会进行服务注册(似乎可以联想到项目启动时服务就会自动注册了)。

  既然实现了ApplicationListener接口,那么自然就重写了onApplicationEvent(event)方法:

public void onApplicationEvent(WebServerInitializedEvent event) {
   bind(event);
}

继续往下跟(中间会跳过一些非关键代码),直到register()方法:

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

  register()方法从命名上来看就可以知道这是注册的方法,事实也确实如此,在这个方法中会通过nacos-client包来调用nacos-server的服务注册接口来实现服务的注册功能,这个会放在下一篇讲。其中serviceRegistry就是NacosServiceRegistryAutoConfiguration类中第一个@Bean定义的bean;getRegistration()获取的就是第二个@Bean定义的NacosRegistration的实例,这两个bean实例都是通过第3个@Bean传进来的,所以这里就可以把NacosServiceRegistryAutoConfiguration类中那3个@Bean给串起来了。

  然后就会进到NacosServiceRegistry.register(Registration registration)方法了,NacosServiceRegistry这个类实现了ServiceRegistry接口,该接口是springcloud提供的服务注册的一个规范,也就是说如果你想自己写一个注册中心框架并且打算整合到springcloud里,那么实现这个接口就是一个很好的方式。可以看到这个接口提供了对注册中心最基本的一些操作方法:
在这里插入图片描述
  代码跟到这里,我们看到的其实都是springcloud或者是nacos与springcloud整合包的代码,从这个方法开始就会进入到nacos原生框架的代码了,会首先进入nacos-client这个包的代码,这是负责nacos客户端与服务端交互的代码包。到这里小小的总结一下,从项目启动到服务注册这一块的流程如下图:
在这里插入图片描述
  虽然到目前为止,还没涉及到真正的服务注册的流程,但是至少可以明白了客户端是怎么实现服务自动注册的,主要就是借助了springboot的自动配置功能,在项目启动时通过自动配置类NacosServiceRegistryAutoConfiguration将NacosServiceRegistry注入进来,并调用该类中的注册方法register(registration)实现服务的自动注册(通过Spring的事件监听机制ApplicationListener切入进来)。

  以上就是Nacos客户端服务自动注册原理,从下一篇开始就会进入服务注册的核心流程了,这也是整个Nacos服务治理模块最为核心的内容。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值