0


EasyFile-一整套Web大文件导出解决方案。轻松导出千万以上数据

文章目录

什么是EasyFile

EasyFile-是为了提供更加便捷的文件服务,一整套Web大文件导出解决方案。可以轻松导出千万以上数据

功能特性

支持(同步、异步)导出、文件压缩、流式导出、分页导出、导出缓存复用、多组分页导出、多组流式导出、多种异步触发机制 等特性。

优化缓解导出文件时对服务的内存和CPU影响。针对文件服务可做更多的管理。

提供给开发者更加通用、快捷、统一的实现的API方案;

解决问题

1、瞬时加载数据过大导致内存飙高不够平滑机器宕机风险很大

2、生成较大文件容易出现HTTP 超时,造成导出失败

3、相同条件的导出结果无法做到复用,需要继续生成导出文件资源浪费

4、导出任务集中出现没有可监控机制

5、开发者不仅需要关心数据查询逻辑同时需要关心文件生成逻辑

6、导出耗时过长时,无法查看到执行进度

框架对比

与 Alibaba 的EasyExcel 相比,两者侧重点不同。

Alibaba EasyExcel 是一个Excel文件生成导出、导入 解析工具。

EasyFile 是一个大文件导出的解决方案。用于解决大文件导出时遇到的,文件复用,文件导出超时,内存溢出,瞬时CPU 内存飙高等等问题的一整套解决方案。 同时EasyFile 不仅可以用于Excel 文件的导出,也可以用于csv,pdf,word 等文件导出的管理(暂时需要用户自己集成基础导出下载类BaseDownloadExecutor 实现文件生成逻辑)。

而且,EasyFile和Alibaba EasyExcel 并不冲突,依然可以结合EasyExcel 使用,文件生成逻辑使用Alibaba EasyExcel 做自行拓展使用。

1、使用全量查出100w数据+EasyExcel导出(com.openquartz.easyfile.example.downloader.StudentDownloadDemoExecutor) 内存图:

在这里插入图片描述

2、使用分页导出(com.openquartz.easyfile.example.downloader.StudentPageDownloadDemoExecutor) 内存图
在这里插入图片描述

生成的文件大小比对:
在这里插入图片描述

软件架构

EasyFile 提供两种模式

  • Local模式(推荐): 需要提供本地的api 存储Mapper. 将数据存储到本地数据库中管理。
  • Remote模式:需要部署easyfile-server 服务,并设置客户端调用远程EasyFile 的域名。

代码结构

  • easyfile-common: 公共模块服务
  • easyfile-core : 核心服务
  • easyfile-metrics : metrics支持- easyfile-metrics-api : metrics-api 协议- easyfile-metrics-promethes : metrics-promethes 实现
  • easyfile-storage: 存储服务- easyfile-storage-api: 存储服务API- easyfile-storage-remote: 远程调用存储- easyfile-storage-local: 本地数据源存储
  • easyfile-spring-boot-starter: easyfile starter 包 工程module集合- easyfile-spring-boot-starter-parent: easyfile starter parent 工程- easyfile-spring-boot-starter-local: easyfile local 模式 starter工程包- easyfile-spring-boot-starter-remote: easyfile remote 模式 starter工程包
  • easyfile-server: easyfile 远程存储服务端
  • easyfile-ui: easyfile-admin ui-管理服务 (可选)
  • easyfile-example: 样例工程- easyfile-example-local: 本地储存样样例工程- easyfile-example-remote: 远程存储样例工程

时序图

在这里插入图片描述

快速开始

一、引入maven依赖

如果使用本地模式 引入maven

<dependency><groupId>com.openquartz</groupId><artifactId>easyfile-spring-boot-starter-local</artifactId><version>1.4.0</version></dependency>

如果使用remote模式引入maven 依赖

<dependency><groupId>com.openquartz</groupId><artifactId>easyfile-spring-boot-starter-remote</artifactId><version>1.4.0</version></dependency>
二、Client端需要提供文件上传服务进行实现接口
packagecom.openquartz.easyfile.storage.file;importjava.io.File;importcom.openquartz.easyfile.common.bean.Pair;/**
 * 文件上传服务
 *
 * @author svnee
 */publicinterfaceUploadService{/**
     * 文件上传
     * 如果需要重试则需要抛出 com.openquartz.easyfile.core.exception.GenerateFileException
     *
     * @param file 文件
     * @param fileName 自定义生成的文件名
     * @param appId 服务ID
     * @return key: 文件系统 --> value:返回文件URL/KEY标识符
     */Pair<String,String>upload(File file,String fileName,String appId);}

将文件上传到自己的文件存储服务

三、SpringBoot 启动入口处理

增加注解扫描

com.openquartz.easyfile.starter.annotation.EnableEasyFileAutoConfiguration

包在服务的启动入口上

例如:

/**
 * @author svnee
 **/@SpringBootApplication@EnableEasyFileAutoConfiguration@MapperScan("com.openquartz.easyfile.example.mapper")publicclassLocalExampleApplication{publicstaticvoidmain(String[] args){SpringApplication.run(LocalExampleApplication.class);}}
四、额外处理

如果是使用Local模式,需要提供Client配置

##### easyfile-local-datasource
easyfile.local.datasource.type=com.zaxxer.hikari.HikariDataSource
easyfile.local.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
easyfile.local.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
easyfile.local.datasource.username=root
easyfile.local.datasource.password=123456

