Nacos 配置信息的发布流程是怎样的?服务端是如何校验和处理这些信息的?
Nacos 配置发布的流程,以及服务端如何校验和处理这些请求,可以分为以下几个步骤:
1. 客户端发起配置发布请求:
- 客户端(例如,使用
NacosConfigClient
的 Spring Boot 应用)构建一个配置发布请求。 - 请求中包含以下关键信息:
dataId
: 配置 ID。groupId
: 配置分组。tenant
: 租户 ID(命名空间)。content
: 配置内容。type
: 配置类型(可选,例如 properties, yaml, json)。srcUser
: 操作用户(可选)。srcIp
: 操作 IP(可选)。appName
: 应用名(可选)
- 客户端通过 HTTP POST 请求将配置发布请求发送到 Nacos Server。 请求的 URL 通常是
/nacos/v1/cs/configs
。
2. 服务端接收请求 (ConfigController):
- Nacos Server 的
ConfigController
接收到配置发布请求。 ConfigController
会根据请求的 URL 和 HTTP 方法,调用相应的处理方法(例如publishConfig
)。
3. 服务端初步校验:
-
权限校验:
- 如果启用了 Nacos 的权限控制,会检查当前用户是否有权限发布配置。
- 权限校验基于 Nacos 的用户、角色和权限体系。
-
参数校验:
- 检查请求参数是否完整、合法,例如:
dataId
、groupId
、content
是否为空。dataId
、groupId
、tenant
的长度是否超过限制。type
是否为支持的类型。
- 检查请求参数是否完整、合法,例如:
-
限流:
-
根据配置的限流规则,对请求进行限流处理,防止恶意请求或突发流量压垮服务器
4. 服务端核心处理逻辑 (ConfigService):
-
ConfigController
会调用ConfigService
的相应方法(例如publishConfig
)来处理配置发布请求。 -
数据转换:
- 将请求参数转换为内部的数据模型。
-
查询旧配置 (可选):
- 根据
dataId
、groupId
、tenant
查询数据库(例如config_info
表),获取旧的配置信息(如果存在)。 - 获取旧配置的 MD5 值,用于后续比较。
- 根据
-
MD5 计算:
- 计算新配置内容的 MD5 值。
-
配置内容比较 (可选):
- 如果存在旧配置,将新配置的 MD5 值与旧配置的 MD5 值进行比较。
- 如果 MD5 值相同,说明配置内容没有变化,可以选择不更新数据库(根据配置决定)。
-
数据持久化:
- 如果配置内容发生变化(或强制更新),将新的配置信息保存到数据库(
config_info
表)。 - 如果启用了历史版本功能, 会将旧版本的配置信息保存到
his_config_info
表, 并记录操作类型为U
(更新) 或I
(插入)。
- 如果配置内容发生变化(或强制更新),将新的配置信息保存到数据库(
5. 配置变更通知 (异步):
- 本地事件: 配置发布成功后,
ConfigService
会发布一个本地事件(ConfigDataChangeEvent
)。 - 异步任务: Nacos 的事件监听器会监听到
ConfigDataChangeEvent
事件, 并将通知任务添加到异步任务队列。 - 长轮询/推送: Nacos Server 通过长轮询机制 或 gRPC 推送,将配置变更通知发送给所有订阅了该配置的客户端。
- 通知中包含
dataId
、groupId
、tenant
和新的 MD5 值。
- 通知中包含
- 客户端更新: 客户端收到配置变更通知后,会重新拉取配置,并更新本地缓存。
6. 返回响应:
- Nacos Server 向客户端返回配置发布的响应结果。
- 响应中包含操作是否成功的信息。
总结 (服务端校验和处理):
- 接收请求:
ConfigController
接收配置发布请求。 - 初步校验: 进行权限校验、参数校验、限流。
- 核心处理:
ConfigService
处理配置发布逻辑:- 数据转换。
- 查询旧配置(可选)。
- 计算 MD5。
- 配置内容比较(可选)。
- 数据持久化(更新
config_info
表,可能插入his_config_info
表)。
- 变更通知: 通过本地事件和异步任务,触发配置变更通知。
- 长轮询/推送: Nacos Server 通过长轮询 或 gRPC 将变更通知推送到客户端。
- 返回响应: 向客户端返回操作结果。