Nacos服务注册发现原理
Nacos底层原理一次给你讲个够-CSDN博客
[源码阅读] Nacos服务注册发现原理解析_nacos 服务发现原理-CSDN博客
Nacos 作为动态服务发现和配置管理平台,其核心功能原理如下:
1. 服务注册(Service Registration)
- 基本原理:
微服务启动时,向 Nacos Server 发送注册请求(HTTP/OpenAPI 或 SDK),包含服务名、IP、端口、元数据等信息。- 存储机制:Nacos 将服务实例信息存储在内存(
ConcurrentHashMap)中,同时支持持久化到数据库(如 MySQL)。 - 健康状态:注册时标记实例为临时(默认)或持久化模式,临时实例通过心跳维持活性,持久化实例由服务端主动探测。
- 存储机制:Nacos 将服务实例信息存储在内存(
2. 服务发现(Service Discovery)
- 基本原理:
客户端通过服务名向 Nacos Server 查询可用实例列表(支持基于权重的负载均衡策略)。- 数据一致性:
- AP 模式(默认):采用
Distro 协议(自研的最终一致性协议),优先保证可用性,适用于高并发场景。 - CP 模式:采用
Raft 协议,保证强一致性,适用于配置管理等强一致性需求场景。
- AP 模式(默认):采用
- 本地缓存:客户端缓存服务列表,减少对服务端的频繁查询。
- 数据一致性:
3. 服务订阅(Service Subscription)
- 基本原理:
客户端订阅某服务后,Nacos 通过 长轮询(Long Polling) 或 UDP 推送 实时通知实例变更。- 长轮询机制:
客户端发起请求后,服务端若没有变更,会挂起请求(默认 30s),期间若有变更立即返回;超时后客户端重新发起请求。 - 推送防抖:服务端合并短时间内的多次变更,避免频繁推送。
- 长轮询机制:
4. 心跳检测(Health Check)
- 基本原理:
客户端定期(默认 5s)向 Nacos Server 发送心跳包(HTTPbeat请求),服务端更新实例的lastBeatTime。- 健康检查机制:
- 临时实例:若 15s 内无心跳,标记为不健康;30s 未恢复则删除实例。
- 持久化实例:服务端主动探测(如 TCP/HTTP 健康检查),不依赖客户端心跳。
- 自我保护机制:当服务端与集群失联时,保留本地实例信息,避免大规模下线。
- 健康检查机制:
核心优势总结
| 功能 | 特点 |
|---|---|
| 高可用 | 支持集群部署,AP/CP 模式灵活切换,适应不同场景。 |
| 实时性 | 长轮询 + UDP 推送,实现秒级服务变更感知。 |
| 轻量级 | 基于 HTTP 协议,集成简单,对业务侵入性低。 |
| 扩展性 | 支持自定义健康检查策略、负载均衡规则及插件扩展。 |
典型应用场景
- 服务注册与发现:微服务实例动态上下线,客户端自动感知。
- 配置中心:结合配置管理功能,实现配置动态推送。
- 流量治理:基于权重调整实例流量,支持金丝雀发布。
如需更深入细节(如 Distro/Raft 协议实现),可进一步探讨!
总结
- Nacos 客户端SDK在服务发现时,如果打开了 failover-mode ,则优先从本地的 failover 目录中获取服务列表,这个特性可以用来做故障转移也可以用本地的配置来覆盖 Nacos 集群中的配置;
- Naocs 客户端SDK在服务发现时,如果需要监听服务的变化,Nacos 使用客户端 pull & 服务端 push 2种方式来获取最新的数据;
- Nacos 客户端SDK主动上报心跳,当心跳时间超过15秒,设置服务实例为不健康状态,心跳时间超过30秒,将服务实例摘除;
- Nacos 同时支持 AP 和 CP ,如果实例的 ephemeral 为 true,则表示实例为临时实例,集群间的数据复制使用基于 Distro 的 AP 协议,否则使用基于 Raft 的 CP 协议;
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果