Nacos 的 SPI 扩展点有 12 个,你只需要知道这 5 个:插件机制从原理到优先级排序

发布时间:2026/8/27 14:07:01

Nacos 的 SPI 扩展点有 12 个,你只需要知道这 5 个:插件机制从原理到优先级排序
Nacos 的 SPI 扩展点有 12 个你只需要知道这 5 个插件机制从原理到优先级排序文章目录Nacos 的 SPI 扩展点有 12 个你只需要知道这 5 个插件机制从原理到优先级排序你想改 Nacos 的行为不用改它的代码Java SPI vs Nacos SPIJava SPI 的工作方式Nacos SPI 的工作方式扩展点加载流程源码走读NacosServiceLoader 的核心方法加载时序排序机制order 值怎么确定Nacos 的 12 个扩展点你只需要知道这 5 个扩展点的插件目录一张图带走Nacos SPI 加载全流程不适用本文描述的情况你想改 Nacos 的行为不用改它的代码去年有个客户要在 Nacos 里接 LDAP 认证。团队里有人第一反应是 fork 一份 Nacos 源码改掉认证逻辑然后自己编译一个版本。不用。Nacos 从 1.4.0 开始引入 SPI 插件机制。认证、健康检查、数据源、配置变更通知——这些核心功能都有扩展点。你只需要写一个实现类打个 jar 包放到 Nacos 的 plugins 目录下。Nacos 的 SPI 机制和 JDK 原生的 SPI 不一样。JDK SPI 用ServiceLoader加载所有实现类都会被实例化不能排序、不能按条件加载。Nacos 自己实现了一套NacosServiceLoader支持优先级排序、条件过滤、单例管理。这篇文章拆开 Nacos SPI 的加载流程源码搞清楚它和 Java SPI 的区别、扩展点的优先级怎么排、你写插件时需要知道的最小接口集合。⚠️ 本文基于 Nacos Server 2.3.x。SPI 插件机制从 1.4.0 开始引入2.0.0 后扩展了鉴权插件和数据源插件接口。如果你用的是 1.4.x可用的扩展点比 2.x 少。Java SPI vs Nacos SPIJava SPI 的工作方式// 接口publicinterfacePayment{voidpay();}// 实现类publicclassAlipayPaymentimplementsPayment{...}// 配置文件META-INF/services/com.example.Paymentcom.example.AlipayPayment// 加载ServiceLoaderPaymentloaderServiceLoader.load(Payment.class);for(Paymentp:loader){p.pay();// 所有实现类都会被实例化和遍历}Java SPI 的问题全部实例化。不管你用不用ServiceLoader 会把所有实现类都 new 一遍。无法排序。多个实现类的加载顺序取决于 classpath不可控。无法按条件过滤。不能根据运行时参数只加载某一个实现。无生命周期管理。加载后没有统一的销毁机制。Nacos SPI 的工作方式// NacosServiceLoader 的加载NacosServiceLoaderIdentityContextBuilderloaderNacosServiceLoader.newServiceLoader(IdentityContextBuilder.class);// 获取所有实现按 order 排序CollectionIdentityContextBuilderbuildersloader.getSingletonServiceList();// 取第一个order 值最小的IdentityContextBuilderbuilderbuilders.iterator().next();特性Java SPINacos SPI加载方式ServiceLoader.load()NacosServiceLoader.newServiceLoader()实例化策略全量实例化按需实例化 单例缓存排序无classpath 顺序Order注解 或getOrder()方法过滤无按type属性过滤配置文件META-INF/services/META-INF/services/生命周期无initialize()shutdown()配置文件的路径是一样的都在META-INF/services/但 Nacos SPI 在加载时多了一层处理逻辑。扩展点加载流程源码走读NacosServiceLoader 的核心方法// com.alibaba.nacos.common.spi.NacosServiceLoaderpublicclassNacosServiceLoaderS{// 接口类型 → 实现类列表的缓存privatefinalMapClassS,CollectionSserviceMapnewConcurrentHashMap();// 创建新的 ServiceLoaderpublicstaticSNacosServiceLoaderSnewServiceLoader(ClassSservice){NacosServiceLoaderSloadernewNacosServiceLoader(service);loader.load();returnloader;}// 核心加载逻辑privatevoidload(){// 1. 通过 JDK ServiceLoader 找到所有实现类ServiceLoaderSjdkLoaderServiceLoader.load(service);// 2. 遍历并实例化for(Simpl:jdkLoader){// 3. 调用 initialize()如果有if(implinstanceofSpiExtension){((SpiExtension)impl).initialize();}// 4. 放入缓存serviceMap.computeIfAbsent(service,k-newArrayList()).add(impl);}// 5. 按 order 排序serviceMap.get(service).sort(Comparator.comparingInt(this::getOrder));}// 获取排序后的实现列表publicCollectionSgetSingletonServiceList(){returnserviceMap.getOrDefault(service,Collections.emptyList());}}加载时序你的插件实现类JDK ServiceLoaderNacosServiceLoaderNacos Server 启动你的插件实现类JDK ServiceLoaderNacosServiceLoaderNacos Server 启动newServiceLoader(IdentityContextBuilder.class)ServiceLoader.load(IdentityContextBuilder.class)扫描 META-INF/services/ 文件返回实现类迭代器new YourPluginImpl()initialize()如果实现了 SpiExtension按 getOrder() 排序返回排序后的实现列表排序机制order 值怎么确定Nacos SPI 的排序有两种方式按优先级从高到低方式一Order注解Order(1)// order 值越小优先级越高publicclassMyAuthPluginimplementsAuthPluginService{// ...}方式二getOrder()方法publicclassMyHealthCheckPluginimplementsHealthCheckProcessor{OverridepublicintgetOrder(){return100;// 值越小越靠前}}order 范围含义使用场景0 - 99最高优先级自定义插件覆盖默认行为100 - 999中等优先级常规扩展1000低优先级兜底/默认实现Nacos 内置的插件实现通常 order 值在 1000 以上。你写的自定义插件设成 1 就能覆盖默认行为。Nacos 的 12 个扩展点你只需要知道这 5 个Nacos 2.x 总共有 12 个 SPI 扩展点。大部分你不需要碰。实际生产中用到最多的是这 5 个扩展点接口用途鉴权插件AuthPluginService自定义登录认证方式身份上下文IdentityContextBuilder从请求中提取身份信息健康检查HealthCheckProcessor自定义健康检查协议数据源ExternalDataSourcePlugin替换 MySQL 为其他数据库配置变更通知ConfigChangeHook配置变更后触发自定义动作剩余 7 个扩展点DNS 服务、指标上报、日志扩展等属于高级定制场景日常开发很少用到。扩展点的插件目录nacos-server/ ├── plugins/ # 插件 jar 包放这里 │ ├── my-auth-plugin.jar │ ├── my-healthcheck-plugin.jar │ └── my-datasource-plugin.jar ├── conf/ │ └── application.properties └── target/ └── nacos-server.jar把插件的 jar 包放到plugins/目录下Nacos 启动时自动扫描加载。不需要改任何配置文件除了插件自身需要的配置参数。一张图带走Nacos SPI 加载全流程Nacos Server 启动扫描 plugins/ 目录加载所有 jar读取 META-INF/services/找到接口→实现类映射NacosServiceLoader实例化实现类调用 initialize()SpiExtension 接口按 Order / getOrder() 排序值越小优先级越高注册到扩展点 Map运行时按 order 调用优先使用 order 最小的实现Nacos Server 启动时扫描 plugins 目录 → 读 META-INF/services → 实例化 → 初始化 → 排序 → 注册。运行时按 order 取优先级最高的实现。不适用本文描述的情况Nacos 1.3.x 及以下。SPI 插件机制从 1.4.0 开始引入。1.3.x 没有 plugins 目录、没有 NacosServiceLoader。如果你需要自定义功能只能 fork 源码修改。Nacos 2.0.x 早期版本。2.0.0 引入了鉴权插件和数据源插件接口但接口在 2.0.x 的小版本迭代中有变更。如果你在 2.0.0 上开发的插件升级到 2.1.x 后可能需要适配接口变更。你们在 Nacos 上开发过自定义插件吗评论区留数字1开发过鉴权插件 2开发过健康检查插件 3开发过数据源插件 4还没开发过先收藏

