Nacos 的整体架构遵循经典的 Client-Server 架构,并在此基础上构建了高度可扩展、高可用的分布式系统。 它主要由两个核心部分组成: Nacos Server 和 Nacos Client。
一、 Nacos 整体架构概览
可以用以下简化图示来概括 Nacos 的架构:
+---------------------+ +---------------------+
| Nacos Client | <----> | Nacos Server |
+---------------------+ +---------------------+
| - SDK (Java, etc.) | | - Config Service |
| - Embedded in App | | - Naming Service |
| - Config Listener | | - Distro Protocol |
| - Service Registry | | - Persistent Storage|
| - Load Balancing | | - Console UI |
+---------------------+ +---------------------+
Client Side Server Side
+---------------------+
| External Database | (Optional, e.g., MySQL for Cluster)
+---------------------+
二、 Client-Server 架构在 Nacos 中的体现
Nacos 架构的核心就是 Client-Server 模式,这种模式将系统划分为两个主要角色:
-
Nacos Server (服务端):
- 角色: 作为 中心化的服务提供者 和 数据存储中心。 它负责存储和管理配置信息、服务注册信息等关键数据。
- 职责:
- 配置管理 (Config Management): 存储、发布、推送配置,提供配置的增删改查、版本管理、灰度发布等功能。
Config Service
模块 负责实现。 - 服务注册与发现 (Service Discovery): 接收服务实例注册,维护服务实例列表,提供服务发现接口。
Naming Service
模块 负责实现。 - 数据持久化 (Persistence): 将配置数据和服务注册信息持久化存储,保证数据可靠性。
Persistent Storage
(默认 Derby, 生产环境推荐 MySQL) 模块 负责实现。 - 集群管理与数据一致性 (Cluster & Consistency): 在集群模式下,保证集群节点之间数据的一致性,提供高可用性。
Distro Protocol
(Raft) 模块 负责实现。 - 控制台 (Console UI): 提供 Web 控制台界面,方便用户管理配置、服务、集群等。
Console UI
模块 负责实现。 - 接收客户端请求: 监听客户端的配置获取、配置监听、服务注册、服务发现等请求。
- 推送配置变更: 主动将配置变更信息推送给监听该配置的客户端。
- 配置管理 (Config Management): 存储、发布、推送配置,提供配置的增删改查、版本管理、灰度发布等功能。
-
Nacos Client (客户端):
- 角色: 作为 服务消费者 和 配置信息获取者。 通常以 SDK 的形式嵌入到应用程序中。
- 职责:
- 配置获取 (Config Fetching): 从 Nacos Server 获取应用程序所需的配置信息。
- 配置监听 (Config Listening): 监听配置变更事件,当配置发生变化时,客户端能够及时收到通知并更新本地配置。
- 服务注册 (Service Registration): 将自身服务实例信息注册到 Nacos Server,以便其他服务能够发现和调用。
- 服务发现 (Service Discovery): 从 Nacos Server 查询所需服务的实例列表,并进行负载均衡选择。
- 负载均衡 (Load Balancing): 在客户端实现负载均衡策略,选择合适的服务实例进行调用。
- 健康检查 (Health Check - 客户端侧): 客户端可以进行本地健康检查,并向 Nacos Server 汇报实例健康状态。
- SDK (Software Development Kit): Nacos 提供多种语言的 SDK (例如 Java, Go, Python 等),方便应用程序集成 Nacos 功能。
三、 Client-Server 交互流程
Nacos Client 和 Server 之间的交互主要通过以下几种方式体现 Client-Server 架构:
-
客户端发起请求 (Client Request):
- 配置获取请求 (Get Config): 客户端应用程序启动时,或者需要动态获取配置时,会向 Nacos Server 发送 HTTP GET 请求,请求获取指定的配置信息 (dataId, group, tag)。
- 配置监听请求 (Listen Config): 客户端应用程序为了实时感知配置变更,会向 Nacos Server 建立长连接 (Long Polling 或 gRPC Stream),注册配置监听器,并发送监听请求。
- 服务注册请求 (Register Instance): 服务提供者应用启动时,会将自身服务实例信息 (IP, 端口, 元数据等) 通过 HTTP POST 或 gRPC 请求注册到 Nacos Server。
- 服务注销请求 (Deregister Instance): 服务提供者应用下线时,会向 Nacos Server 发送 HTTP DELETE 或 gRPC 请求注销服务实例。
- 服务心跳上报 (Instance Heartbeat): 服务提供者应用会定期向 Nacos Server 发送心跳请求,汇报实例的健康状态。
- 服务发现请求 (Get Instances): 服务消费者应用需要调用其他服务时,会向 Nacos Server 发送 HTTP GET 或 gRPC 请求,查询目标服务的可用实例列表。
-
服务端处理请求 (Server Processing):
- 接收和解析请求: Nacos Server 的
Config Service
和Naming Service
模块负责接收和解析客户端发送的各种请求。 - 数据查询和处理: 服务端模块会根据请求类型,查询持久化存储 (数据库或内存缓存) 中的配置数据或服务实例信息,并进行相应的处理,例如:
- 配置获取: 从存储中检索配置数据,并返回给客户端。
- 配置监听: 维护配置监听器列表,当配置变更时,推送变更通知给监听器。
- 服务注册: 将服务实例信息存储到注册中心,并更新服务实例列表。
- 服务发现: 从注册中心检索服务实例列表,并返回给客户端。
- 数据持久化: 服务端模块会将配置数据和服务注册信息持久化存储到数据库中。
- 集群数据同步: 在集群模式下,服务端模块还需要负责集群节点之间的数据同步,保证数据一致性。
- 接收和解析请求: Nacos Server 的
-
服务端返回响应 (Server Response):
- 配置响应 (Config Response): 服务端会将请求的配置内容 (例如文本、JSON、YAML) 通过 HTTP 响应返回给客户端。
- 服务实例列表响应 (Instance List Response): 服务端会将服务实例列表 (包含 IP, 端口, 元数据等信息) 通过 HTTP 响应返回给客户端。
- 状态响应 (Status Response): 对于注册、注销、心跳等请求,服务端会返回状态码和响应信息,表示操作是否成功。
- 推送通知 (Push Notification): 当配置发生变更时,服务端会主动向已注册监听器的客户端推送配置变更通知 (通过长连接或 gRPC Stream)。
四、 Client-Server 架构的优势在 Nacos 中体现
- 职责分离 (Separation of Concerns): Client 和 Server 角色职责明确,Server 专注于数据管理和服务提供,Client 专注于服务消费和配置获取,降低了系统复杂性,提高了可维护性。
- 集中管理 (Centralized Management): Nacos Server 作为中心化的管理节点,集中管理配置信息和服务注册信息,方便统一管理和运维。
- 可扩展性 (Scalability): Nacos Server 可以通过集群部署来提高可用性和扩展性,Client 可以水平扩展,适应不同的应用规模。
- 灵活性 (Flexibility): Client-Server 架构允许 Client 和 Server 独立演化和升级,提供了更大的灵活性。
- 易于集成 (Easy Integration): Nacos Client 以 SDK 的形式提供,易于集成到各种应用程序中。
总结
Nacos 的整体架构是典型的 Client-Server 架构。 Nacos Server 作为中心化的服务提供者和数据存储中心,负责配置管理、服务注册与发现等核心功能。 Nacos Client 以 SDK 的形式嵌入到应用程序中,负责从 Server 获取配置、监听配置变更、注册服务、发现服务等。 Client 和 Server 之间通过 HTTP 或 gRPC 等协议进行通信,实现配置数据和服务信息的交互。 这种 Client-Server 架构使得 Nacos 结构清晰、职责明确、易于扩展和维护,是构建分布式配置管理和服务发现系统的有效架构模式。