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)--- ...
随机推荐
- SQL语句--分组统计
一.教师号 星期号 是否有课1 2 有1 3 有2 1 有3 2 有`1 2 有写一条sql语句让你变为这样的表教师号 星期一 星期二 星期三1 2 12 13 1各星期下的数字表示:对应的教师在星期 ...
- 安装redis cluster时:undefined method `invoke_with_build_args' for nil:NilClass
gem install -l redis-3.3.3.gem ERROR: Loading command: install (LoadError) cannot load such file -- ...
- Day4-T1
原题目 Hades 与 Dionysus 在狂饮后玩起了多米诺骨牌的小游戏. 现在桌上有 N 块多米诺骨牌,每块多米诺骨牌上半部分和下半部分上都有一个整数.每次翻转可让 一块多米诺骨牌上下翻转,即上下 ...
- js加密(十四)mail.yw.gov.cn/ RSA
1. url: http://mail.yw.gov.cn/ 2. target:登录js 3. 简单分析: 寻找加密js: 3.1 直接寻找加密的参数p是不好找的,所以我们试着去寻找一些更明显的参数 ...
- ssh: connect to host 120.79.26.164 port 22: Connection timed out报错问题
要是使用阿里云服务器,出现这种错误,一般是端口没有打开.需要在阿里云控制台中设置端口后,即可使用ssh连接.
- 114-PHP判断类变量是否相同
<?php class ren{ //定义人类 } class mao{ //定义人类 } $ren=new ren(); //实例化人类的对象 $ren_a=new ren(); //实例化人 ...
- excel处理经纬度
=LEFT(A1,FIND("°",A1)-1)*1+MID(A1,FIND("°",A1)+1,2)/60+MID(A1,FIND("′" ...
- JS笔记03
JS图片库 标记 需求效果: 网页中的图片链接显示在网页中的图片框内部而不是打开新的页面 //html部分 <!DOCTYPE html> <html> <head> ...
- Opencv调用深度学习模型
https://blog.csdn.net/lovelyaiq/article/details/79929393 https://blog.csdn.net/qq_29462849/article/d ...
- js interval ,timeout
var inter; intervatest("2019-08-22 09:12:00"); function intervatest(str) { ShowCountDown(s ...