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

文章目录

    • 什么是EasyFile
    • 功能特性
    • 解决问题
    • 框架对比
    • 软件架构
      • 代码结构
    • 时序图
    • 快速开始
        • 一、引入maven依赖
        • 二、Client端需要提供文件上传服务进行实现接口
        • 三、SpringBoot 启动入口处理
        • 四、额外处理
        • 五、异步文件处理器
        • 六、实现下载器
        • 七、Admin-管理界面
        • 八、easyfile-server 部署

什么是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端需要提供文件上传服务进行实现接口
package com.openquartz.easyfile.storage.file;import java.io.File;
import com.openquartz.easyfile.common.bean.Pair;/*** 文件上传服务** @author svnee*/
public interface UploadService {/*** 文件上传* 如果需要重试则需要抛出 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")
public class LocalExampleApplication {public static void main(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:

CREATE TABLE ef_async_download_task
(id                BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',task_code         VARCHAR(50) NOT NULL DEFAULT '' COMMENT '任务编码',task_desc         VARCHAR(50) NOT NULL DEFAULT '' COMMENT '任务描述',app_id            VARCHAR(50) NOT NULL DEFAULT '' COMMENT '归属系统 APP ID',unified_app_id    VARCHAR(50) NOT NULL DEFAULT '' COMMENT '统一APP ID',enable_status     TINYINT (3) NOT NULL DEFAULT 0 COMMENT '启用状态',limiting_strategy VARCHAR(50) NOT NULL DEFAULT '' COMMENT '限流策略',version           INT (10) NOT NULL DEFAULT 0 COMMENT '版本号',create_time       TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',update_time       TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',create_by         VARCHAR(50) NOT NULL DEFAULT '' COMMENT '创建人',update_by         VARCHAR(50) NOT NULL DEFAULT '' COMMENT '更新人',is_deleted        BIGINT (20) NOT NULL DEFAULT 0 COMMENT '是否删除',PRIMARY KEY (id),UNIQUE KEY `uniq_app_id_task_code` (`task_code`,`app_id`) USING BTREE
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '异步下载任务';CREATE TABLE ef_async_download_record
(id                    BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',download_task_id      BIGINT (20) NOT NULL DEFAULT 0 COMMENT '下载任务ID',app_id                VARCHAR(50)  NOT NULL DEFAULT '' COMMENT 'app ID',download_code         VARCHAR(50)  NOT NULL DEFAULT '' COMMENT '下载code',upload_status         VARCHAR(50)  NOT NULL DEFAULT '' COMMENT '上传状态',file_url              VARCHAR(512) NOT NULL DEFAULT '' COMMENT '文件路径',file_system           VARCHAR(50)  NOT NULL DEFAULT '' COMMENT '文件所在系统',download_operate_by   VARCHAR(50)  NOT NULL DEFAULT '' COMMENT '下载操作人',download_operate_name VARCHAR(50)  NOT NULL DEFAULT '' COMMENT '下载操作人',remark                VARCHAR(50)  NOT NULL DEFAULT '' COMMENT '备注',notify_enable_status  TINYINT (3) NOT NULL DEFAULT 0 COMMENT '通知启用状态',notify_email          VARCHAR(50)  NOT NULL DEFAULT '' COMMENT '通知有效',max_server_retry      TINYINT(3) NOT NULL DEFAULT 0 COMMENT '最大服务重试',current_retry         TINYINT(3) NOT NULL DEFAULT 0 COMMENT '当前重试次数',execute_param         TEXT NULL COMMENT '重试执行参数',error_msg             VARCHAR(256) NOT NULL DEFAULT '' COMMENT '异常信息',last_execute_time     DATETIME NULL COMMENT '最新执行时间',invalid_time          DATETIME NULL COMMENT '链接失效时间',download_num          TINYINT(3) NOT NULL DEFAULT 0 COMMENT '下载次数',execute_process       TINYINT(3) NOT NULL DEFAULT 0 COMMENT '执行进度',version               INT (10) NOT NULL DEFAULT 0 COMMENT '版本号',create_time           TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',update_time           TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',create_by             VARCHAR(50)  NOT NULL DEFAULT '' COMMENT '创建人',update_by             VARCHAR(50)  NOT NULL DEFAULT '' COMMENT '更新人',PRIMARY KEY (id),KEY                   `idx_download_operate_by` (`download_operate_by`) USING BTREE,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=InnoDB DEFAULT CHARSET=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、部署服务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147963.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

美业SaaS收银系统如何收银?博弈美业实操/美业门店管理系统源码

1.打开博弈美业APP 2.工作台上方的【收银台】、【扫码核销】、【密码核销】均可完成收银 3.【收银台】可直接选择商品/服务/课程&#xff0c;再选择客户后提交订单收款 4.【扫码核销】【密码核销】可直接扫描二维码、输入核销码进行收银

模型结构-qwen原理

1. 背景 本文将以Qwen2系列大模型为基础,讲解Qwen2模型技术架构及模型原理。 2. 编码 词表的设计可以影响训练的效率和下游任务的表现。Qwen系列模型采用的是tiktoken分词器,这是一种快速分词方法,该方法被使用在OpenAI系列模型中,tiktoen的核心逻辑同样是基于BPE算法,…

YOLOv5-水印检测

简介&#xff1a; YOLOv5在YOLOv4算法的基础上做了进一步的改进&#xff0c;检测性能得到进一步的提升。虽然YOLOv5算法并没有与YOLOv4算法进行性能比较与分析&#xff0c;但是YOLOv5在COCO数据集上面的测试效果还是挺不错的。 YOLOv5是一种单阶段目标检测算法&#xff0c;该算…

内网私有化聊天软件:哪些企业类型最受益?

在数字化时代&#xff0c;企业内部通讯的效率和安全性成为了企业运营中不可或缺的一环。随着数据泄露事件频发和隐私保护意识的增强&#xff0c;越来越多的企业开始寻求更加安全、可控的通讯解决方案。内网部署的私有化聊天软件&#xff0c;以其高度的安全性、定制化特性和自主…

甩锅笔记:好好的服务端应用突然起不来,经定位是无法访问外网了?测试又说没改网络配置,该如何定位?

在工作中、团队协作时&#xff0c;可能遇到的问题&#xff0c;如集成测试等场景。但是作为偏前端的全栈&#xff0c;锅从天上来&#xff0c;不是你想甩就能甩&#xff0c;尤其面对测试等比较强势的团体&#xff08;bug创造者&#xff09;&#xff0c;你必须有强大的心理承受能力…

C++ STL容器(二) —— list 底层剖析

计划写几篇关于C STL容器底层剖析的文章&#xff0c;主要基于的是MSVC的实现&#xff0c;本篇先从比较简单的 list 入手&#xff0c;个人感觉文章更偏于代码的具体实现&#xff0c;而不是原理的讲解&#xff0c;所以前置需要你了解链表的相关算法&#xff0c;如果有问题欢迎评论…

长方形+ 下三角形的图形 css

<div class"transform">42.48%</div>//转化.transform {position: relative;width: 70px;height: 26px;background-color: #dcdfe6; /* 长方形的颜色 */display: flex;justify-content: center;align-items: center;font-family: PingFangTC-Medium;font…

Keil5 操作

目录 1.Debug&#xff08;软件模拟调试&#xff1a;&#xff09;&#xff1a; 2.代码提示设置&#xff1a; 3.添加. c与.h文件&#xff1a; 常用技巧 安装下载推荐&#xff1a;正点原子 1.Debug&#xff08;软件模拟调试&#xff1a;&#xff09;&#xff1a; 文章讲解 …

Selenium自动化安装教程

目录 提示&#xff1a; 一、安装Python运行环境 1. 找到官方网站 ​编辑 2. 找到下载页面 3. 双击安装包 ​编辑 4. 运行 hello world 二、安装 pycharm 1. 找到官方网站 ​编辑 2. 找到下载页面 3. 双击安装包 4. 运行 hello world 5. 字体设置 三、Python管理…

JavaWeb--小白笔记07:servlet对表单数据的简单处理

这里的servlet对表单数据的处理是指使用IDEA创建web工程&#xff0c;再创建html和class文件进行连接&#xff0c;实现html创建一个表单网页&#xff0c;我们对网页中的表单进行填充&#xff0c;可以通过class文件得到网页我们填充的内容进行打印到控制台。 一登录系统页面---h…

查找和排序(选择题)

查找 寻找最大/小项 n-1 排序 前三个的时间复杂度都是O(n^2),希尔排序是O(n^1.5). 在以上排序方法中&#xff0c;最坏情况下时间复杂度最小的是堆排序。 每经过一次元素的交换会产生新的逆序的是快速排序。

为什么越来越多的网工运维转行网络安全?_idc运维转网络安全工程师_系统运维转行网安

最近越来越多的网工运维小伙伴都在吐槽&#xff1a;干网工、运维多年&#xff0c;薪资还是5.6K&#xff0c;技术也遇瓶颈上不去&#xff0c;考虑转岗或者转行。其中大部分的网工运维小伙伴们纷纷瞄准了高薪高前景的网络安全工程师岗位 网络安全是怎样的岗位&#xff1f; 网络安…

2024重组胶原蛋白行业白皮书:从美业革新先锋到精准医疗动力源

从来源上看&#xff0c;胶原蛋白主要分为动物源胶原蛋白和重组胶原蛋白两大类。重组胶原蛋白相较于传统动物来源的胶原蛋白在生物活性、生物相容性、低免疫原性、降低漏检病原体风险、水溶性、无细胞毒性等方面表现出诸多优越性。随着胶原蛋白的来源和生产方式不断演变&#xf…

改进的yolov10 deepsort目标跟踪(yolo改进+最新算法+附代码和教程)

YOLOv10_DeepSORT&#xff1a;视频中的对象检测与跟踪 本仓库包含了使用YOLOv10对象检测模型和DeepSORT算法在视频中进行对象检测与跟踪的代码。YOLOv10是目前最先进的对象检测模型之一&#xff0c;而DeepSORT是一种基于深度学习的对象跟踪算法&#xff0c;它结合了外观信息和…

BOE(京东方)携故宫博物院举办2024“照亮成长路”公益项目落地仪式以创新科技赋能教育可持续发展

2024年9月20日&#xff0c;BOE&#xff08;京东方&#xff09;“照亮成长路”智慧教室落成暨百堂故宫传统文化公益课山西活动落地仪式在山西省太原市娄烦县实验小学隆重举行。自“照亮成长路”教育公益项目正式设立以来&#xff0c;BOE&#xff08;京东方&#xff09;持续以创新…

jenkins分布式构建

Jenkins分布式构建是一种将构建任务分散到多个机器上的方法&#xff0c;以提高构建效率和并行处理能力 1. 架构 主节点&#xff08;Master&#xff09;&#xff1a;负责管理构建任务、调度和监控所有从节点。从节点&#xff08;Slave&#xff09;&#xff1a;实际执行构建任务…

文件防泄漏方法有哪些|6个方法有效防止文件泄密

文件防泄漏是企业和组织保护其敏感信息和核心资产的重要手段。 以下是六个有效防止文件泄密的方法&#xff1a; 1. 文件加密 透明加密&#xff1a;使用专业的防泄密软件&#xff0c;如安企神等&#xff0c;对敏感文件进行透明加密处理。 这种加密方式在用户创建、编辑和保存…

DPDK 简易应用开发之路 4:基于Pipeline模型的DNS服务器

本机环境为 Ubuntu20.04 &#xff0c;dpdk-stable-20.11.10 使用scapy和wireshark发包抓包分析结果 完整代码见&#xff1a;github Pipeline模型 DPDK Pipeline模型是基于Data Plane Development Kit&#xff08;DPDK&#xff09;的高性能数据包处理框架。它通过将数据流分为多…

力扣46.全排列

一、题目 二、代码 class Solution {int[] nums;List<List<Integer>> ans new ArrayList<>();List<Integer> path new ArrayList<>();boolean[] onPath;public List<List<Integer>> permute(int[] nums) {this.nums nums;int n …

【GUI设计】基于图像分割的GUI系统(3),matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Matlab的图像处理GUI系统&#xff08;3&#xff09;&#xff0c;用matlab实现。…