Nacos 原理

这篇具有很好参考价值的文章主要介绍了Nacos 原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Nacos 原理

一、Nacos的整体架构

Nacos的整体架构还是比较清晰的,我们可以从下面这个官方提供的架构图进行简单分析。

Nacos 原理

二、Nacos 原理

之前讲过注册中和配置中心的核心原理,信息的同步主要的几种方式:

  • push (服务端主动push)
  • pull (客户端的轮询), 超时时间比较短
  • long pull (超时时间比较长)

2.1、配置中心原理

nacos 配置中心就是采用:客户端 long pull 的方式Nacos 原理

  • Nacos 客户端会循环请求服务端变更的数据,并且超时时间设置为30s,当配置发生变化时,请求的响应会立即返回,否则会一直等到 29.5s+ 之后再返回响应
  • 客户端的请求到达服务端后,服务端将该请求加入到一个叫 allSubs 的队列中,等待配置发生变更时 DataChangeTask主动去触发,并将变更后的数据写入响应对象。
  • 与此同时服务端也将该请求封装成一个调度任务去执行,等待调度的期间就是等DataChangeTask 主动触发的,如果延迟时间到了 DataChangeTask 还未触发的话,则调度任务开始执行数据变更的检查,然后将检查的结果写入响应对象(基于文件的MD5)

2.2、注册中心原理

nacos注册中心采用了 :pull (客户端的轮询)和push (服务端主动push)
Nacos 原理

  • 客户端启动时会将当前服务的信息包含ip、端口号、服务名、集群名等信息封装为一个Instance对象,然后创建一个定时任务,每隔一段时间向Nacos服务器发送PUT请求并携带相关信息。
  • nacos服务器端在接收到心跳请求后,会去检查当前服务列表中有没有该实例,如果没有的话将当前服务实例重新注册,注册完成后立即开启一个异步任务,更新客户端实例的最后心跳时间,如果当前实例是非健康状态则将其改为健康状态。
  • 心跳定时任务创建完成后,通过POST请求将当前服务实例信息注册进nacos服务器。
  • nacos服务器端在接收到注册实例请求后,会将请求携带的数据封装为一个Instance对象,然后为这个服务实例创建一个服务Service,一个Service下可能有多个服务实例,服务在Nacos保存到一个ConcurrentHashMap中Map(namespace,Map(group::serviceName, Service));
  • nacos将实例添加到对应服务列表中会根据AP和CP不同的模式,采用不同协议。
    • CP模式就是基于Raft协议(通过leader节点将实例数据更新到内存和磁盘文件中,并且通过CountDownLatch实现了一个简单的raft写入数据的逻辑,必须集群半数以上节点写入成功才会给客户端返回成功)
    • AP模式基于Distro协议(向任务阻塞队列添加一个本地服务实例改变任务,去更新本地服务列表,然后在遍历集群中所有节点,分别创建数据同步任务放进阻塞队列异步进行集群数据同步,不保证集群节点数据同步完成即可返回)
    • nacos在将服务实例更新到服务注册表中时,为了防止并发读写冲突,采用的是写时复制的思想,将原注册表数据拷贝一份,添加完成之后再替换回真正的注册表。
  • nacos在更新完成之后,通过发布服务变化事件,将服务变动通知给客户端,采用的是UDP通信,客户端接收到UDP消息后会返回一个ACK信号,如果一定时间内服务端没有收到ACK信号,还会尝试重发,当超出重发时间后就不在重发。
  • 客户端通过定时任务定时从服务端拉取服务数据保存在本地缓存。

服务端在发生心跳检测、服务列表变更或者健康状态改变时会触发推送事件,在推送事件中会基于UDP通信将服务列表推送到客户端,虽然通过UDP通信不能保证消息的可靠抵达,但是由于Nacos客户端会开启定时任务,每隔一段时间更新客户端缓存的服务列表,通过定时轮询更新服务列表做兜底,所以不用担心数据不会更新的情况,这样既保证了实时性,又保证了数据更新的可靠性。

2.3、心跳机制

服务的健康检查分为两种模式:

  • 客户端上报模式:客户端通过心跳上报的方式告知nacos 注册中心健康状态(默认心跳间隔5s,nacos将超过超过15s未收到心跳的实例设置为不健康,超过30s将实例删除)
  • 服务端主动检测:nacos主动检查客户端的健康状态(默认时间间隔20s,健康检查失败后会设置为不健康,不会立即删除)

nacos 目前的instance有一个ephemeral字段属性,该字段表示实例是否是临时实例还是持久化实例。如果是临时实例则不会在nacos中持久化,需要通过心跳上报,如果一段时间没有上报心跳,则会被nacos服务端删除。删除后如果又重新开始上报,则会重新实例注册。而持久化实例会被nacos服务端持久化,此时即使注册实例的进程不存在,这个实例也不会删除,只会将健康状态设置成不健康。

这里就涉及到了nacos的AP和CP模式 ,默认是AP,即nacos的client的节点注册时ephemeral=true,那么nacos集群中这个client节点就是AP,采用的是distro 协议,而ephemeral=false时就是CP采用的是raft协议实现。所以nacos可以很好的解决了业务常见的不同需求。

#false为永久实例,true表⽰临时实例开启,注册为临时实例,默认是true
 spring.cloud.nacos.discovery.ephemeral=true

为什么nacos有两种心跳机制?

