天画项目-低代码平台-分库分表sql生成设计与实现(dbops)

一、背景&需求

1.1 背景

我在业余时间构建了一个租房平台,采用springboot微服务的架构模式,同时结合服务化思想进行代码实践,但是由于存在很多重复且低效的变更导致业余时间对这个租房平台的进度产生影响。作为开发人员长期维护一个业余项目产生了很多进度延迟和效率问题会导致项目项目被遗弃的概率增大,对开发者来说也是一个非常沮丧的事情。为了避免这种事情发生,我一方面鼓励自己尽量每天贡献代码,并在合适的时间构建提高开发效率的使用平台。另一方面也是为了借助这个租房平台进行微服务+分库分表+DDD领域实践。因此最初的目标就是为了构建大规模微服务应用,这就需要大量构建很多微服务工程。目前这个平台的业务API主要还是以CURD类的接口为主,所以构建一个支持微服务架构生态支持分库分表,支持sql生成管理,支持所构建即所得,所操作即所得的低代码生成平台是优于业务开发的。在这个构建过程中业务开发和组件平台开发大部分时间是串行的,所以迭代不是一直持续的,而是优先解决业务开发过程中存在的效率问题。

 

1.2 需求

这里需要在代码生成服务里集成生成分库分表sql脚本的功能,便于按照分库分表配置和sql段的配置快速生成对应分库分表语句。

二、设计方案与实现

2.1 方案描述

2.1.1 sql拆解

在mysql数据库中初管理数据库语句包括DDL,DML等。这里如果初始化创建库的语句的则需要如create table column.....的语句。另一方面如果涉及到需要分库分表的话则需要在不同的库中编写相通数量不同表序号的sql.因此这里准备对分库分表配置,表字段描述配置分开进行描述。所以整个描述sql的内容拆成了三块内容:

1.dbsharding.txt

这个文件的内容就是分库的数量,假如是2则分为两个库,4就是4个库。

2.tablesharding.txt

这个文件的内容就是分表的数量,k:v的形式,描述每个分库下的每个表分为几张表。假设分2个库的情况下,分表内容配置如下:

room_source:4 
room_picture:8 
room_content:8 
room_meeting:8
room_comment:8
room_like:8

上述配置文件中room_source分4张表,每个分库下则是2张表,room_picture分8张表,每个分库下则是2张表

3.room_source.txt

这个文件文件名前缀就是数据库表名称,文件的内容是sql段,里面不是完整的创建表语句。内容如下:

(id   BIGINT(20)  unsigned  NOT NULL  COMMENT "",
publish_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP comment "发布时间",
publish_user_id bigint(20) not null default 0 comment "发布人id",
publish_user_type tinyint(4) not null default 0 comment "发布人类型",
city_id int(11) NOT null default 0 comment "所在城市",
area_id int(11) NOT null default 0 comment "所在商圈\行政区域",
area_address varchar(100) NOT null default "" comment "小区名称",
area_floor int(11) NOT null default 1 comment "所在楼层",
room_source_type tinyint(4) not null default 0 comment "房源类型",
room_area_size int(11) NOT NULL default 0 comment "房屋面积/平方米",
room_direction varchar(100) NOT null default "" comment "房屋朝向",
room_form_type tinyint(4) not null default 0 comment "房屋类型",
cost_per_month int(11) not null default 0 comment "房屋费用(月/元)",
rent_form tinyint(4) not null default 0 comment "出租形式",
equipment_support varchar(40) not null default 0 comment "房屋设备支持,多个逗号分隔",
PRIMARY KEY (id),
INDEX `idx_publish_user_id` (`publish_user_id`) USING BTREE
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 collate=utf8mb4_general_ci comment "房源信息主表";

 

2.1.2 配置文件划分

为了存储上述sql内容和分库分表配置,需要对配置文件进行划分,另外一方面在微服务的情况下如果有多个服务需要创建库表语句则需要对配置文件进行更好的划分。这里在codeMaker-dbops工程的resources模块下进行了一些配置文件目录的划分,如下图:

WX20201221-152926@2x.png

这里其中有个ops目录,这里存储sql字段变更描述,和增减索引描述。

2.2 接口定义

 /**
     * 初始化应用表结构
     *
     * @param appName  应用名称
     * @param dbName   数据库名称
     * @return
     */
    @GetMapping(value = "/initshardingdb")
 /**
     * 生成运维分库分表变更语句
     * 对应resources sql文件夹下目录名
     * @param appName 应用名称
     * @param dbName 数据库名称
     * @param opsName 操作--对应于ops目录下的文件名
     * @return
     */
    @GetMapping(value = "/dbops")

 

三、使用文档

1. 使用流程

  1. 配置对应的sql段和分库分表配置,如果是单库服务则分库分表配置默认都是1即可。
  2. 启动服务工程,访问http://localhost:8097/initshardingdb接口,如

http://localhost:8097/initshardingdb?appName=lightsnail&dbName=snail_app_user_crm

  1. 在控制台上看打印sql,同时可以在target下看到输出的sql文件,如下图:

WX20201221-165222@2x.png

我最近整了一个公众号,持续输出原创内容,敬请关注:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值