需要执行SQL:

CREATETABLE ef_async_download_task
(
    id                BIGINT(20)UNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT'id',
    task_code         VARCHAR(50)NOTNULLDEFAULT''COMMENT'任务编码',
    task_desc         VARCHAR(50)NOTNULLDEFAULT''COMMENT'任务描述',
    app_id            VARCHAR(50)NOTNULLDEFAULT''COMMENT'归属系统 APP ID',
    unified_app_id    VARCHAR(50)NOTNULLDEFAULT''COMMENT'统一APP ID',
    enable_status     TINYINT(3)NOTNULLDEFAULT0COMMENT'启用状态',
    limiting_strategy VARCHAR(50)NOTNULLDEFAULT''COMMENT'限流策略',
    version           INT(10)NOTNULLDEFAULT0COMMENT'版本号',
    create_time       TIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',
    update_time       TIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'更新时间',
    create_by         VARCHAR(50)NOTNULLDEFAULT''COMMENT'创建人',
    update_by         VARCHAR(50)NOTNULLDEFAULT''COMMENT'更新人',
    is_deleted        BIGINT(20)NOTNULLDEFAULT0COMMENT'是否删除',PRIMARYKEY(id),UNIQUEKEY`uniq_app_id_task_code`(`task_code`,`app_id`)USINGBTREE)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 COMMENT'异步下载任务';CREATETABLE ef_async_download_record
(
    id                    BIGINT(20)UNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT'id',
    download_task_id      BIGINT(20)NOTNULLDEFAULT0COMMENT'下载任务ID',
    app_id                VARCHAR(50)NOTNULLDEFAULT''COMMENT'app ID',
    download_code         VARCHAR(50)NOTNULLDEFAULT''COMMENT'下载code',
    upload_status         VARCHAR(50)NOTNULLDEFAULT''COMMENT'上传状态',
    file_url              VARCHAR(512)NOTNULLDEFAULT''COMMENT'文件路径',
    file_system           VARCHAR(50)NOTNULLDEFAULT''COMMENT'文件所在系统',
    download_operate_by   VARCHAR(50)NOTNULLDEFAULT''COMMENT'下载操作人',
    download_operate_name VARCHAR(50)NOTNULLDEFAULT''COMMENT'下载操作人',
    remark                VARCHAR(50)NOTNULLDEFAULT''COMMENT'备注',
    notify_enable_status  TINYINT(3)NOTNULLDEFAULT0COMMENT'通知启用状态',
    notify_email          VARCHAR(50)NOTNULLDEFAULT''COMMENT'通知有效',
    max_server_retry      TINYINT(3)NOTNULLDEFAULT0COMMENT'最大服务重试',
    current_retry         TINYINT(3)NOTNULLDEFAULT0COMMENT'当前重试次数',
    execute_param         TEXTNULLCOMMENT'重试执行参数',
    error_msg             VARCHAR(256)NOTNULLDEFAULT''COMMENT'异常信息',
    last_execute_time     DATETIMENULLCOMMENT'最新执行时间',
    invalid_time          DATETIMENULLCOMMENT'链接失效时间',
    download_num          TINYINT(3)NOTNULLDEFAULT0COMMENT'下载次数',
    execute_process       TINYINT(3)NOTNULLDEFAULT0COMMENT'执行进度',
    version               INT(10)NOTNULLDEFAULT0COMMENT'版本号',
    create_time           TIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',
    update_time           TIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'更新时间',
    create_by             VARCHAR(50)NOTNULLDEFAULT''COMMENT'创建人',
    update_by             VARCHAR(50)NOTNULLDEFAULT''COMMENT'更新人',PRIMARYKEY(id),KEY`idx_download_operate_by`(`download_operate_by`)USINGBTREE,KEY`idx_operator_record`(`download_operate_by`,`app_id`,`create_time`),KEY`idx_upload_invalid`(`upload_status`,`invalid_time`,`id`),KEY`idx_create_time`(`create_time`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 COMMENT'异步下载记录';

如果是使用remote服务,需要部署easyfile-server 服务,Client提供配置

#### easyfile-storage-remote
easyfile.remote.username=example
easyfile.remote.password=example
easyfile.remote.server-addr=127.0.0.1:8080
easyfile.remote.namespace=remote-example
五、异步文件处理器

异步文件处理器配置

六、实现下载器

下载器

七、Admin-管理界面

EasyFile 提供了一个简单的Admin管理界面(@since 1.2.0)。 如需开启需要引入maven

<dependency><groupId>com.openquartz</groupId><artifactId>easyfile-ui</artifactId><version>1.2.0</version></dependency>

服务监控路径地址为: ip+port/easyfile-ui/ 例如:

localhost:8080/easyfile-ui/

服务默认Admin用户账户密码为:

admin / admin

如果需要更改可以配置:

easyfile.ui.admin.username=admin
easyfile.ui.admin.password=admin

EasyFile UI 管理界面

在这里插入图片描述

八、easyfile-server 部署

如果使用Remote模式时,需要部署easyfile-server服务;

否则不需要进行部署

1、执行存储DB SQL
2、部署服务


本文转载自: https://blog.csdn.net/qq_35385687/article/details/142462707
版权归原作者 阳宗德 所有, 如有侵权,请联系我们删除。

“EasyFile-一整套Web大文件导出解决方案。轻松导出千万以上数据”的评论:

还没有评论