Nacos注册中心和配置中心流程原理
一、Nacos注册中心
1、服务启动后---->服务注册原理
- springCloud集成Nacos实现原理: 服务启动时,在spring-cloud-commons包下 spring.factories文件中自动装配,当webServer初始话完成后,会注册监听事件。调用Nacos的register注册服务
- springCloudAlibaba实现原理,springCloudAlibaba使用的是Nacos为注册中心,自动装配的配置类是 DubboLoadBalanceRestTemplateAutoConfiguration,原理和上述一致,基于事件监听,不过事件类型不通,spring CloudAlibaba使用了@EvevntListener(ApplicationStartEvent.class) ,该事件是在应用程序初始化上下文后执行,即refresh()方法初始话上下文
2、服务注册时---->与Nacos建立心跳原理
- 服务调用registerInstance方法进行服务注册,registerInstance方法中,会调用addBeatInfo方法与Nacos Server服务建立心跳。
- 服务端是实现”心跳检测“原理:即executorService.schedule(BeatTask beatTask)定时线程定时执行 入参为心跳包数据
- 服务 启动一个定时线程-----(每隔5s)----->向Nacos服务发送BeatInfo心跳数据包
- 服务 启动一个监视线程-----()----->用来检测上面的定时线程发送完数据包后,Nacos服务的回应,如果Nacos服务未回应,则认为Nacos服务异常。
3、Nacos收到服务注册信息---->与服务建立心跳检测原理
- Nacos收到服务注册原理:服务调用Nacos的open API进行服务注册,Nacos处理时,实际上时创建了一个concurrentHashMap将服务的信息以Namespace/group/缓存到服务内存中。
- Nacos收到心跳数据原理:Nacos服务init完成后,会定时监听上述 第二步 服务发来的心跳包,如果等待超时后,没有收到数据包,则认为服务异常healthy为false,会更新concurrentHashMap缓存的服务地址列表数据。
- 更新服务的地址列表数据后,会向所有的服务 主动推送Push一个最新的服务地址列表数据
- 基于数据一致性协议,会将最新的 服务地址列表数据同步到Nacos集群的其他节点上
4、服务端之间进行远程调用---->调用Nacos获取远程服务地址列表数据原理
- 服务端获取远程调用服务地址列表数据原理:基于Nacos OpenAPI完成 获取远程服务地址列表数据,进而完成服务之间的远程调用。同时本地会缓存一份地址列表数据(这里说一下,如果使用的是feign那么服务之间的调用协议是Http,如果是Dubbo,那么可以自定义协议,或者Dubbo协议)
5、服务本地会缓存一份服务提供者地址列表数据---->Nacos实现服务提供者地址列表数据 动态感知
- 一旦涉及到缓存,就要涉及缓存数据的一致性。在微服务的调用中,服务调用者会缓存一份 服务提供者的地址列表数据,如果这份缓存数据和 Nacos注册中心的 服务提供者地址列表数据不一致。会造成服务消费者进行远程调用时出错。如果客户端的负载均衡没有做好,会造成严重问题。
- Pull模式:服务消费者 主动拉取,在调用selectInstance时,可以subscribe为true实现订阅,客户端会有 一个HostReactor update的定时线程-----(每隔10s)---->获取一次服务提供者地址列表数据。这里定时为10s,比上面第二步5s上报心跳大,一定程度上保证了服务消费者获取的地址列表数据的准确性
- Push模式:Push模式需要依赖上述的第二步,Nacos会监听服务提供者的心跳数据包,并更新最后一次的心跳时间,如果超时了,那么说明服务提供者异常,会更新地址列表数据。并主动Push给服务消费者。
- 服务消费者收到Push数据原理:服务消费者收到最新的地址列表数据后,会将数据交给上述 Pull模式的 update定时线程来处理。站在服务消费者的角度,相当于服务消费者主动Pull了一次最新数据。这么做的原因是:保持服务消费者 只有一个线程感知接收服务提供者的地址列表数据。避免了Pull和Push如果多个线程处理,因为时间差造成的地址列表数据不一致的情况。
Nacos解决 服务消费者动态感知 服务提供者地址 列表数据原理:(一般有两种方式Push和Pull,Nacos都提供了)
二、Nacos注册中心 原理 架构图

三、nacos配置中心原理:
1:配置的动态刷新客户端如何感知,有两种方式完成客户端主动Pull拉取配置,Nacos Server主动Push配置数据
nacos采取的是Pull模式来完成配置的管理和动态刷新
1: Pull模式: 长轮询机制
nacos采用了长轮询机制实现,客户端发起一个Pull拉取配置请求,nacos server建立一个延时任务队列,每隔29.5s处理一个任务,
处理任务便是花费0.5s检查配置有没有变更。不管有没有变更,都返回配置数据给客户端。
之所以叫长轮询,是因为客户端和nacos建立的连接是一个30s的长连接。
缺点:没有实时性,配置无变化会发起空pull,连接浪费资源。不过这里的缺点在下面的push都解决了。
2: Push模式:
当通过nacos dashboard或者nacos api修改了配置后,nacos检查pull任务队列,可能会在任务中29.5s内的任意时刻,开始处理任务,
和上述流程一致,检查配置变更数据,返回给Pull请求最新配置。所以Push模式实质上还是利用了Pull请求的任务来完成。
PS: 客户端本身会有一个定时线程每隔10ms检查一次本地配置(硬盘中存储)和内存(JVM)配置是否一致。通过上述动态刷新的只是内存中的配置。
四、naocs配置中心流程图

