乐于分享
好东西不私藏

插件化BI平台:数据源、图表组件随便加,不用改核心代码

插件化BI平台:数据源、图表组件随便加,不用改核心代码

前言

想快速搭个报表看看业务情况,结果卡在数据接入这一关就耗了半天。各种数据源驱动版本不兼容、连接池配置一头雾水、想查个 S3 上的文件还得先写一堆 ETL 脚本——这些都算不上什么高深技术难题,但就是特别磨人。

这篇文章会从使用角度出发,聊一聊这个一站式大数据分析平台到底能做什么、怎么做的、以及实际用起来是什么样子。感兴趣的朋友可以直接拉到文末看源码。

项目介绍

DataVerge 是一站式大数据分析平台,覆盖了从数据接入、准备、建模、分析到展示的完整链路。项目采用插件化架构作为核心设计理念,仪表盘组件、字段类型、数据库驱动都可以独立扩展,既满足开箱即用,也允许按需定制。

平台的定位很明确——帮助中小团队、个人开发者、企业内部数据组快速搭建自助式 BI 环境。目前项目已经在实际生产环境中使用,每天承担着不少查询和分析任务。

在线演示环境:http://bi.dataverge.com.cn (域名备案中,暂时无法访问)

 账号密码:admin / admin123 

注意:每天 0 点会自动重置数据

项目功能

功能模块
包含内容
简要说明
数据连接
多类型数据源接入
支持 MySQL、Oracle、SQL Server、PostgreSQL 等主流数据库
S3DuckDb 自研驱动
自定义 JDBC 协议 jdbc:s3:duckdb://,DuckDB 嵌入 JVM 直查 S3 对象存储
本地文件上传
Excel / CSV / TXT 上传至数据采集空间,零 ETL 即可查询
连接池管理
HikariCP 按数据源建池,熔断器全局阻断,驱动 ClassLoader 隔离
安全防护
JDBC URL 危险参数拦截、JNDI 注入防护、SPI 认证策略
自定义驱动目录
驱动按目录放在 ./dynamic-drivers 下,无需重启自动检测
映射管理
添加表映射关系,自动检测表字段名称和类型
数据准备
原生 SQL 数据集
在线编写 SQL、参数化、保存为可复用数据集
数据模型
字段类型推断、业务字段标注、计算列、节点关系建模
分析展现
快速分析
基于 SQL 数据集或数据源表快速展示数据,适合临时取数
数据面板
驾驶舱、仪表盘、大屏拖拽设计,支持组件插件化扩展
电子表格(规划中)
类 Excel 设计器,用于数据展示与数据填报
公共资源
数据字典
字段含义、负责人、版本管理,统一业务口径
数据格式
金额、日期、百分比等格式化规则统一管理
数据脱敏
敏感字段脱敏规则配置,保障数据安全
资源权限
RBAC 权限控制
基于角色的菜单、按钮、数据权限控制

项目特点

插件化架构:仪表盘组件、字段类型、数据库驱动均可独立扩展,不改动核心代码就能新增能力

零 ETL 直查 S3:通过自研 S3DuckDb 驱动,本地文件上传后无需清洗转换,直接用 SQL 查询 S3 上的文件,省去繁琐的数据导入流程

安全防护层层加固:从驱动加载隔离、JDBC 危险参数拦截到 JNDI 注入防护,每个环节都做了针对性处理,避免因添加数据源引入安全风险

连接池按用户隔离:每个用户独立维护连接池,避免相互影响,同时熔断器在异常情况下快速失败,防止故障蔓延

自定义驱动热加载:项目启动后会自动生成 dynamic-drivers 目录,把驱动 jar 包放进对应文件夹就能用,不用重启服务

灵活的数据集管理:原生 SQL 数据集支持参数化查询,保存后可在多个仪表盘复用,一处修改处处生效

数据口径统一管理:数据字典、数据格式、脱敏规则集中配置,保证整个平台对同一字段的理解是一致的

项目技术

技术栈
选型
说明
后端框架
Spring Boot 2.x
稳定版本,生态成熟
查询引擎
DuckDB + Calcite
DuckDB 嵌入 JVM 做分析计算,Calcite 做 SQL 解析和优化
连接池
HikariCP
高性能 JDBC 连接池,按数据源独立建池
对象存储
MinIO / S3 兼容
默认 MinIO,可切换任意 S3 兼容平台
前端框架
React + TypeScript
组件化开发,类型安全
可视化
ECharts + G2
图表渲染引擎,支持插件化扩展
拖拽布局
react-grid-layout
仪表盘拖拽设计
权限框架
Spring Security + RBAC
基于角色的访问控制
动态加载
自定义 ClassLoader
驱动包隔离加载,避免类冲突

项目代码

S3DuckDb 驱动核心

自定义 JDBC 驱动,让 DuckDB 能够直接查询 S3 上的 Parquet 文件:

