# LingFrame-RuoYi **Repository Path**: LingFrame/LingFrame-RuoYi ## Basic Information - **Project Name**: LingFrame-RuoYi - **Description**: 本项目是 LingFrame 生态的官方改造范例,展示如何用灵珑微内核对存量 Spring Boot 单体做零侵入运行时治理 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-03 - **Last Updated**: 2026-09-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LingFrame-RuoYi 基于 [RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) `3.9.2` 的灵珑(LingFrame)灵核化改造演示项目。 > **声明**:本项目为第三方改造演示,非若依官方项目。若依原版代码遵循 [MIT LICENSE](LICENSE)(Copyright (c) 2018 RuoYi)。 > 本项目是 LingFrame 生态的官方改造范例,展示如何用灵珑微内核对存量 Spring Boot 单体做零侵入运行时治理。关于灵珑框架本身的设计理念与价值定位,请参阅 [灵珑主仓库](https://gitee.com/lingframe/lingframe)。 --- ## 一、快速开始 ### 1. 全量编译与自动化集成测试 ```bash # 执行全量自动化测试(包含单测、治理集成测试与微内核闭环验证) mvn clean test ``` ### 2. 启动灵核与控制面 ```bash # 启动灵核单体应用(默认端口 8080,Dashboard 控制面: /dashboard.html) java -jar lingframe-ruoyi-lingcore/target/lingframe-ruoyi-lingcore.jar ``` ### 3. 生产环境启动 ```bash # 生产环境使用 prod profile(关闭 dev-mode、强 token、严格安全模式) java -jar lingframe-ruoyi-lingcore/target/lingframe-ruoyi-lingcore.jar --spring.profiles.active=prod ``` 生产环境必需的环境变量见 [`docs/production-hardening.md`](docs/production-hardening.md) 上线前核验表。 ### 4. 最小演示路径:体验热插拔 启动后按以下步骤体验灵元热插拔(无需重启): 1. 打开 Dashboard 控制面:`http://localhost:8080/dashboard.html`(开发模式 token:`lingframe`) 2. 在灵元列表查看 6 个已自动加载的灵元(`ling-roots` 配置的目录自动扫描) 3. 将 `ling-storage-oss` 权重设为 100 → 文件上传切走阿里云 OSS 4. 将权重设为 0 → 自动回退灵核本地存储兜底 5. 热卸载 `ling-export-fast` → 导出回退原生 POI;重新部署 → 恢复流式导出 全程不停机、不重启、前端 0 感知。事件流实时查看:`http://localhost:8080/lingframe/dashboard/sse` --- ## 二、容器化部署 ```bash # 构建镜像(多阶段构建:灵核 fat jar + 全部灵元 jar) docker build -t lingframe-ruoyi:latest . # 启动容器(生产配置通过环境变量注入) docker run -d \ -p 8080:8080 \ -e SPRING_PROFILES_ACTIVE=prod \ -e MYSQL_URL="jdbc:mysql://db:3306/ry-vue?..." \ -e MYSQL_USERNAME=root \ -e MYSQL_PASSWORD=${MYSQL_PASSWORD} \ -e REDIS_HOST=${REDIS_HOST} \ -e REDIS_PASSWORD=${REDIS_PASSWORD} \ -e TOKEN_SECRET=${TOKEN_SECRET} \ -e LINGFRAME_DASHBOARD_TOKEN=${LINGFRAME_DASHBOARD_TOKEN} \ -e LINGFRAME_MODE_SWITCH_PASSWORD=${LINGFRAME_MODE_SWITCH_PASSWORD} \ -e DRUID_USERNAME=${DRUID_USERNAME} \ -e DRUID_PASSWORD=${DRUID_PASSWORD} \ lingframe-ruoyi:latest ``` CI/CD 配置见 [`.gitlab-ci.yml`](.gitlab-ci.yml)(构建 → 测试 → 打包 → 镜像 → 部署)。 --- ## 三、工程架构 ``` LingFrame-RuoYi/ ├── pom.xml # 根 POM:统一版本与构建顺序管理 ├── lings/ # [灵元矩阵] 独立业务能力单元 │ ├── ling-notice-v2/ # [模式 1] 通知公告 v2 灰度切流灵元 (ISysNoticeService) │ ├── ling-storage-oss/ # [模式 1] 阿里云 OSS 存储接管灵元 (ISysStorageService) │ ├── ling-storage-cos/ # [模式 1] 腾讯云 COS 存储接管灵元 (ISysStorageService) │ ├── ling-export-fast/ # [模式 1] 大数据流式导出接管灵元 (ISysExportService) │ ├── ling-sms-aliyun/ # [模式 2] 阿里云多通道短信与验证码灵元 (ISysSmsService) │ └── ling-sensitive-filter/ # [模式 3] 敏感词检测与文本合规脱敏灵元 (自包含端点) └── lingframe-ruoyi-lingcore/ # [灵核] 若依原版纯净单体 + 灵珑 starter 纯净底座 ``` 灵核 13 个 Java 文件内部结构: ``` src/main/java/com/lingframe/ruoyi/ ├── RuoYiApplication.java # 启动类(扩展 scanBasePackages) ├── contract/ # 契约接口(灵元实现,灵核兜底) │ ├── ISysStorageService.java # 存储契约 │ ├── ISysExportService.java # 导出契约 │ └── ISysSmsService.java # 短信契约 ├── bridge/ # AOP 桥接(拦截若依 Controller,转交灵元) │ ├── StorageBridgeAspect.java # 上传桥接 │ └── ExportBridgeAspect.java # 导出桥接 ├── provider/ # 兜底 Provider(灵元卸载后自动回退) │ ├── LocalStorageServiceImpl.java # 本地存储兜底 │ ├── PoiExportServiceImpl.java # POI 导出兜底 │ └── DefaultLocalSmsProvider.java # 本地短信兜底 ├── config/ # 灵珑接入配置 │ ├── DashboardWebMvcConfig.java # Dashboard MVC 配置 │ └── LingSecurityPermitPostProcessor.java # Security 白名单注入 ├── web/controller/sms/ # 模式 2 薄门面 │ └── SysSmsController.java # 短信门面 Controller └── exception/ └── LingGatewayExceptionHandler.java # 灵元网关异常处理 ``` --- ## 四、改造侵入度量化 > 若依原版以 `ruoyi-admin` jar 依赖引入,**源码不在本项目中,物理上零改动**。 ### 新增代码统计 | 层 | Java 文件数 | 代码行数 | 职责 | |---|---:|---:|---| | 灵核底座 | 13 | 522 | 契约接口 / AOP 桥接 / 兜底 Provider / 配置 / 异常处理 | | 灵元矩阵 | 41 | 2,898 | 6 个独立业务能力单元(存储/导出/短信/通知/敏感词) | | **合计新增** | **54** | **3,420** | | | **若依原版改动** | **0** | **0** | jar 依赖,源码未触碰 | ### 对比:直接改若依源码(以导出场景为例) | 维度 | 灵核化方案 | 直接改若依源码 | |---|---|---| | 业务代码改动 | **0 行** | ~15 个 Controller × 修改 export 方法体 | | 热插拔 / 回退 | 秒级,不停机 | 需重启 | | 治理(限流/超时/内存预算) | 内置,声明式 | 需自行实现 | | 多实现灰度共存 | 权重路由 | 不支持 | | 作用范围 | 1 个切面 + 1 个契约 + 1 个灵元 | 每个场景逐个改 Controller | --- ## 五、业务演进与灵元开发三大模式 在灵珑微内核架构体系中,针对不同业务诉求提供三大标准落地模式: > **快速选择**:存量业务增强 → 模式 1;新业务统一门面 → 模式 2;独立能力即插即用 → 模式 3。详见 [改造指南·三大模式选择指南](docs/改造指南.md#14-三大模式选择指南)。 | 维度 | 模式 1:存量业务透明接管模式 | 模式 2:新业务契约门面模式 | 模式 3:新业务自包含独立端点模式 | | :--- | :--- | :--- | :--- | | **业务定位** | 存量系统渐进式绞杀与性能增强 | 企业核心新业务、平台中台能力扩展 | 完全独立即插即用扩展能力包 | | **典型代表** | `ling-storage-*`、`ling-notice-v2`、`ling-export-fast` | `ling-sms-aliyun`(多通道短信网关) | `ling-sensitive-filter`(敏感词合规脱敏) | | **Controller 归属** | **灵核底座(原样复用,零修改)** | **灵核提供薄门面(统一鉴权与入参校验)** | **灵元内部自包含(动态挂载端点)** | | **调用与治理链路** | 灵核 AOP / `@LingReference` 动态代理 | 灵核注入 `@LingReference` 动态契约路由 | 灵珑微内核动态注册 Spring MVC 端点 | | **容灾兜底机制** | 灵核默认实现 100% 自动兜底(永不 404) | 灵核统一熔断降级与本地控制台 Provider 保底 | 卸载后端点即时注销,零内存残留 | | **核心收益** | 前端 0 感知,系统具备极限容灾兜底 | 统一安全审计与 API 规范,业务灵活多态 | 零侵入即插即用,灵核无需提前声明契约 | --- ## 六、核心演示场景 | 场景 | 对应模式 | 机制与实现 | 核心价值与治理机制 | 前端改动 | 灵核 POM 依赖 | 灵核源码改动 | | :--- | :---: | :--- | :--- | :---: | :---: | :---: | | **1. 存量业务灰度切流** | **模式 1** | 原生 `ISysNoticeService` 契约
• 灵核 `SysNoticeServiceImpl`
• 灵元 `NoticeV2ServiceImpl` | • 灵核/灵元双 Provider 双活
• 反向 Pinning 委托灵核 MyBatis 数据通道
• 动态权重分流、秒级回退与可证 GC 回收 | **0** | **0** | **0** | | **2. 文件上传云化与热插拔** | **模式 1** | 接管 `POST /common/upload`
• 阿里云 OSS 灵元
• 腾讯云 COS 灵元 | • 前端 0 感知同路由无缝接管
• 秒级多云热替换、加权双活分流
• 热卸载自动回退本地磁盘保存 | **0** | **0** | **0** | | **3. 大数据流式导出防 OOM** | **模式 1** | 接管 `POST /system/user/export`
• EasyExcel 流式导出灵元 | • 前端 0 感知同路由同参数无缝接管
• 边查边流式写出,常驻内存仅数兆
• 彻底杜绝 POI DOM 模型引发的 JVM OOM
• 热卸载自动回退原生 POI 导出 | **0** | **0** | **0** | | **4. 多通道短信与验证码网关** | **模式 2** | 灵核门面 `POST /system/sms/sendCaptcha`
• 契约 `ISysSmsService`
• 灵元 `AliyunSmsServiceImpl`
• 灵核 `DefaultLocalSmsProvider` | • 灵核统一把控 60s 防刷与 Security 鉴权
• 控制台随时加权切流或热替换短信商
• 热卸载自动平滑回退本地控制台 Provider 兜底 | **0** | **0** | **新增薄门面** | | **5. 敏感词合规检测与文本脱敏** | **模式 3** | 自包含端点 `POST /ling/filter/**`
• 灵元 `SensitiveFilterController`
• 内置 DFA 离线合规词库引擎 | • 灵核底座 0 契约、0 Controller
• 纯离线微秒级合规检测与脱敏
• 灵元加载动态挂载端点,热卸载干净注销 | **0** | **0** | **0** | 各场景的完整操作步骤与热插拔回滚见 [改造指南](docs/改造指南.md#一改造步骤)。 --- ## 七、文档索引 | 文档 | 内容 | |---|---| | [改造指南](docs/改造指南.md) | 从若依原版到灵核化的完整路径:步骤、回滚预案、监控接入、踩坑说明、FAQ | | [生产硬化清单](docs/production-hardening.md) | 生产环境配置硬化、密钥管理、上线前核验表、灵元上线流程 | --- ## 八、从零改造脚手架 若有自己的若依项目需要灵核化改造,可使用脚手架脚本快速生成底座结构: ```bash ./scripts/scaffold-lingcore.sh /path/to/RuoYi-Vue /path/to/output ``` 生成的底座包含灵核模块骨架、灵元模板、配置占位与文档指引。灵元开发完整步骤(创建模块 → 实现启动类 → 编写 `ling.yml`)见 [改造指南·灵元开发](docs/改造指南.md#13-灵元开发3-步)。