Nacos注册中心和配置中心流程原理的更多相关文章
- 学习一下 SpringCloud (六)-- 注册中心与配置中心 Nacos、网关 Gateway
(1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...
- SpringCloudAlibaba注册中心与配置中心之利器Nacos实战与源码分析(上)
不断踩坑并解决问题是每个程序员进阶到资深的必要经历并以此获得满足感,而不断阅读开源项目源码和总结思想是每个架构师成长最佳途径.本篇拉开SpringCloud Alibaba最新版本实战和原理序幕,以工 ...
- Spring Cloud+nacos+Feign,实现注册中心及配置中心
写在前面 注册中心.配置中心的概念就不在这里解释了.发现服务原来一直用的是Eureka,因为这家伙闭源了,不爽.然后就发现了nacos,阿里巴巴的,好东西,一个搞定注册中心和配置中心.官网:https ...
- spring boot / cloud (十七) 快速搭建注册中心和配置中心
spring boot / cloud (十七) 快速搭建注册中心和配置中心 本文将使用spring cloud的eureka和config server来搭建. 然后搭建的模式,有很多种,本文主要聊 ...
- 🏆【Alibaba中间件技术系列】「Nacos技术专题」配置中心加载原理和配置实时更新原理分析(上)
官方资源 https://nacos.io/zh-cn/docs/quick-start.html Nacos之配置中心 动态配置管理是 Nacos的三大功能之一,通过动态配置服务,可以在所有环境中以 ...
- Dubbo+Nacos做注册中心和配置中心
项目结构 相关代码 EchoService public interface EchoService { String echo(String msg); } DefaultEchoService @ ...
- SpringCloudConfig与SpringCloudEureka 注册中心与配置中心高可用的意义
所有的配置会缓存在本地,远程配置中心DOWN机,不影响本地使用,只是无法重新请求服务端获取配置的更新. 不管是注册中心的高可用,还是配置中心的高可用.本质上都是保证服务能注册上去或者能从配置中心获取配 ...
- 服务注册发现、配置中心集一体的 Spring Cloud Consul
前面讲了 Eureka 和 Spring Cloud Config,今天介绍一个全能选手 「Consul」.它是 HashiCorp 公司推出,用于提供服务发现和服务配置的工具.用 go 语言开发,具 ...
- Spring Cloud入门-Nacos实现注册和配置中心(Hoxton版本)
文章目录 摘要 Nacos简介 使用Nacos作为注册中心 安装并运行Nacos 创建应用注册到Nacos 负载均衡功能 使用Nacos作为配置中心 创建nacos-config-client模块 在 ...
随机推荐
- CVE-2020-2883漏洞复现&&流量分析
CVE-2020-2883漏洞复现&&流量分析 写在前面 网上大佬说CVE-2020-2883是CVE-2020-2555的绕过,下面就复现了抓包看看吧. 一.准备环境 靶机:win7 ...
- 关于 phpstudy环境下在MySQL中执行into outfile无法导入导出文件解决方法
之前在做sqli-labs练习,需要用到into outfile 出现以下问题: 执行SQL语句后在指定的路径下无文件生成. 例如: 执行 select into outfile "C:\\ ...
- 安全工具推荐之Goby篇
Goby(鰕虎鱼) 这个东西出来也很久了,有一年多了吧,个人感觉用起来还不错(当然见仁见智哈,别喷我),今天拿来水一篇 官网有很详细的使用说明,所以本文纯属发表一下感慨,非技术贴 官网在此:https ...
- OSPF的DR与BDR
一.实验拓扑 二.实验编址 三.实验步骤: 1.设置路由器的端口IP等信息 2.搭建ospf网络 重启(退出系统模式):reset ospf process 查看: 查看完整的邻居信息: 可以看到DR ...
- EasyExcel导入导出
maven依赖 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency> & ...
- 对象池在 .NET (Core)中的应用[1]: 编程体验
借助于有效的自动化垃圾回收机制,.NET让开发人员不在关心对象的生命周期,但实际上很多性能问题都来源于GC.并不说.NET的GC有什么问题,而是对象生命周期的跟踪和管理本身是需要成本的,不论交给应用还 ...
- asp.net mvc 传值
视图的查找 asp.net MVC 不需要用using 释放资源
- Redis5.0 配置文件中文参考
Redis 5.0 配置文件#是否在后台执行,yes:后台运行:no:不是后台运行daemonize yes#是否开启保护模式,默认开启.要是配置里没有指定bind和密码.开启该参数后,redis只会 ...
- SpringBoot使用@Scheduled创建定时任务
定时任务一般会存在中大型企业级项目中,为了减少服务器.数据库的压力往往会采用时间段性的去完成某些业务逻辑.比较常见的就是金融服务系统推送回调,一般支付系统订单在没有收到成功的回调返回内容时会持续性的回 ...
- WPF---数据绑定之ItemsControl(三)
一.Combox绑定 场景:定义多个Person,Person有Name和Age属性,将多个Person与Combox进行绑定,Combox中只显示Name信息,点击任意一个item,在左侧显示该条目 ...