相关新闻

ArcGIS 10.8 流域提取实战:基于30m DEM生成5级河网与子流域边界

ArcGIS 10.8 流域提取实战:基于30m DEM生成5级河网与子流域边界

2026/8/23 0:34:59

ArcGIS 10.8 流域提取实战:基于30m DEM生成5级河网与子流域边界水文分析是地理信息系统(GIS)在水资源管理、环境评估和灾害预防等领域的核心应用之一。通过数字高程模型(DEM),我们可以模拟地表水流的运动路…

锂离子电池组主动均衡方案与MP2672A应用实践

锂离子电池组主动均衡方案与MP2672A应用实践

2026/8/23 0:35:04

1. 项目背景与核心需求解析两节串联锂离子电池组在无人机、电动工具和便携式医疗设备中广泛应用,但电池单元间的电压不平衡问题长期困扰着工程师。这种不平衡轻则降低电池组容量利用率,重则引发过充过放的安全隐患。传统被动均衡方案通过电阻放电实现平衡…

MAX77654与PIC18F96J65的嵌入式电源管理方案

MAX77654与PIC18F96J65的嵌入式电源管理方案

2026/8/23 0:35:04

1. 项目背景与需求分析 在嵌入式系统设计中,电源管理一直是决定产品可靠性和续航能力的关键因素。MAX77654与PIC18F96J65的组合方案,正是针对需要高效能电源管理的智能设备而设计的经典搭配。我在多个工业物联网项目中验证过这套架构,其核心价…

