概述
统一数据访问中间件hulk是sumslack团队开发的中间件,支持SQL访问和查询,包括但不限于oracle和neo4j,mysql,eclasticsearch,redis,clickhouse,excel等中间件数据可以在navicat等mysql客户端工具中浏览控制数据。
使用场景
•用数据浏览器浏览监控异构数据•分库分表•许多异构动态数据源需要在项目中引入•非开发人员提取异构数据
技术实现
•sql解析
对于所有的持久层操作,应用层不需要关心底层持久层的应用程序,需要使用SQL来添加、删除和检查,以阻止底层的复杂性。并支持它自定义函数、聚合函数、表达式等待,以尽可能灵活简单的方式访问数据。
•打开mysql协议
jdbc到mysql的协议通信交互是基于netty5模拟的,可以直接用mysql命令行,navicat、jdbc进行连接操作。尽量减少连接的复杂性,使程序更顺利地完成底层迁移,应用程序只能通过mysql的jdbc访问任何数据源。
•异库异源关联查询
底层采用aviator表达式结合java完成不同表之间的关联查询,目前支持left join和inner join操作。在这些应用场景中,查询数据的复杂性将大大降低。
•读写分离
一写多读的数据源配置可以在底层进行,提高读写效率。
•内存管理
参考flink的内存管理,将数据序列化后写入内存,减少内存碎片,用kroy代替jdk本身的序列框架,提高序列效率,用snappy压缩内存,减少内存消耗。当内存不能使用时,它将被写入磁盘。降低了OOM的风险。
•分库分表
配置按一定字段分库分表,提供多种hash策略,屏蔽分库分表后应用层的复杂操作。提高大数据量时数据写入读取的效率。并支持分库分表后的表进行上述关联和权限操作。
•权限管理
支持对表字段级别控制权限,隔离用户,隔离不同用户角色,防止误操作,提高写入安全性。目前支持administrator、ordinary_user、guest用户角色,隔离不同用户的权限。
•SQL扩展和自定义函数
提供基于calcite的sql扩展和基于aviator的自定义函数扩展。用户可以通过自定义sql完成一系列希望操作,如etl写入、本地sql查询、定时器查询数据等,aviator函数提供etl灵活性,一些复杂的业务逻辑操作只能通过sql完成。
navicat支持特性
•自动提示代码
es数据支持查询对象和对象字段的自动提示,如下图所示:
在neo4j中查询以下节点数据,并提示查询字段:
•跨异构数据跨表关联查询
可将mysql表与es索引进行关联查询,也可在mysql的异库进行关联,支持自定义函数,如下:
SELECT t1.*, t2.*, idGenerator() as new_idFROM test_canal.库1表1 AS t1 INNER JOIN gjk_eform.库2表2 AS t2 ON t1.Bond_Key = t2.Bond_Key AND t1.create_date > 2022-12-30 16:29:41:00 where t1.Bond_Key=xxx or t2.File_Name=yyyy•导入导出异构数据 以下数据是将mysql数据导出到excel中:
flush to test_excel index test_excel MAPPER as SELECT t1.Bond_Key, t1.Bond_ID, t1.Short_Name, t2.File_Name FROM test_canal.bond_fundamental_info AS t1 INNER JOIN gjk_eform.bond_fundamental_info_files AS t2 ON t1.Bond_Key = t2.Bond_Key AND t1.create_date > 2022-12-30 16:29:41:00 where t1.Bond_Key=N000342023 or t2.File_Name=常州金陵投资集团有限公司2023年第一期超短期融资券募集说明书•分库分表配置
<partition partitionColumn=”trace_id” mod=”long-mod” dsName=”test_par” priKeyColumn=”id” table=”example_par” type=”mysql”> <table prefix=”example_par_” range=”[0,10)” dsName=”test_canal”></table> <table prefix=”example_par_” range=”[0,10)” dsName=”test_report”></table> </partition>无感知程序端控制数据:
public static void main(String[] args) throws SQLException { Connection connection = DriverManager.getConnection(“jdbc:mysql://localhost:1112/test_par?useServerPrepStmts=true”, “dev”, “123456”); String sql = “insert into example_par(name,trace_id) values(,)””; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, “hhh”); preparedStatement.setString(2, “1111”); preparedStatement.executeUpdate(); }•控制字段级别的权限
以下:test00表inputer字段不允许修改,即使DML对此字段进行了修改,也只能进行INSERT操作,test_int表允许添加和删除,但不允许操纵t_2字段。
<user role=”ORDINARY_USER”> <username>dev</username> <password><![CDATA[123456]]></password> <schema dsName=”test_par” isAllAllow=”true”> <table table=“test00” filterFields=”inputer” dmlAllowMethods=”INSERT”></table> <table table=”test_int” filterFields=”t_2″ dmlAllowMethods=”INSERT,UPDATE,DELETE”></table> </schema> </user>我们正在努力开发、改造和推广这个项目,希望在不久的将来能在github上与您见面。
推荐阅读
•基于Paddlenlp模拟火出圈的ChatGPT•基于VSCode的数据开发平台的设计和实现•微信实时采集和微信机器人的实现•MySQL数据闪回使用binlog进行•NLP — 文本分类和BIO实体标记•异地异构数据同步传输平台的设计与实现•去除各种形状的印章
欢迎关注我的微信官方账号“Sumslack第一时间推送原创技术文章。
