Skip to content

插件系统

LCGYL Framework 采用插件化架构,核心框架提供基础能力,大部分功能通过插件提供。

插件架构

设计理念

  • 核心最小化:核心框架只提供 IoC、事件总线、AOP、配置管理等基础能力
  • 插件化扩展:数据访问、消息队列、安全、Web 等功能都由插件提供
  • 按需加载:只加载需要的插件,减少依赖和资源占用
  • 独立演进:插件可以独立开发、测试、发布和升级

架构图

┌─────────────────────────────────────────────────┐
│              应用层 (Application)                │
├─────────────────────────────────────────────────┤
│                  插件层 (Plugins)                │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐        │
│  │ Web 插件 │ │ 数据插件 │ │ 安全插件 │  ...   │
│  └──────────┘ └──────────┘ └──────────┘        │
├─────────────────────────────────────────────────┤
│            核心框架 (Core Framework)             │
│  IoC/DI | 事件总线 | AOP | 配置管理 | 插件系统  │
└─────────────────────────────────────────────────┘

插件分类

数据访问插件

插件说明适用场景
lcgyl-jdbc-plugin基础 JDBC,HikariCP 连接池原生 SQL、简单查询
lcgyl-jpa-pluginJPA/Hibernate ORM标准 ORM、实体映射
lcgyl-mybatis-pluginMyBatis-Plus ORM灵活 SQL、复杂查询
lcgyl-cache-plugin本地缓存单机缓存
lcgyl-redis-pluginRedis 客户端分布式缓存
lcgyl-mongo-pluginMongoDB文档存储

数据访问插件对比

Web 开发插件

插件说明适用场景
lcgyl-web-pluginWeb 服务器、路由、控制器RESTful API
lcgyl-web-reactive响应式 Web高并发

安全认证插件

插件说明适用场景
lcgyl-security-core安全核心架构基础安全
lcgyl-security-jwtJWT 认证无状态认证
lcgyl-security-oauth2OAuth2 登录第三方登录

消息通信插件

插件说明适用场景
lcgyl-mq-plugin消息总线进程内消息
lcgyl-kafka-pluginKafka 集成高吞吐
lcgyl-rabbitmq-pluginRabbitMQ 集成可靠投递

系统集成插件

提供任务调度、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();
}

生命周期阶段

  1. 加载 (Load)

    • 加载插件类
    • 扫描插件元数据
    • 验证插件依赖
  2. 初始化 (Initialize)

    • 注册组件
    • 注册扩展点
    • 加载配置
  3. 启动 (Start)

    • 启动服务
    • 建立连接
    • 开始监听
  4. 停止 (Stop)

    • 停止服务
    • 关闭连接
    • 释放资源
  5. 销毁 (Destroy)

    • 清理缓存
    • 注销组件
    • 释放内存
  6. 卸载 (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'
        )
    }
}

下一步

Released under the Apache License 2.0