从公司项目说起
前段时间在整理技术方案时,想起了之前公司的那个项目架构。我们当时做了一个中台系统,配合各种业务模块,效果还挺不错的。简单说就是:
-
有个中台统一管理所有应用
-
各个业务模块独立开发、独立部署
-
前端也是模块化的,可以动态加载
-
整个流程都是自动化的
总结一下原公司的架构可能为“中台 + 模块化微服务 + 微前端”结合的云原生架构体系,特点是:
-
中台统一管理:负责应用注册、菜单、权限、页面路由管理
-
模块化微服务:业务模块独立开发、独立打包、独立部署,Kubernetes 管理生命周期
-
前端微前端/模块化页面:业务页面可在中台中集成展示
-
CI/CD 构建流水线:模块从开发到部署全自动化
为什么要折腾插件化?
生命在于折腾。
在逛各位大佬们的博客的时候有幸遇到很多优秀的博客,其中不乏有一些独立开发的站点并且开源。
不过有些开源站点他设计的功能会很丰富,导致很多人可能用不上部分功能,所以导致功能冗余占用性能(虽然也只是蚊子腿)。
就好比说博客网站可能主要的就是博客列表、博客详情,除了一些强耦合在页面里的功能如:评论、推荐、总结等功能不能拆分的。
很多开源站点还支持履历、设备展示、照片墙、数据统计、旅游地图等这种单开一个页面的功能,那实际用户使用的时候可能就没有照片墙或者设备需要展示,这几个页面甚至是对应的查询api和库都是不需要的。
这次重构博客的时候我有在思考,博客本质就是文章,其他的内容能不能按类似的方案开发,比如添加一些功能模块,比如:
-
图书角:展示我读过的书
-
影视墙:记录看过的电影电视剧
-
旅游足迹:分享旅行经历
-
友链管理:方便管理友情链接
但是这套架构在企业环境里确实很香,但当我想要给自己的博客搞类似功能时,发现完全不是那么回事,其技术栈复杂、开发周期长、运维成本高,对于一个个人使用的博客而言无异于是“杀鸡用牛刀”、“大炮打蚊子”。
在前面几月折腾PT的时候发现了一个项目,使用了插件化的开发思路,为此我想借鉴一番。(玩PT的程序大佬是真的多,一个项目里学到好多东西)
用插件来注册对应需要拓展的页面,实现功能的扩展,方便开源后,用户们的自行组装,有点搭积木的意思。
AI加持,尝试“云”架构一波
最近没时间验证,尝试把想要使用的架构和逻辑思路丢给AI,不断的沟通修正,让他回答出一份看似可行的技术架构说明。
以下只是一个方向,还待验证
技术选型策略
分析"前端模块联邦 + 后端插件管理"的技术路线:
前端技术选型:Module Federation + Nuxt
Module Federation是Webpack 5引入的革命性特性,它允许JavaScript应用在运行时动态加载远程模块。这一特性完美契合插件化架构的需求:
-
动态加载:主应用可在运行时动态加载插件的前端UI和逻辑
-
依赖共享:可配置共享依赖,避免重复加载
-
独立部署:各插件可独立开发、独立部署
后端技术选型:PF4J框架 + SpringBoot
PF4J(Plugin Framework for Java)是一个轻量级的Java插件框架,它提供了:
-
插件生命周期管理:支持插件的安装、启动、停止、卸载
-
扩展点机制:通过扩展点实现插件与主应用的解耦
-
类加载隔离:确保插件间的类冲突不会影响主应用
核心组件职责
主应用职责:
-
提供基础网站功能(博客、个人信息、主页等)
-
维持轻量级和稳定性,不受插件逻辑影响
-
负责插件的发现、加载和管理
插件系统职责:
-
支持功能的动态添加、移除和升级
-
每个插件独立开发、独立部署
-
实现具体业务功能(图书角、影视墙、旅游足迹等)
模拟演练
阶段一:开发阶段
前端项目开发:
-
创建独立的
book-ui项目 -
配置Module Federation,暴露
./BookPage组件 -
构建产出
dist/目录
后端项目开发:
-
创建
book-plugin项目 -
实现
MenuExtension接口,注册菜单项 -
实现
RequestExtension接口,处理/books/list请求 -
将前端构建产物放入后端资源的
static/目录
打包发布:
将后端JAR和前端资源打包成book-corner-1.0.0.zip发布包
阶段二:部署安装阶段
-
在个人网站后台上传插件ZIP包
-
主应用后端使用PF4J解压并加载JAR文件
-
检测到
MenuExtension,将菜单信息存入数据库 -
检测到静态资源,建立文件映射:
http://api.site.com/plugins/book/assets/ -
执行插件内置的
init.sql,创建plg_book_table表
阶段三:运行阶段
-
用户访问首页,前端Shell请求
/api/config获取配置 -
后端返回插件配置信息,包括模块名称、入口文件地址、路由路径
-
前端Shell根据配置生成"图书角"菜单项
-
用户点击菜单,前端动态加载
remoteEntry.js文件 -
渲染远程组件,组件内部发起API请求获取数据
-
后端拦截请求,转交给
book-plugin处理,返回JSON数据
技术优势分析
极致的模块解耦
-
各插件完全独立,互不影响
-
插件升级不会影响主应用和其他插件
-
支持并行开发和部署
主应用轻量化
-
核心功能精简,启动速度快
-
内存占用低,运行效率高
-
稳定性不受插件质量影响
开发效率提升
-
插件开发者只需关注具体业务逻辑
-
标准化的接口降低了开发门槛
-
支持快速原型验证和功能迭代
个站优化
考虑到是个人博客,一个人可以做一些简化:
-
统一技术栈,使用相同版本,避免版本冲突,减少插件体积。
-
数据库简化,使用一个实例,前缀区分表明、安装建表,卸载删除。
架构升级
当插件量增大(如几十到上百个)时,核心矛盾从「单一插件的前后端协同」转变为「规模化插件的高效管理、性能控制、隔离稳定性、生态标准化」。
原方案的核心架构(MF + PF4J)仍适用,但需要在「加载机制、管理平台、隔离策略、性能优化、生态规范」五个维度进行升级,以下是具体落地方案:
核心升级思路
规模化插件的核心需求是:「平台化管理 + 轻量化运行 + 强隔离 + 低损耗」
-
管理层面:从「手动加载插件」升级为「插件市场 + 统一管理平台」,支持插件的搜索、安装、升级、卸载全生命周期管理;
-
加载层面:从「全量加载」升级为「按需加载 + 预加载策略」,避免大量插件同时加载导致的性能问题;
-
隔离层面:从「基础隔离」升级为「强隔离(沙箱化)」,防止插件间的依赖冲突、数据泄露、资源抢占;
-
性能层面:通过「缓存、资源优化、异步处理」降低大量插件对主应用的性能损耗;
-
生态层面:通过「插件开发规范 + SDK」标准化插件接入,降低多开发者协作的成本。
当插件量增大时,原方案(MF + PF4J)通过「平台化管理 + 按需加载 + 沙箱隔离 + 标准化生态」的升级,完全可以支撑大量插件的稳定运行,核心优势:
-
管理效率:插件市场 + 管理后台解决了大量插件的安装、升级、卸载、监控问题,无需人工干预;
-
性能可控:按需加载 + 资源优化 + 隔离策略,避免大量插件导致的加载缓慢、内存溢出、资源抢占;
-
稳定性保障:强隔离(前端沙箱 + 后端类加载器 / 多数据源)+ 健康检查 + 熔断,防止单个插件异常影响全局;
-
生态可扩展:SDK + 规范 + 审核机制,降低第三方开发者的插件开发成本,形成良性生态。
落地优先级建议
-
先搭建「插件市场 + 管理后台」,解决大量插件的管理问题;
-
再优化「加载机制 + 隔离策略」,保障性能和稳定性;
-
最后完善「SDK + 规范 + 审核机制」,支撑生态扩展。
适用场景边界
-
适合插件量:100 个以内(个人网站 / 中小型平台),通过上述方案可稳定支撑;
-
若插件量超 1000 个(大型开放平台),需进一步升级为「微服务化插件」(每个插件独立部署为微服务,主应用通过服务发现调用)
抽象总结
这篇博文的核心内容多由 AI 生成 —— 只因文中架构尚处于 “构想阶段”(是我 “云” 出的思路,未经过实际落地操作)。
但想借这点说明:AI 虽无法独立完成完整应用的开发,可只要我们提供明确的架构方向与逻辑,让它参与讨论、验证,它就能在关键环节帮我们排查漏洞、修正偏差。
带着思路和 AI 协作的方式,远比直接把问题丢给 AI、收到格式生硬的回复要舒服得多,对渴望成长为架构师的新手来说,这无疑是个实用的辅助功能。
也算是水一篇博文了,不然直接拷贝AI回复也太抽象了。
留言 (0)