插件系统
LCGYL Framework 采用插件化架构,核心框架提供基础能力,大部分功能通过插件提供。
插件架构
设计理念
- 核心最小化:核心框架只提供 IoC、事件总线、AOP、配置管理等基础能力
- 插件化扩展:数据访问、消息队列、安全、Web 等功能都由插件提供
- 按需加载:只加载需要的插件,减少依赖和资源占用
- 独立演进:插件可以独立开发、测试、发布和升级
架构图
┌─────────────────────────────────────────────────┐
│ 应用层 (Application) │
├─────────────────────────────────────────────────┤
│ 插件层 (Plugins) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Web 插件 │ │ 数据插件 │ │ 安全插件 │ ... │
│ └──────────┘ └──────────┘ └──────────┘ │
├─────────────────────────────────────────────────┤
│ 核心框架 (Core Framework) │
│ IoC/DI | 事件总线 | AOP | 配置管理 | 插件系统 │
└─────────────────────────────────────────────────┘插件分类
数据访问插件
| 插件 | 说明 | 适用场景 |
|---|---|---|
| lcgyl-jdbc-plugin | 基础 JDBC,HikariCP 连接池 | 原生 SQL、简单查询 |
| lcgyl-jpa-plugin | JPA/Hibernate ORM | 标准 ORM、实体映射 |
| lcgyl-mybatis-plugin | MyBatis-Plus ORM | 灵活 SQL、复杂查询 |
| lcgyl-cache-plugin | 本地缓存 | 单机缓存 |
| lcgyl-redis-plugin | Redis 客户端 | 分布式缓存 |
| lcgyl-mongo-plugin | MongoDB | 文档存储 |
→ 数据访问插件对比
Web 开发插件
| 插件 | 说明 | 适用场景 |
|---|---|---|
| lcgyl-web-plugin | Web 服务器、路由、控制器 | RESTful API |
| lcgyl-web-reactive | 响应式 Web | 高并发 |
安全认证插件
| 插件 | 说明 | 适用场景 |
|---|---|---|
| lcgyl-security-core | 安全核心架构 | 基础安全 |
| lcgyl-security-jwt | JWT 认证 | 无状态认证 |
| lcgyl-security-oauth2 | OAuth2 登录 | 第三方登录 |
消息通信插件
| 插件 | 说明 | 适用场景 |
|---|---|---|
| lcgyl-mq-plugin | 消息总线 | 进程内消息 |
| lcgyl-kafka-plugin | Kafka 集成 | 高吞吐 |
| lcgyl-rabbitmq-plugin | RabbitMQ 集成 | 可靠投递 |
系统集成插件
提供任务调度、HTTP 客户端、链路追踪、限流等系统级集成能力。
| 插件 | 说明 | 适用场景 |
|---|---|---|
| lcgyl-lock-plugin | 分布式锁 | 并发控制 |
| lcgyl-script-plugin | 脚本引擎 | 动态脚本 |
| lcgyl-trace-plugin | 链路追踪 | 监控诊断 |
| lcgyl-scheduling-plugin | 任务调度 | 定时任务 v2.2.0 |
| lcgyl-http-client-plugin | 声明式HTTP客户端 | API调用 v2.2.0 |
| lcgyl-rate-limiter-plugin | 限流组件 | 流量控制 |
社区插件
由社区贡献的第三方插件,详见社区资源。
使用方式
独立使用
不依赖 Spring,使用 LCGYL Framework 的原生 IoC 容器。
适用场景:
- 新项目,从零开始
- 轻量级应用
- 微服务
- 命令行工具
优点:
- 零依赖,启动快
- 资源占用少
- 配置简单
Spring 集成
与 Spring Boot 集成,使用 Spring 的 IoC 容器。
适用场景:
- 现有 Spring 项目
- 需要 Spring 生态
- 企业级应用
优点:
- 利用 Spring 生态
- 平滑迁移
- 团队熟悉
插件生命周期
java
public interface Plugin {
// 1. 加载插件
void load();
// 2. 初始化插件
void initialize();
// 3. 启动插件
void start();
// 4. 停止插件
void stop();
// 5. 销毁插件
void destroy();
// 6. 卸载插件
void unload();
}生命周期阶段
加载 (Load)
- 加载插件类
- 扫描插件元数据
- 验证插件依赖
初始化 (Initialize)
- 注册组件
- 注册扩展点
- 加载配置
启动 (Start)
- 启动服务
- 建立连接
- 开始监听
停止 (Stop)
- 停止服务
- 关闭连接
- 释放资源
销毁 (Destroy)
- 清理缓存
- 注销组件
- 释放内存
卸载 (Unload)
- 卸载类
- 清理元数据
- 完全移除
插件元数据
每个插件都有一个 plugin.yml 描述文件:
yaml
# 插件基本信息
name: lcgyl-web-plugin
version: 1.0.0
description: Web 服务器和 RESTful API 支持
# 插件作者
author: LCGYL Team
website: https://www.lcgylfamily.cn
# 插件依赖
dependencies:
- lcgyl-framework-core: ">=1.0.0"
# 插件主类
main: com.lcgyl.plugin.web.WebPlugin
# 提供的扩展点
extensions:
- com.lcgyl.web.RequestHandler
- com.lcgyl.web.ResponseWriter
# 配置项
configuration:
server.port: 8080
server.contextPath: /插件管理
加载插件
java
// 独立使用
PluginManager pluginManager = new PluginManager();
pluginManager.loadPlugin("lcgyl-web-plugin-1.0.0.jar");
pluginManager.startPlugin("lcgyl-web-plugin");
// Spring 集成
@Configuration
@EnableLcgylPlugins({
"lcgyl-web-plugin",
"lcgyl-cache-plugin"
})
public class AppConfig {
}配置插件
properties
# 独立使用 - application.properties
plugin.web.enabled=true
plugin.web.server.port=8080
plugin.data.enabled=true
plugin.data.datasource.url=jdbc:mysql://localhost:3306/db
# Spring 集成 - application.yml
lcgyl:
plugins:
web:
enabled: true
server:
port: 8080
data:
enabled: true
datasource:
url: jdbc:mysql://localhost:3306/db插件开发
创建插件
java
public class MyPlugin implements Plugin {
private PluginContext context;
@Override
public void load() {
// 加载插件资源
}
@Override
public void initialize() {
// 注册组件
context.getContainer().register(MyService.class);
// 注册扩展点
context.registerExtension(MyExtension.class);
}
@Override
public void start() {
// 启动服务
MyService service = context.getContainer().get(MyService.class);
service.start();
}
@Override
public void stop() {
// 停止服务
}
@Override
public void destroy() {
// 清理资源
}
@Override
public void unload() {
// 卸载插件
}
}插件配置
创建 src/main/resources/plugin.yml:
yaml
name: my-plugin
version: 1.0.0
description: My custom plugin
main: com.example.MyPlugin打包插件
gradle
plugins {
id 'java'
}
jar {
manifest {
attributes(
'Plugin-Name': 'my-plugin',
'Plugin-Version': '1.0.0',
'Plugin-Main': 'com.example.MyPlugin'
)
}
}