Nacos 插件规范全景:扩展点分类、SPI 层次、加载生命周期与统一配置管理实战指南
【免费下载链接】nacosan easy-to-use dynamic service discovery, configuration and service management platform for building AI cloud native applications.项目地址: https://gitcode.com/GitHub_Trending/na/nacos
Nacos 通过一套统一的插件机制与 SPI 扩展,将鉴权、资源可见性、数据源方言、加解密、链路追踪、流量控制、环境适配乃至 AI pipeline、AI 存储、AI 资源导入等横切与可替换能力从固定核心中拆出,让不同部署环境可以按自身身份系统、数据库、观测体系或扩展场景选择实现。本文以 specs/zh-cn/plugin/README.md 定义的插件规范框架为主线,结合核心规范 specs/zh-cn/plugin/plugin-spec.md 与仓库源码,系统讲解插件身份模型、类型注册表、执行形态、SPI 层次、加载生命周期、统一状态与配置模型以及管理 API,读完即可理解如何判断一个扩展点属于哪类插件、如何加载、如何配置、如何被管理。
插件规范的定位与总体框架
插件规范定义 Nacos 扩展点如何加载、选择、执行、配置,以及如何通过统一插件管理模型对外暴露。它扩展 Nacos 设计规范,必须保持 资源模型 语义稳定,并在暴露 HTTP 端点时遵守 HTTP API 规则。插件机制是扩展边界,不是绕过 Nacos 资源、API 或安全规则的通道。
整个插件规范树按功能域划分为五大类,这也是插件扩展点全景图:
- 通用模型:Nacos 插件化规范(所有插件共享的运行时契约)、寻址扩展规范。
- 数据与配置:数据源方言插件规范、默认数据源方言插件实现规范、配置变更插件规范、配置加密插件规范。
- 运行时扩展:环境插件规范、Trace 插件规范、Control 插件规范、默认 Control 插件实现规范。
- AI 扩展:AI 发布 Pipeline 插件规范、AI 存储插件规范、AI Vector 插件规范、AI 资源导入插件规范。
- 安全扩展:鉴权插件规范、RAM 鉴权插件规范、OIDC 鉴权插件规范、可见性插件规范。
其中 寻址扩展规范 是为了和公开插件文档保持连续性而放在插件规范树中记录;当前服务端代码通过MemberLookup处理寻址,并未将其注册到PluginType注册表,它属于"扩展相邻机制"而非当前统一插件类型。
插件身份:pluginType / pluginName / pluginId
每个插件由以下三个字段唯一标识:
pluginType:扩展类别,例如auth或visibility;pluginName:该类别下的实现名称,例如nacos;pluginId:运行时标识,格式为{pluginType}:{pluginName}。
pluginId用于管理 API、集群状态同步、插件状态持久化和面向用户的诊断信息。测试用例 PluginAdminApiOpenApiITCase.java 中直接断言了pluginId包含:分隔符、pluginType与pluginName非空,印证了该身份模型在 Admin API 响应中的实际结构。
插件类型注册表:PluginType 枚举
当前插件类型注册表由PluginType定义,位于 api/src/main/java/com/alibaba/nacos/api/plugin/PluginType.java。除ai-vector外,规范表格中的类型均可直接在枚举中找到一一对应:
| 类型 | 目的 | 契约 |
|---|---|---|
auth | 认证与授权实现。 | 鉴权插件规范 |
visibility | 资源可见性与查询可见性建议。 | 可见性插件规范 |
datasource-dialect | 数据库方言与持久化适配。 | 数据源方言插件规范 |
config-change | 配置变更扩展。 | 配置变更插件规范 |
encryption | 加解密扩展。 | 配置加密插件规范 |
trace | 链路追踪与观测扩展。 | Trace 插件规范 |
environment | 环境适配扩展。 | 环境插件规范 |
control | 流量与控制扩展。 | Control 插件规范 |
ai-pipeline | AI 注册中心 pipeline 扩展。 | AI 发布 Pipeline 插件规范 |
ai-storage | AI 注册中心存储扩展。 | AI 存储插件规范 |
ai-resource-import | AI 注册中心外部资源导入扩展。 | AI 资源导入插件规范 |
各插件类别的领域契约由对应规范定义;Nacos 插件化规范 定义所有插件类别共享的运行时契约。
关键点在于:执行形态和关键能力属于插件类型,而不是某个内置实现。从源码看,每个枚举常量在构造时就绑定了executionMode、critical和initializationPhase三个元数据,例如AUTH("auth", ..., PluginExecutionMode.EXCLUSIVE, true)、AI_STORAGE("ai-storage", ..., PluginExecutionMode.ROUTED, true)、ENVIRONMENT("environment", ..., PluginExecutionMode.CHAIN, false, PluginInitializationPhase.PRE_CONTEXT)。枚举提供的isExclusive()由executionMode == EXCLUSIVE推导,以保持 API 兼容——这正对应规范中"已有exclusive信息继续由executionMode == EXCLUSIVE推导"的描述。
运行位置:服务端插件与 Java 客户端扩展
Nacos 有两类插件式扩展面:
| 运行位置 | 加载模型 | 状态归属 | 示例 |
|---|---|---|---|
| 服务端插件 | 领域 SPI 加PluginProvider,在支持时可由服务端插件 API 列出和管理。 | Nacos 服务端进程;对可管理插件,还包括服务端插件状态。 | auth、visibility、datasource-dialect、control、trace。 |
| Java 客户端扩展 | 在客户端进程内通过 Java SPI 或 SDK API 加载。 | 客户端 classpath、客户端配置和 SDK 实例生命周期。 | ServerListProvider、ClientAuthService、IConfigFilter、客户端侧配置加密。 |
客户端扩展不由/v3/admin/core/plugin/*管理,也不具备服务端PluginStateCheckerHolder决策,除非对应服务端插件同时参与请求处理。但它们仍必须遵守 Nacos 资源身份、鉴权和 payload 语义,因为它们会影响 SDK 发出的请求。
以客户端寻址为例(详见 寻址扩展规范):Java Client SDK 在AbstractServerListManager中通过 SPI 加载ServerListProvider实现,Config 和 Naming 客户端分别通过ConfigServerListManager与NamingServerListManager使用选中的 provider,gRPC client 再通过ServerListFactory消费同一份 server list;被选中的 provider 是满足match(...)且getOrder()最高的实现。内置 provider 包括配置了serverAddr时使用的PropertiesListProvider(固定地址列表),以及配置了endpoint时使用的EndpointServerListProvider(从 address endpoint 拉取地址、周期刷新并在列表变化时发布ServerListChangeEvent)。客户端寻址扩展属于 Java Client SDK 扩展,不是服务端插件管理器条目,不由服务端 Admin 插件 API 列出或启停。
执行形态:EXCLUSIVE / ROUTED / CHAIN / BROADCAST
插件类别并不都以同一种形态执行,每个插件类型都必须明确自身执行形态。四种形态由枚举PluginExecutionMode定义(api/src/main/java/com/alibaba/nacos/api/plugin/PluginExecutionMode.java):
| 形态 | 含义 | 示例 |
|---|---|---|
EXCLUSIVE | 在进程或请求范围内选择一个实现,其他已加载实现不参与该次判断。 | auth、datasource-dialect、control |
ROUTED | 可以加载多个实现,但领域根据配置、资源元数据或请求上下文选择一个服务。 | encryption、visibility、ai-storage、ai-resource-import |
CHAIN | 多个匹配插件按稳定顺序执行。每个节点可以贡献结果,失败是否中断由领域定义。 | config-change、environment、ai-pipeline |
BROADCAST | 多个订阅者观察同一个事件或 trace 点,不拥有主决策权。 | trace、事件型扩展 |
对于链式插件,领域 SPI 必须定义:如何根据资源或 pointcut 选择候选插件;哪个字段控制顺序(例如getPreferOrder()或getOrder());执行方式是串行还是并行;某个插件失败时是中断链路还是只记录失败结果;如何持久化和暴露部分执行结果。
核心插件管理器记录插件的加载状态和启用状态,本身不定义执行形态,由领域管理器负责稳定地应用对应执行形态。对于ai-resource-import,每个 managed Builder 实现表示一个外部来源,请求的sourceId等于 managedpluginName;领域在从 Builder 已接受配置快照创建请求级 Service 之前,必须检查插件类型和实现 state。
初始化阶段:PRE_CONTEXT 与 STANDARD
初始化阶段是由PluginType声明的插件类型能力,不允许插件实现自行选择:
| 阶段 | 含义 |
|---|---|
PRE_CONTEXT | 在自定义环境值写入 Spring environment 之前完成发现、配置解析和 apply。 |
STANDARD | Spring context refresh 后,通过常规核心插件管理器完成初始化。 |
environment是内置的PRE_CONTEXT类型,其余内置类型均为STANDARD(源码中ENVIRONMENT是唯一显式传入PluginInitializationPhase.PRE_CONTEXT的枚举常量)。两个阶段共享PluginInitializer编排契约;pre-context initializer 必须把已初始化的原始实例及其已接受配置快照交给后续核心管理器,后续流程不得再次加载 provider。
SPI 层次:领域 SPI 与核心插件 SPI
Nacos 插件包含两个相关的 SPI 层次:
- 领域 SPI,例如
AuthPluginService或VisibilityService,定义所属领域需要的行为; - 核心插件 SPI,即
PluginProvider,将插件实例暴露给核心插件管理器,用于列表查询、状态管理、配置管理和运行时观测。
PluginProvider<T>接口定义在 api/src/main/java/com/alibaba/nacos/api/plugin/PluginProvider.java,通过 SPI 机制自动发现插件实现,无需在 UnifiedPluginManager 中手工注册每个插件类型。其核心契约是getPluginType()(返回管理的插件类型)与getAllPlugins()(返回插件名到插件实例的 Map),并提供一个getOrder()默认方法:同类型 provider 按 order 升序处理,order 相同时保持 SPI 发现顺序,该顺序在 first-wins 注册前生效。官方注释给出的典型实现如下:
public class AuthPluginProvider implements PluginProvider<AuthPluginService> { @Override public PluginType getPluginType() { return PluginType.AUTH; } @Override public Map<String, AuthPluginService> getAllPlugins() { return AuthPluginManager.getInstance().getAllPlugins(); } }已接入统一配置的领域插件 SPI 统一继承PluginConfigSpec(api/src/main/java/com/alibaba/nacos/api/plugin/PluginConfigSpec.java)。该契约的兼容默认实现返回空 definitions、空 current map,并提供空 apply 回调,因此按旧版领域 SPI 编译的实现和新版零配置实现都会保持configurable=false。声明至少一个ConfigItemDefinition的插件属于可配置实现,必须实现 current-map 和 apply 回调。PluginConfigSpec.isConfigurable()的默认实现正是"getConfigDefinitions()非空且非空列表时返回 true"。
PluginConfigDefinitionSpec是仅暴露 definitions 的父契约,供必须在创建实例之前声明配置元数据的 factory 使用;参与统一配置生命周期的运行时插件实例仍必须实现完整的PluginConfigSpec,只实现 definition contract 的 factory 不接收也不持有 effective config。
加载与生命周期:确定性、first-wins 与启停判定
插件实现通过 Nacos SPI 加载,部署时可以从 classpath 或服务端插件目录提供插件,插件实现必须能在不修改 Nacos 服务端代码的情况下被加载。
- pre-context initializer 会在自定义环境处理前发现 policy 允许加载的
PRE_CONTEXTprovider,只解析STATIC > DEFAULT,对可配置实现执行 apply,并把实例交给领域 manager; - Spring context refresh 后,standard initializer 再发现轻量
STANDARDPluginProvider实现。只有领域 policy 当前允许加载的插件类型才会立即调用getAllPlugins;active critical 类型不受可选加载判据影响,必须加载; - 对于被延迟的非 critical 类型,后续服务配置刷新使加载判据变为 true 时,必须先发现实现、恢复持久化实现 state、解析 effective config 并调用
applyConfig,然后才能让这些实现参与执行。类型一旦加载,加载判据再次变为 false 时不卸载实例,仍由所属领域入口总开关阻止执行; - 加载判据不能替代实现级 state,其默认值为 true(见 PluginTypePolicy.java 的
isLoadingEnabled默认实现),只有拥有类型级模块或能力总开关的领域才应覆盖该判据。
插件启动必须具备确定性:
- 一个插件类型和插件名称组合只能对应一个运行时插件实例;
- 插件发现采用first-wins 注册:名称为空或实例为 null 的实现记录 WARN 后忽略;后发现实现与已有
type:name重复时保留先发现实现,记录包含两个实现类的 WARN 并忽略后来实现;这类发现冲突本身不阻塞 Nacos 启动; - provider 从多个 SPI 实现构造返回 Map 时也必须使用相同的 first-wins 规则,不得在返回 Core 前静默覆盖先发现实现;
- 插件实现不得改变 Nacos 共享资源标识、响应封装或错误约定的含义。
支持启停状态判断的插件类别,应通过PluginStateCheckerHolder获取状态,而不是维护一套独立状态来源。若 adapter 必须在 effective config 被接受后创建领域运行资源,可以实现可选的PluginStartupLifecycle:Core 只为 enabled 实现调用initialize(),调用发生在持久化 state 恢复和applyConfig完成之后、Nacos 报告启动成功之前,且该操作必须幂等;它与isConfigurable()相互独立——零配置 adapter 仍可能需要初始化,可配置 adapter 也可以不实现该生命周期。
状态与配置:模块开关、插件状态与统一配置模型
两个独立层次:模块开关 vs 插件状态
插件状态分为两个层次:已加载(实现存在于运行时)与已启用(实现可以参与请求处理)。核心模块开关和插件状态是两个独立层次:
nacos.core.auth.enabled、nacos.core.auth.admin.enabled和nacos.core.auth.console.enabled等模块开关决定核心请求链路是否调用插件,不属于插件实现配置,也不得由插件管理 API 修改;模块关闭时,插件仍可以保持加载、启用和完成配置初始化;- 每个纳入统一管理的插件类型都可以提供一个由领域模块持有的内部
PluginTypePolicy(api/src/main/java/com/alibaba/nacos/api/plugin/PluginTypePolicy.java),由它定义:当前领域是否需要该插件类型、非 critical 类型当前是否允许加载实现、每个已发现实现的初始 enabled 状态、critical 类型 active 时必需的具体实现名称,以及诊断信息中的选择配置和激活原因; PluginType.isCritical()是"该类型可能是服务正确运行所必需"的唯一静态声明,只有领域 policy 处于 active 状态时 core 才校验该 critical 类型。当前关键类型包括auth、datasource-dialect和ai-storage——active 互斥类型没有选择实现、要求的实现不存在或要求的实现被禁用,均属于启动错误,Nacos 不得静默选择或重新启用任意 fallback 实现。
标准静态选择与启用 key
已接入统一启动选择的互斥插件类型通过以下标准静态 key 选择实现(RESTART语义,修改后需重启):
nacos.plugin.{pluginType}.type={pluginName}历史选择 key 仅作为 alias:
| 类型 | 标准 key | 历史 alias | 默认值 |
|---|---|---|---|
auth | nacos.plugin.auth.type | nacos.core.auth.system.type | nacos |
datasource-dialect | nacos.plugin.datasource-dialect.type | spring.sql.init.platform | derby |
control | nacos.plugin.control.type | nacos.plugin.control.manager.type | 空,表示 no-limit |
标准 key 与 alias 同时存在时标准 key 优先,读取 alias 时服务端应记录迁移提示日志。由于互斥类型的选择会影响 Spring Bean、数据源等启动资源,插件 status API 不得把切换报告为运行时已生效;修改选择必须更新上述静态 key 并重启。
非互斥插件实现可以通过以下标准静态 key 提供初始启用状态,运行时由插件管理 API 和统一 plugin state 管理,存在持久化状态时持久化状态优先:
nacos.plugin.{pluginType}.{pluginName}.enabled=true|false链式和广播型插件的全部 enabled 实现参与执行;路由型插件只允许从 enabled 候选中选择实际实现。nacos.plugin.{pluginType}.enabled这类不包含实现名称的 key 不属于统一实现状态,已有 key 若实际承担核心模块或领域能力入口门禁,应继续由所属领域读取,且不得被持久化子插件状态绕过。
统一状态迁移排查表
统一状态迁移阶段对现有内置开关的排查结论如下:
| 配置 | 归属与迁移行为 |
|---|---|
nacos.core.auth.enabled、nacos.core.auth.admin.enabled、nacos.core.auth.console.enabled | 核心请求入口开关,不进入 plugin state。 |
nacos.extension.ai.enabled | AI 模块开关,不进入 plugin state。 |
nacos.core.config.plugin.{name}.enabled | 历史实现开关,仅作为nacos.plugin.config-change.{name}.enabled的初始状态兼容 alias。 |
nacos.plugin.visibility.enabled、nacos.plugin.ai-pipeline.enabled | 已有领域能力入口开关;分别决定核心链路是否进入 visibility 或 AI pipeline,保留动态读取且不转换为子插件状态。 |
nacos.plugin.visibility.type | 历史 visibility 选择 key,仅用于推导对应实现的初始状态;运行时路由从 enabled 实现中按领域输入选择。 |
nacos.plugin.ai-pipeline.type | 历史 Pipeline 链成员输入,仅由 Core 按RESTART推导实现初始状态;实现配置和顺序统一使用各节点的PluginConfigSpec。 |
nacos.plugin.datasource.log.enabled | 数据源行为和日志配置,不是实现启停状态。 |
nacos.ai.resource.import.enabled | nacos.plugin.ai-resource-import.enabled的历史 alias;标准 key 存在时优先。AI Resource Import 默认开启,只有显式false才关闭。 |
后续不得新增与逐实现 state 含义重复的插件族开关。核心模块或领域能力入口开关可以决定是否进入整项能力,但不能选择或启停某个具体实现;具体实现是否参与执行只能由逐实现 plugin state 表达。
配置定义与来源优先级
插件配置项由ConfigItemDefinition描述。key表示插件实现内部的 canonical item key,不携带nacos.plugin.{pluginType}.{pluginName}.前缀;静态配置推荐使用以下 normalized full key:
nacos.plugin.{pluginType}.{pluginName}.{itemKey}配置定义可以声明以下元数据:
| 字段 | 含义 |
|---|---|
aliases | 历史静态配置 key,用于兼容读取和迁移提示。 |
sensitive | 是否为敏感值。查询 API 返回前必须脱敏。 |
effectMode | 生效模式,RUNTIME表示可运行时生效,RESTART表示需要重启。 |
enabled是插件实现统一状态的保留 item key,插件不得在ConfigItemDefinition中将其声明为普通配置项。definition 发现同样采用 first-wins 归一化:null definition、空 item key 和保留的enabledkey 记录 WARN 后忽略;后来 item key 或 alias 与先前 definition 已占用的输入 key 冲突时,保留先发现 definition。PRE_CONTEXT插件声明的RUNTIME生效模式在副本中按RESTART处理。
插件配置的 effective value 由统一解析流程计算,配置来源优先级为:
LOCAL_ONLY > RUNTIME_PERSISTED > STATIC > DEFAULT完整优先级只适用于STANDARD插件;PRE_CONTEXT插件只解析STATIC > DEFAULT,不加载也不接受 runtime persisted 或 local-only source。
| 来源 | 含义 |
|---|---|
DEFAULT | 来自ConfigItemDefinition.defaultValue。 |
STATIC | 来自application.properties、环境变量、JVM 参数或 Spring 参数等静态配置。 |
RUNTIME_PERSISTED | 来自集群级运行时 override,当前可由plugin-configs.json记录终态内容。 |
LOCAL_ONLY | 当前节点的本机 override,只用于诊断或应急处理,不同步到集群。 |
插件详情返回模型可以追加以 canonical item key 为索引的configValueMetasmap,每个PluginConfigValueMeta描述对应配置项的当前值来源和是否存在多来源覆盖;overridden忽略DEFAULT,只有同一 key 同时存在多个非默认来源时才为true。
RUNTIME_PERSISTED背后的物理存储属于 core 内部扩展,通过PluginConfigStorageProvider声明稳定的存储名称、启动顺序和默认启用状态;storage 使用仅重启生效的静态开关nacos.plugin.config.source.{storageName}.enabled控制。内置local-fileprovider 默认开启且选择优先级最低,显式开启的内部实现可以替换它。物理存储和集群同步是两个独立扩展边界:PluginConfigStorage持有RUNTIME_PERSISTED终态数据,PluginStateSynchronizer负责插件状态与运行时持久化配置操作的集群顺序和传播,替换其中一个扩展点不得隐式替换另一个。standalone 模式不创建也不调用 synchronizer;集群模式在nacos.plugin.state.synchronizer.type不存在、为空或显式设置为raft时使用内置 Raft synchronizer。
计划移除的废弃兼容项
以下兼容输入在各自迁移窗口内继续接受,以便已有部署完成迁移;除表格另有更早版本说明外,它们均已废弃,并计划在 Nacos 4.0.0 移除。新部署、示例、测试和插件实现只能使用标准替代项:
| 废弃兼容输入 | 标准替代项 | 迁移说明 |
|---|---|---|
nacos.core.auth.system.type | nacos.plugin.auth.type | 静态互斥插件选择,迁移后需要重启。 |
spring.sql.init.platform | nacos.plugin.datasource-dialect.type | 静态数据库方言选择,迁移后需要重启。 |
nacos.plugin.control.manager.type | nacos.plugin.control.type | 静态 Control 实现选择,迁移后需要重启。 |
nacos.core.config.plugin.{pluginName}.enabled | nacos.plugin.config-change.{pluginName}.enabled或统一 plugin state | 旧 key 只提供实现初始状态。 |
nacos.plugin.visibility.type | nacos.plugin.visibility.{pluginName}.enabled或统一 plugin state | 旧 selector 只提供初始状态,不定义运行时路由。 |
nacos.plugin.ai-pipeline.type | nacos.plugin.ai-pipeline.{pluginName}.enabled或统一 plugin state | 使用实现状态替代旧的逗号分隔启动链。 |
nacos.core.auth.plugin.nacos.*、nacos.core.auth.caching.enabled和nacos.core.auth.nacos.anonymous.ai.enabled | nacos.plugin.auth.nacos.{itemKey} | 按 definition 暴露的 canonical item key 迁移每个默认鉴权配置项。 |
nacos.core.auth.ldap.* | nacos.plugin.auth.ldap.{itemKey} | LDAP item 名称使用 canonical kebab-case definition。 |
nacos.core.auth.plugin.oidc.* | nacos.plugin.auth.oidc.{itemKey} | OIDC item 名称使用 canonical definition;当前全部 OIDC 配置仍为RESTART。 |
db.*和 JVM 参数QUERYTIMEOUT | nacos.plugin.datasource.db.* | 数据源参数仍是只在重启后生效的模块配置,不进入插件 PUT API。 |
executable、path、useLlm、apiKey等历史 AI Pipeline 相对 item key 和其他 camel-case alias | nacos.plugin.ai-pipeline.{pluginName}.*下的 canonical kebab-case item key | 精确 alias 清单由 AI Pipeline 插件规范记录。 |
nacos.ai.resource.import.enabled | nacos.plugin.ai-resource-import.enabled | 标准模块 key 保持权威,默认开启。 |
nacos.plugin.ai.importer.*.enabled | nacos.plugin.ai-resource-import.{pluginName}.enabled或统一 plugin state | 把旧内置 source 状态 key 迁移到受管实现状态。 |
nacos.plugin.ai.importer.*item 配置 | nacos.plugin.ai-resource-import.{pluginName}.{itemKey} | 把 display、description、limits 和 endpoint 输入迁移到受管 source 身份。 |
nacos.ai.resource.import.allow-user-url | 受管 source endpoint 配置 | 用户 URL 直接导入兼容和旧 MCP import adapter 计划在 Nacos 3.4.0 移除。 |
ConfigChangeConfigsproperty bridge | ConfigChangePluginService上的 definitions 和 callbacks | 3.x 窗口内,没有 definitions 的旧二进制插件继续接收历史 properties。 |
VisibilityService.init(Properties) | 从PluginConfigSpec继承的 definitions 和 callbacks | 统一生命周期在 visibility 执行前应用 effective item-key map。 |
CustomEnvironmentPluginManager.join(...) | 通过PRE_CONTEXTinitializer 发现 Environment SPI | Environment 实现必须在 Spring environment 定制开始前可被发现。 |
旧的nacos.ai.resource.import.legacy-mcp-api-enabled输入不再识别,废弃 MCP Import API 改用 兼容与废弃策略规范 定义的共享nacos.core.api.compatibility.enabled门禁。nacos.core.auth.enabled等核心模块总开关、PluginConfigSpec的空 definitions 默认实现,以及旧版零配置插件实现的二进制加载兼容不属于本移除清单。
运行时状态约束与配置更新兼容性
对于每次运行时操作都会重新选择实现的插件类型,领域执行链路必须在调用扩展前检查统一插件状态。当前使用该门禁的插件包括auth、datasource-dialect、encryption、trace、visibility、config-change、ai-pipeline和ai-storage。被禁用的插件仍保持加载并可由管理 API 查询,但不得参与领域执行。
持久化状态变更必须遵循validate、persist、apply 顺序:先校验完整候选终态,再写入持久化状态;只有持久化成功后才能修改管理器内存状态。持久化失败时内存保持原值并允许重试。localOnly状态变更按定义跳过持久化,只应用到当前节点。plugin_state一致性组可能在 Spring context 创建期间恢复快照,快照中的statesmap 表示完整的持久化 override 而非增量 patch:恢复时必须整体替换本机持久化 map,快照中缺失的条目用于移除本机陈旧 override。
配置更新 API 保持 additive 兼容:已有config和configDefinitions字段继续保留,config可以表示当前 effective config,新增的configValueMetasmap 按 canonical item key 提供 source 和 overridden 等元信息。PUT /v3/admin/core/plugin/config保持完整 override map 更新语义;localOnly=true表示只更新当前节点 local-only override,否则更新集群级 runtime persisted override。effectMode=RESTART的字段不应通过运行时更新立即生效,新增、修改或移除RESTART配置项都必须拒绝。
对于声明为sensitive=true的配置项,提交值只要包含统一的******marker 就按脱敏展示值处理:如果当前目标 source 已包含该 key,服务端应保留原始值;如果目标 source 不包含该 key,则忽略这项输入。该判断同时覆盖******、a******z和ab******yz,且不得把STATIC等其他 source 的 effective value 复制成 runtime override。
管理 API
核心插件管理 API 如下,均属于 Admin API,并要求符合 HTTP 鉴权规范 中的控制台域鉴权,同时必须使用标准 v3 响应与错误模型:
| 方法 | 路径 | 目的 |
|---|---|---|
GET | /v3/admin/core/plugin/list | 查询已加载插件,可按类型过滤。 |
GET | /v3/admin/core/plugin/detail | 查询单个插件详情,返回 effective config 和可选值元数据。 |
PUT | /v3/admin/core/plugin/status | 启用或禁用插件。 |
PUT | /v3/admin/core/plugin/config | 更新插件配置。 |
集成测试 PluginAdminApiOpenApiITCase.java 对这些端点的行为给出了可直接对照的验证:
- list 与 detail:list 响应中每个插件必须携带
pluginId(含:)、pluginType、pluginName、typeCritical、executionMode、exclusive字段;按pluginType过滤只返回该类型;未知类型过滤返回空列表;detail 返回与 list 一致的 identity,并追加enabled、configurable、configValueMetas; - 配置元数据:对
auth类型的nacos实现,detail 暴露 5 个configDefinitions,包括token.secret.key(STRING、RESTART、sensitive)、token.expire.seconds(NUMBER、RUNTIME)、token.cache.enable(BOOLEAN、RUNTIME)、caching.enabled(BOOLEAN、RUNTIME)、anonymous.ai.enabled(BOOLEAN、RUNTIME);其中敏感项token.secret.key在响应中已脱敏为******,而configValueMetas正确标记了token.secret.key的来源为STATIC、anonymous.ai.enabled的来源为DEFAULT; - 边界与错误:status 更新必须携带
pluginName;config 更新必须携带config且拒绝不可配置插件;禁用 critical 实现、对互斥类型做运行时切换都会被拒绝且不产生变更,符合"critical 类型必须保留可用实现""互斥选择只能重启生效"的约束。
控制台配置流程要点
控制台插件详情以 detail API 返回的 effective value、definition 和 value metadata 作为唯一权威输入,并遵守以下规则:
RUNTIME字段使用可编辑控件,RESTART字段只读,并提示通过 Nacos 配置文件修改后重启生效;- 展示 effective source 和 overridden 状态,但不得获得或显示未脱敏的敏感值;
- 将集群级 runtime persisted 更新与当前节点 local-only 更新作为两个明确、独立的模式;
- 按完整 map 更新契约重建目标 source:只把 effective metadata 指向目标 source 的现有值作为基线,再合并用户编辑和显式移除 override 的操作;不能因为提交了表单就把
STATIC或DEFAULT的 effective value 复制成运行时 override。
由于 effectiveLOCAL_ONLY值可能遮住同一字段已经存在的 runtime persisted 值,只要当前节点仍有任意 local-only override,控制台就必须阻止提交集群配置;可以通过localOnly=true提交空 map 完整清空当前节点的 local-only source。
插件实现设计要求
插件实现必须遵守以下规则:
- 使用已有 Nacos 资源标识和领域模型,不为同一资源发明不兼容的新模型;
- 插件提供的 HTTP API 必须保持 v3 HTTP API 响应、错误和鉴权约定;
- 仅通过
PluginConfigSpec暴露插件自身拥有的配置; - 除调用方明确要求本机操作用于诊断或应急处理外,集群级状态变更必须保持同步;
- 安全敏感的默认值和部署要求必须在插件实现规范中说明。
扩展规范阅读地图
按插件规范树的五大分类,深入各领域契约时建议按需查阅对应规范文档:
- 通用模型:plugin-spec.md(本文核心依据)、addressing-plugin-spec.md;
- 数据与配置:datasource-dialect-plugin-spec.md、default-datasource-dialect-plugin-spec.md、config-change-plugin-spec.md、config-encryption-plugin-spec.md;
- 运行时扩展:environment-plugin-spec.md、trace-plugin-spec.md、control-plugin-spec.md、default-control-plugin-spec.md;
- AI 扩展:ai-pipeline-plugin-spec.md、ai-storage-plugin-spec.md、ai-vector-plugin-spec.md、ai-resource-import-plugin-spec.md;
- 安全扩展:auth-plugin-spec.md、ram-auth-plugin-spec.md、oidc-auth-plugin-spec.md、visibility-plugin-spec.md。
与之配套的 SPI 与元数据模型集中在 api/src/main/java/com/alibaba/nacos/api/plugin 包下(PluginType、PluginProvider、PluginConfigSpec、PluginTypePolicy、PluginExecutionMode、PluginStartupLifecycle、PluginStateCheckerHolder等),管理 API 的行为可对照 PluginAdminApiOpenApiITCase.java 理解。在实际部署中,插件选择与启停的静态配置均写入application.properties(可参考 distribution/conf/application.properties),而运行时配置与状态通过前述管理 API 与集群同步链路维护。
【免费下载链接】nacosan easy-to-use dynamic service discovery, configuration and service management platform for building AI cloud native applications.项目地址: https://gitcode.com/GitHub_Trending/na/nacos
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考