KKCE: 网站测速能否定位TLS证书链错误?-快快测

KKCE: 网站测速能否定位TLS证书链错误?-快快测

2026/8/27 13:58:02

一、引言:为什么浏览器显示“证书有效”,网站测速却提示部分地区 TLS 握手失败? 在 HTTPS 部署中,我们常以为只要浏览器地址栏显示小锁图标,证书配置就“完美无缺”。运维在本地用 SSL Labs 测试拿到 A 评分&#xff…

xss漏洞 xss-labs部分关卡

xss漏洞 xss-labs部分关卡

2026/8/27 13:58:02

Web应用程序对用户输入的数据未进行严格过滤或转义&#xff0c;导致攻击者能将恶意脚本注入到网页中&#xff0c;并被浏览器执行。 常用手段&#xff0c;若没有任何过滤可以采取 <script>alert(1)</script> 部分可能需要js符号闭合&#xff0c;则采取 ><…

《Windows Sysinternals实战指南》1.2 常用 Sysinternals 工具总览:必须认识的核心工具家族

《Windows Sysinternals实战指南》1.2 常用 Sysinternals 工具总览:必须认识的核心工具家族

2026/8/27 13:58:02

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》 《微信助手》 《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》 🌟 让复杂的事情更简单,让重复的工作自动化 S…

Redis:从“单线程神话“到“多线程真香“——一条走了十几年的演绎之路

Redis:从“单线程神话“到“多线程真香“——一条走了十几年的演绎之路

2026/8/27 13:58:02

引子:一个被误解了十年的"单线程" 面试里有个经典问题:“Redis 是单线程的吗?” 十年前,标准答案是"是的,而且正因为单线程才这么快"。今天再这么答,大概率会被追问一句:“那 6.0 的多线程 IO 你怎么看?4.0 的 lazy free 呢?后台的 BIO 线程呢?” …

第一批找不到工作的年轻人,靠AI收入6位数

第一批找不到工作的年轻人,靠AI收入6位数

2026/8/27 13:58:02

前言 最近&#xff0c;参加秋招的同学再一次感受到了AI的力气和手段。 先是有同学利用AI辅助面试&#xff0c;狂收offer&#xff1a;好家伙&#xff0c;面试官问问题的速度赶不上用AI“打小抄”的速度&#xff1a;还有同学直接打入AI内部&#xff0c;本着“替我打工&#xff0c…

AI产品经理入门基础教程,非常详细,从入门到精通,收藏这一篇就够了

AI产品经理入门基础教程,非常详细,从入门到精通,收藏这一篇就够了

2026/8/27 13:48:02

一、什么是AI产品经理&#xff1f; AI产品经理是负责将人工智能技术整合到产品中的专业人士。与传统产品经理相比&#xff0c;AI产品经理不仅需要具备深厚的技术理解力&#xff0c;还需要能够将技术与市场需求紧密结合&#xff0c;创造出更有竞争力的产品。AI产品经理的工作涉及…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述&#xff1a;从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级&#xff0c;他们原来的业务里&#xff0c;每天有几十万张图片和短视频需要过审&#xff0c;最初是接了几个开源的AI模型自己部署&#xff0c;但效果和性能一直不太稳定。后…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中&#xff0c;类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手&#xff0c;我理解这类题目的核心价值在于&#xff…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption&#xff1f; 你有没有遇到过这样的场景&#xff1a;嵌入式设备通过RS-485上传温湿度数据&#xff0c;上位机偶尔收到一帧乱码——温度显示成-273℃&#xff0c;湿度跳到999%&#xff0c;但串口波形看起来完全正常&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具&#xff0c;覆盖选题构思、文献整理、内容生成、格式排版等核心场景&#xff0c;真正帮你高效搞定论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃&#xff1a;XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…