目录
官网地址:https://nacos.io/
总览
一、Nacos基本应用
Nacos提供了统一配置管理、服务发现与注册。
1.Nacos安装
1.1从 Github 上下载源码方式
|
1.2下载编译后压缩包方式
地址:Releases · alibaba/nacos · GitHub
启动服务(Linux/Unix/Mac)
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
数据存储
1.使用嵌入式Derby数据库进行数据存储
2.外部数据库(目前仅支持MySQL)
集群模式:
Nacos支持三种部署模式
2.Nacos基本使用
注册中心
配置中心:
多配置情况
|
配置优先级
Spring Cloud Alibaba Nacos Config
目前提供了三种配置能力从Nacos 拉取相关的配置。
A: 通过spring.cloud.nacos.config.shared-configs[0].dataid的方式支持多个共享Data Id 的配置
B: 通过spring.cloud.nacos.config.ext-config[0].data-id的方式支持多个扩展Data Id 的配置
C: 通过内部相关规则${prefix}-${spring.profiles.active}.${file-extension}自动生成相关的Data Id配置
当三种方式共同使用时,他们的一个优先级关系是:A < B < C,先读取C,再读取B,最后读取A,后加载的文件会覆盖先加载的文件
3.Nacos中核心概念
Nacos 概念
二、Nacos注册中心原理分析
服务注册中心需要具备的能力
1.服务提供者把自己的协议地址注册到Nacos server
2.服务消费者需要从Nacos Server上去查询服务提供者的地址(根据服务名称)
3.Nacos Server需要感知到服务提供者的上下线的变化
4.服务消费者需要动态感知到Nacos Server端服务地址的变化
1.服务注册原理
2.实例类型
临时节点(默认)→ AP模型→ Distro协议 → 健康检查模式:客户端心跳上报Nacos实例健康状态,默认间隔5秒,Nacos在15秒内未收到该实例的心跳,则会设置为不健康状态,超过30秒则将实例删除。
持久化节点→ CP模型 → Raft选举:Raft → 健康检查方式:服务端检测,Nacos只会将其健康状态设置为不健康,但并不会对将其从服务端删除。
CAP模型
CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
可用性(A):保证每个请求不管成功或者失败都有响应。
分区容忍性(P):系统中任意信息的丢失或失败不会影响系统的继续运作。
BASE理论
BASE理论是对CAP理论的延伸,思想是即使无法做到强一致性(CAP的一致性就是强一致性),但可以采用适当的采取弱一致性,即最终一致性。
BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。
深入了解参考:CAP和BASE理论-阿里云开发者社区
三、Nacos配置中心原理分析
Nacos采用的是Pull模式,并且采用了一种长轮询机制。客户端采用长轮询的方式定时的发起Pull请求,去检查服务端配置信息是否发生了变更,如果发生了变更,那么客户端会根据变更的数据获得最新的配置。
长轮询:客户端发起轮询请求后,服务端如果有配置发生变更,就直接返回。
- 如果客户端发起Pull请求后,发现服务端的配置和客户端的配置是保持一致的,那么服务端会“Hold”住这个请求。(服务端拿到这个连接后在指定的时间段内不会返回结果,直到这段时间内的配置发生变化)
- 一旦配置发生了变化,服务端会把原来“Hold”住的请求进行返回。
Nacos服务端收到请求后,会检查配置是否发生了变更,如果没有,那么设置一个定时任务,延期29.5秒执行。同时并且把当前的客户端长轮询连接加入到allSubs队列。 这时候有两种方式触发该连接结果的返回:
第一种:等待29.5秒(长连接保持的时间)后触发自动检查机制,这时候不管配置有无发生变化,都会把结果返回给客户端。
第二种:在29.5秒内的任意一个时刻,通过Nacos控制台或者API的方式对配置进行了修改,那么触发一个事件机制,监听到该事件的任务会遍历allSubs队列,找到发生变更的配置项对应的ClientLongPolling任务,将变更的数据通过该任务中的连接进行返回,即完成了一次推送操作。
声明:文章部分图片为引用,如有侵权,请联系作者及时删除