publicclassS3DuckDbDriverimplementsDriver{privatestaticfinal String URL_PREFIX = "jdbc:s3:duckdb://";@Overridepublic Connection connect(String url, Properties info)throws SQLException {// 解析 S3 路径:jdbc:s3:duckdb://bucket/path/to/file.parquet        S3Path s3Path = parseS3Url(url);// 初始化 DuckDB 连接        DuckDBConnection duckConn = DuckDBDriver.connect("jdbc:duckdb:", info        );// 挂载 S3 文件为 DuckDB 外部表        duckConn.createStatement().execute(            String.format("CREATE OR REPLACE VIEW %s AS " +"SELECT * FROM parquet_scan('%s')"            s3Path.getTableName(),             s3Path.getS3Url())        );returnnew S3DuckDbConnection(duckConn, s3Path);    }}

动态驱动加载器

驱动热加载的核心实现,监听目录变化自动加载新驱动:

@ComponentpublicclassDynamicDriverLoader{privatestaticfinal String DRIVER_BASE_PATH = "./dynamic-drivers";privatefinal Map<String, ClassLoader> driverClassLoaders = new ConcurrentHashMap<>();@PostConstructpublicvoidinit(){        createBaseDirectory();        scanAndLoadDrivers();        startDirectoryWatcher();    }privatevoidloadDriverFromDirectory(String driverName, File driverDir){        File[] jars = driverDir.listFiles((d, name) -> name.endsWith(".jar"));if (jars == null || jars.length == 0return;// 创建隔离的 ClassLoader        URL[] urls = Arrays.stream(jars)            .map(this::toURL)            .toArray(URL[]::new);        ClassLoader isolatedLoader = new URLClassLoader(urls,             Thread.currentThread().getContextClassLoader());// 查找驱动类并注册        ServiceLoader<Driver> drivers = ServiceLoader.load(Driver.classisolatedLoader);for (Driver driver : drivers) {            DriverManager.registerDriver(new DriverProxy(driver));        }        driverClassLoaders.put(driverName, isolatedLoader);    }}

熔断器实现

使用滑动窗口统计失败率,自动熔断保护:

publicclassCircuitBreaker{privatefinal SlidingWindowCounter counter = new SlidingWindowCounter(60);privatevolatile State state = State.CLOSED;privatefinaldouble failureRateThreshold = 0.5;privatefinalint minCallsRequired = 10;publicsynchronizedbooleanallowCall(){if (state == State.OPEN) {if (System.currentTimeMillis() - openTime > timeoutMs) {                state = State.HALF_OPEN;returntrue;            }returnfalse;        }returntrue;    }publicsynchronizedvoidrecordSuccess(){        counter.recordSuccess();if (state == State.HALF_OPEN) {            state = State.CLOSED;        }    }publicsynchronizedvoidrecordFailure(){        counter.recordFailure();if (state == State.HALF_OPEN) {            state = State.OPEN;            openTime = System.currentTimeMillis();return;        }if (state == State.CLOSED && counter.getTotalCalls() >= minCallsRequired) {double rate = counter.getFailureRate();if (rate >= failureRateThreshold) {                state = State.OPEN;                openTime = System.currentTimeMillis();            }        }    }}

项目效果

数据源管理

数据源连接配置界面,支持多种数据源类型,可以添加表映射关系,自动检测字段信息:

数据面板(仪表盘)

拖拽式仪表盘设计界面,组件可自由布局,支持多种图表类型和交互筛选:

原生 SQL 数据集

在线编写 SQL,支持参数化查询,保存后可被多个仪表盘复用:

项目源码

Gitee:https://gitee.com/DataVerge/data-verge-web

总结

DataVerge 是一套完整的大数据分析平台解决方案,从数据接入到展示的每个环节都做了工程化落地的考量。插件化的架构设计让扩展变得简单,自研的 S3DuckDb 驱动解决了 S3 数据直查的痛点,完善的安全和连接池管理保障了生产环境可用性。

如果你正需要一套能快速部署、灵活扩展的 BI 工具,或者对 DuckDB + S3 的查询方案感兴趣,这个项目应该能给你一些参考价值。

关键词

#数据接入#数据建模、数据分析、数据展示、#插件化架构、S3DuckDb、零ETL、连接池治理、熔断器、#动态驱动加载#RBAC权限、数据脱敏、#仪表盘、DuckDB、Calcite、自助式BI

作者:小码编匠

出处:gitee.com/smallcore/DotNetCore

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

END
Vue 3 + ECharts 搭建 YOLOv8 检测数据可视化大屏
Python + YOLOv5 搭建火焰检测与预警系统
Vue 3 + Tailwind CSS v4 后台管理系统模板(五种布局随意切换)
一套企业级的 RWA + AI 的Saas 应用平台
新一代企业级 AI 应用开发与编排平台(零代码构建智能体)
从拖拉拽到打印输出,一套 Web 打印服务解决方案
Vue 3 + Vite + Avue 搭建企业级大屏可视化方案
不想从头搭后台?这套开源免费可商用的 Java 后台管理系统了解一下
一款模块化的通用后端运行时框架
一款开源图像标注与模型训练工具
Vue3 开发的 Material 风格移动端组件库
开箱即用一款无授权费、可商用的中后台快速开发框架
一个入门简单、跨平台、企业级桌面软件开发框架
AI 大模型 + Asterisk 通信引擎构建的新一代智能客服呼叫中心系统
一款基于React生态的大屏数据可视化设计器
基于 React + FastAPI + 百炼大模型的智能运维诊断平台
一款开源企业级别的中后台管理系统
开源的快速开发平台(快速开发骨架 / 通用后台管理系统 / 完善的前后端代码)
JSON存储+拖拽设计,这款工作流引擎有点东西
微服务权限系统:Spring Cloud + React 19 的 RBAC 实践
企业后台、SaaS 管理端、数据可视化平台和内部低代码工具的中后台框架
面向企业后台、SaaS 管理端、数据可视化平台和内部低代码工具的中后台框架
一款面向数字化场景的可视化流程编排与数据交换平台
Vue 前后端分离的企业办公 OA 审批管理系统
接入 AI 辅助后,后台管理平台开发到底省了哪些事?
备注【开源

方便大家交流、资源共享和共同成长

纯技术交流群、需要的小伙伴请扫码

有收获?不妨分享让更多人受益

关注「程序员开源栈」,共同提升技术实力

点分享
点收藏
点在看
点点赞