公司有个数据采集的共享库,对应着一个数据中心的项目,每次业务方有数据查询的需求,都需要投入开发同学做SQL查询,提供接口和数据,调试和发布项目,一顿操作下来,耗时费力,伸缩性极差。
data-center是一个能实现任意sql(动态/静态)执行、统一管理、异常监控的数据查询中台项目。 它真正做到了无需数据中心项目投入人力参与到业务方需求,业务方同学只需在后台录入SQL拿到sqlId,就可以使用dubbo进行调用。
项目核心功能:
- SQL管理
- 统一RPC接口
- 监控告警
- 权限管理
- 报表统计
假设下面的sql需要根据parentId和name动态查询,其中parent_id和name有值传递过来就参与查询,否则不查询
SELECT * from unit_info where and parent_id = #{parentId} and name = #{name};
那么需要在数据中心配置下面的sql模板:
SELECT * from unit_info where 1=1 <#if parentId??>and parent_id = #{parentId}</#if> <#if name?? && name != ''>and name = #{name}</#if>
接下来业务方通过Dubbo调用了数据中心的RPC接口,并传递了参数parentId=1,最终sql被解析并被mybatis执行。
SELECT * from unit_info where 1=1 and parent_id = 1
- data-center-admin 管理员后台 部署形式:war
- data-center-service 提供业务接口 部署形式war
- data-center-client 封装接口给业务方 部署形式jar
- script sql脚本
- 业务方申请应用,得到appId
- 配置sql,包含sqltext、是否分页、表字段映射,系统自带校验和测试功能。
- 业务方集成数据中心client jar,配置duboo接口,调用api并传递对应参数
- 数据中心响应请求,异步记录此次调用信息。
供业务方进行sql模板的配置(如果动态条件则需要使用freemarker编写sql模板) 、sql的模拟测试、上下架管理等功能。
支持2种形式的告警:ERROR_COUNT以及SLOW_COUNT。系统通过定时扫描,对符合条件的查询以邮件的形式发送到用户或组。
数据中心会记录每次的调用请求,为日后报表统计类业务做铺垫。同时Admin后台也将以图形的方式展现部分维度下的Top调用量情况。
- 用户组与用户间的关系 —— 用于告警发送邮件以及SQL管理权限的判定
- 用户组与应用的关系 —— 用于告警发送邮件
- 应用与sql间的关系 —— 用于应用方调用权限的判定
- 负载风险:宕机引发整体服务不可用
- 流控风险:某个业务查询时间过长过高影响其它业务正常运行
- 安全风险:大表查询未limit、未走索引、全表扫描;未按需查询、大字段未过滤;锁表;SQL注入:Update、Delete、Truncate等
- 其它待补充