对于临时实例,健康检查失败,则直接删除。这种特性适合于需要应对流量突增的场景,服务可以弹性扩容,当流量过去后,服务停掉即可自动注销。
对于持久化实例,健康检查失败,会设置为不健康状态。它的优点就是可以实时的监控到实例的健康状态,便于后续的告警和扩容等一系列处理。

2.4、自我保护

nacos也有自我保护机制(当前健康实例数/当前服务总实例数),值为0-1之间的浮点类型。正常情况下nacos 只会健康的实例。单在高并发场景,如果只返回健康实例的话,流量洪峰到来可能直接打垮剩下的健康实例,产生雪崩效应。

保护阈值存在的意义在于当服务A健康实例数/总实例数 < 保护阈值时,Nacos会把该服务所有的实例信息(健康的+不健康的)全部提供给消费者,消费者可能访问到不健康的实例,请求失败,但这样远比造成雪崩要好。牺牲了请求,保证了整个系统的可用。

简单来说不健康实例的另外一个作用:防止雪崩

如果所有的实例都是临时实例,当雪崩出现时,Nacos的阈值保护机制是不是就没有足够的(包含不健康实例)实例返回了,其实如果有部分实例是持久化实例,即便它们已经挂掉,状态为不健康,但当触发自我保护时,还是可以起到分流的作用。文章来源地址https://www.toymoban.com/news/detail-400428.html

到了这里,关于Nacos 原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker 的整体架构及各模块组件 《深入docker底层原理》

    Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,模块各司其职。 1、用户是使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者。 2、Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。 3、Docker Engine 执行 Docke

    2024年02月12日
    浏览(32)
  • 【大数据入门核心技术-ElasticSearch】(二)ElasticSearch整体架构和重要工作原理

    目录 一、整体架构图 二、重要工作原理 1、文档写入原理 2、文档检索原理

    2024年02月05日
    浏览(32)
  • Nacos架构与原理 - Nacos-Sync

    NacosSync 是⼀个支持多种注册中心的同步组件,基于 Spring boot 开发框架,数据层采用Spring Data JPA ,遵循了标准的 JPA 访问规范,支持多种数据源存储,默认使用Hibernate实现,更加方便的支持表的自动创建更新。 使用了高效的事件异步驱动模型, 支持多种自定义事件,使得同步任务处理

    2024年02月12日
    浏览(28)
  • Nacos架构与原理 - 通信通道

    Nacos 1.x 版本 Config/Naming 模块各自的推送通道都是按照自己的设计模型来实现的。 配置和服务器模块的数据推送通道不统⼀ ,http 短连接性能压力巨大,未来Nacos 需要构建能够同时支持配置以及服务的长链接通道, 以标准的通信模型重构推送通道 。 1. 配置 配置对连接的场景

    2024年02月08日
    浏览(26)
  • Nacos架构与原理 - 寻址机制

    Nacos 支持单机部署以及集群部署 针对单机模式,Nacos 只是自己和自己通信; 对于集群模式,则集群内的每个 Nacos 成员都需要相互通信。 因此这就带来⼀个问题,该以何种方式去管理集群内的 Nacos 成员节点信息,而这,就是 Nacos 内部的寻址机制。 无论是单机模式,还是集群

    2024年02月08日
    浏览(39)
  • Nacos架构与原理 - 健康检查机制

    想象发生地质灾害,被掩埋在废墟下,搜救队需定位才能施救。两种方法: 大喊求救,告知位置与健康状况,让搜救队知晓 搜救队使用专业设备探测到被埋者位置 这两种方法可类比为服务探测方式: 客户端主动上报,告知服务端自己健康状态。若一段时间无上报,判定服务不健康。

    2024年02月08日
    浏览(43)
  • Nacos架构与原理 - 自研 Distro 协议 (AP分布式协议)

    Distro 协议是 Nacos 社区自研的⼀种 AP 分布式协议 ,是面向临时实例设计的⼀种分布式协议,其保证了在某些 Nacos 节点宕机后,整个临时实例处理系统依旧可以正常工作。 作为⼀种有状态的中间件应用的内嵌协议,Distro 保证了各个 Nacos 节点对于海量注册请求的统⼀协调和存

    2024年02月08日
    浏览(38)
  • Integer比较时用==还是equals

    目录 一、== 二、修改integer的缓存范围 三、使用equals         一般情况在代码代码中比较interger的值时用==是没有问题的,但是也存在一定的范围。          可以看到,当Integer表示的值在[-128 ~ 127]之间,使用==时能达到我们的预期的。           可是一旦超过这个范围,

    2024年02月14日
    浏览(24)
  • zookeeper和nacos区别是什么,注册中心用zookeeper还是nacos

    注册中心对比和选型:Zookeeper、Eureka、Nacos、Consul和ETCD zookeeper和nacos区别是什么 Nacos集群raft选举算法原理 Zookeeper和Nacos是两个不同的分布式系统协调组件,它们在设计目标、功能特性和使用方式等方面存在一些区别。以下是它们的主要区别: 设计目标和适用场景: Zookeeper最

    2024年02月03日
    浏览(26)
  • Kubernetes 整体架构介绍

    Kubernetes 主要由以下几个核心组件组成: etcd 保存了整个集群的状态; kube-apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制; kube-controller-manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等; kube-scheduler 负责资源的调

    2024年02月14日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包