Spring Cloud Alibaba 教程 | Nacos(二)
源码解析客户端注册过程
nacos作为注册中心,包含了nacos服务端(注册中心服务)和nacos客户端,nacos注册中心服务上面一讲已经介绍过了它是一个用Java语言编写开源web项目,并且拥有自己的管理台,对于nacos注册中心服务我们后面文章会单独抽出来讲解,这篇文章我们先来源码解析我们自己编写的微服务项目(nacos客户端)是如何被注册到nacos注册中心的。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
我们自己开发的微服务使用Nacos注册中心时需要加入alibaba-nacos-discovery依赖,
spring-cloud-starter-alibaba-nacos-discovery直接依赖了spring-cloud-alibaba-nacos-discovery模块。
spring-cloud-alibaba-nacos-discovery模块使用了SpringBoot的starter机制(不了解的同学可以看这篇文章:https://www.cnblogs.com/lanqie/p/11172293.html)指定了自动配置类NacosDiscoveryAutoConfiguration
进入到NacosDiscoveryAutoConfiguration这个类,这是一个配置类,负责实例化三个对象NacosRegistration、NacosServiceRegistry、NacosAutoServiceRegistration。这三个对象是Spring Cloud Nacos Discovery 遵循了 spring cloud common 标准,分别对应实现了Registration 、ServiceRegistry、AutoServiceRegistration这三个接口。
NacosRegistration
NacosRegistration实现Registration接口和ServiceInstance接口,在nacos中它代表了一个服务实例,它描述了关于实例的id、名称、ip、端口和元数据等等这些信息。
NacosServiceRegistry
NacosServiceRegistry则负责实现Spring Cloud标准接口ServiceRegistry的五个方法
- void register(R registration);
- void deregister(R registration);
- void close();
- void setStatus(R registration, String status);
- T getStatus(R registration);
并且依赖了NamingService这个接口实例对象(NacosNamingService实现了该接口),NacosNamingService负责发起远程HTTP(HTTPS)调用,并将实例信息发送到注册中心服务,完成服务注册,稍后会详细分析。
NacosAutoServiceRegistration
NacosAutoServiceRegistration继承了抽象类AbstractAutoServiceRegistration,AbstractAutoServiceRegistration实现了标准接口AutoServiceRegistration(该接口是一个空接口),并且实现了ApplicationListener应用监听接口去监听WebServerInitializedEvent事件,WebServerInitializedEvent事件代表了应用初始化完成。同时NacosAutoServiceRegistration对象还依赖了NacosRegistration和ServiceRegistry这两个对象。
所以当应用启动并且初始化完成之后,会回调onApplicationEvent方法,紧接着进入到bind方法里面,然后调用了start()方法,在start()方法里面调用了register方法。
最终通过依赖的serviceRegistry对象调用它的标准方法register(),注册Registration实例。
NacosNamingService
进入到NacosServiceRegistry的register方法,获取到serviceId和instance之后,调用namingService的registerInstance(String serviceName, Instance instance)方法。
接着进入到NacosNamingService类的registerInstance方法,在通过serverProxy发起实例注册之前,实例化了BeatInfo对象,并且通过BeatReactor先发送心跳数据到注册中心。
进入到NamingProxy的registerService()方法,在该方法里面构造HTTP(HTTPS)的请求参数,其中请求方式是HttpMethod.POST,UtilAndComs.NACOS_URL_INSTANCE值为目标地址注册中心对应处理注册的Controller的URL路径,值为:/nacos/v1/ns/instance。
BeatReactor
BeatReactor负责实例和注册中心的心跳维持,构造方法依赖了NamingProxy发起远程HTTP(HTTPS)调用,通过threadCount创建ScheduledExecutorService任务线程池服务类。实例注册的时候调用了addBeatInfo()方法,通过ScheduledExecutorService执行BeatTask任务
BeatTask任务通过serverProxy发送心跳信息给注册中心,之后立马通过executorService在period间隔时长之后再次执行BeatTask任务,如此循环达到和注册中心服务维持心跳的作用。
默认心跳间隔时长是5秒。
关注公众号了解更多原创博文
Spring Cloud Alibaba 教程 | Nacos(二)的更多相关文章
- Spring Cloud Alibaba 教程 | Nacos(一)
什么是Nacos Nacos是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos 致力于帮助您发现.配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助您快速实现动态 ...
- Spring Cloud Alibaba 教程 | Nacos(五)
扩展配置(extended configurations) 通过之前的学习,我们知道应用引入nacos配置中心之后默认将会加载Data ID= ${prefix} - ${spring.profile ...
- Spring Cloud Alibaba 教程 | Nacos(三)
使用Nacos作为配置中心 前面我们已经介绍过滤Nacos是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台.所以它可以作为注册中心和配置中心,作为注册中心Nacos可以让我们灵活配置多 ...
- Spring Cloud Alibaba 教程 | Nacos(四)
Nacos环境隔离 Nacos管理台有一个单独的菜单"命名空间",里面默认存在一个名为"public"的默认命名空间,我们在使用Nacos时不管是作为注册中心还 ...
- Spring Cloud Alibaba 教程 | Nacos(六)
集群模式部署 前面我们已经学习了Nacos作为注册中心.配置中心的相关功能,但是我们之前启动Nacos是通过单实例模式启动的,只适合在学习和开发阶段,生产环境需要保证Nacos的高可用,所以今天我们来 ...
- Spring Cloud Alibaba 使用nacos 注册中心
### 背景 上一文我们讲到了如何去搭建注册中心,这一次我们讲述如何使用nacos作为注册中心 ### spring-cloud-alibaba-basis 创建基础依赖 首先我们创建一个spring ...
- Spring Cloud Alibaba(6)---Nacos持久化Mysql8.0版本
Nacos持久化Mysql8.0版本 有关Nacos之前写过三篇文章. Spring Cloud Alibaba(3)---Nacos概述 Spring Cloud Alibaba(4)---Naco ...
- Spring Cloud Alibaba(2)---Nacos概述
Spring Cloud Alibaba(2)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...
- Spring Cloud Alibaba(4)---Nacos(注册中心)
Nacos(注册中心) 有关Spring Cloud Alibaba之前写过三篇文章. Spring Cloud Alibaba(1)---入门篇 Spring Cloud Alibaba(2)--- ...
随机推荐
- 重采样Resample 的一些研究记录。
最近项目有需要重采样算法,先找了一下,主流的就是几个开源算法,Speex / Opus / ffmpeg / sox 1.最早的事Speex,算法源自CCRMA(Center for Computer ...
- 配置anaconda 的仓库镜像
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config -- ...
- Jrebel 远程热部署[Idea]
服务器端 客户端-idea remote module 在服务器端,Tomcat的webapps下新建项目文件夹,如: demo/WEB-INF/classes/[jrebel.xml]
- ADLS_pppoe 基本设置过程
ADLS_pppoe 设置: ①:开启接口的PPPoe功能——pppoe enable ②:指明接口是拨号池1的成员——pppo-client dial-pool-number ③:创建一个逻辑上的拨 ...
- scala安装教程及简单配置
本文将介绍以下内容:Windows下安装scala运行环境,安装编译工具并简单配置,实现著名的“Hello,World". 一,Windows下安装scala运行环境 1.配置jdk,因为s ...
- 118-PHP调用带参数的成员方法
<?php class ren{ //定义人类 public function info($name,$age=3){ //定义有两个参数的成员方法 echo "我是{$name},年 ...
- Assignment写作谨慎学术抄袭是关键
学术写作(Academic Writing)作为留学生涯的“必修课”,总是让闻者叹气,抓耳挠腮.初入课堂的留学生,更是缺乏写作经验不知从何下笔,只想仰天长啸“Essay真的好难啊!!”面对一个Essa ...
- JAVA中的指针
不同于CPP,JAVA中不需要程序员对指针进行操作.不过,这不代表JAVA没有指针,事实上,JAVA的指针操作都被底层代码封装了.笔者在初学Java时,虽然就了解了形参,实参,StringBuffer ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-text-width
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- c++ 配置ffmpeg
本教程只针对windows64/32+vs2013环境配置第一步 :配环境1.打开ffmpeg官网中编译好的windows版本http://ffmpeg.zeranoe.com/builds/64位w ...