基于SpringCloud实现Shard-Jdbc的分库分表模式,数据库扩容方案
程序员文章站
2022-03-26 12:09:57
一、项目结构 1、工程结构 2、模块命名 3、代码依赖结构 4、项目启动顺序 按照顺序启动,且等一个服务完全启动后,在启动下一个服务,不然可能遇到一些坑。 二、核心代码块 1、8001 服务提供一个对外服务 基于Feign的调用方式 作用:基于两台分库分表的数据查询接口。 2、8002 服务提供一个 ......
一、项目结构
1、工程结构
2、模块命名
shard-common-entity: 公共代码块 shard-open-inte: 开放接口管理 shard-eureka-7001: 注册中心 shard-two-provider-8001: 8001 基于两台库的服务 shard-three-provider-8002:8002 基于三台库的服务
3、代码依赖结构
4、项目启动顺序
(1)shard-eureka-7001: 注册中心 (2)shard-two-provider-8001: 8001 基于两台库的服务 (3)shard-three-provider-8002:8002 基于三台库的服务
按照顺序启动,且等一个服务完全启动后,在启动下一个服务,不然可能遇到一些坑。
二、核心代码块
1、8001 服务提供一个对外服务
基于feign的调用方式
作用:基于两台分库分表的数据查询接口。
import org.springframework.cloud.netflix.feign.feignclient; import org.springframework.web.bind.annotation.pathvariable; import org.springframework.web.bind.annotation.requestmapping; import shard.jdbc.common.entity.tableone; /** * shard-two-provider-8001 * 对外开放接口 */ @feignclient(value = "shard-provider-8001") public interface twoopenservice { @requestmapping("/selectonebyphone/{phone}") tableone selectonebyphone(@pathvariable("phone") string phone) ; }
2、8002 服务提供一个对外服务
基于feign的调用方式
作用:基于三台分库分表的数据存储接口。
import org.springframework.cloud.netflix.feign.feignclient; import org.springframework.web.bind.annotation.requestbody; import org.springframework.web.bind.annotation.requestmapping; import shard.jdbc.common.entity.tableone; /** * 数据迁移服务接口 */ @feignclient(value = "shard-provider-8002") public interface movedataservice { @requestmapping("/movedata") integer movedata (@requestbody tableone tableone) ; }
3、基于8002服务数据查询接口
查询流程图
代码块
/** * 8001 端口 :基于两台分库分表策略的数据查询接口 */ @resource private twoopenservice twoopenservice ; @override public tableone selectonebyphone(string phone) { tableone tableone = tableonemapper.selectonebyphone(phone); if (tableone != null){ log.info("8002 === >> tableone :"+tableone); } // 8002 服务没有查到数据 if (tableone == null){ // 调用 8001 开放的查询接口 tableone = twoopenservice.selectonebyphone(phone) ; log.info("8001 === >> tableone :"+tableone); } return tableone ; }
4、基于 8001 数据扫描迁移代码
迁移流程图
代码块
/** * 8002 端口开放的数据入库接口 */ @resource private movedataservice movedataservice ; /** * 扫描,并迁移数据 * 以 库 db_2 的 table_one_1 表为例 */ @override public void scandatarun() { string sql = "select id,phone,back_one backone,back_two backtwo,back_three backthree from table_one_1" ; // datatwotemplate 对应的数据库:ds_2 list<tableone> tableonelist = datatwotemplate.query(sql,new object[]{},new beanpropertyrowmapper<>(tableone.class)) ; if (tableonelist != null && tableonelist.size()>0){ int i = 0 ; for (tableone tableone : tableonelist) { string db_num = hashutil.movedb(tableone.getphone()) ; string tb_num = hashutil.movetable(tableone.getphone()) ; // 只演示向数据新加库 ds_4 迁移的数据 if (db_num.equals("ds_4")){ i += 1 ; log.info("迁移总数数=>" + i + "=>库位置=>"+db_num+"=>表位置=>"+tb_num+"=>数据:【"+tableone+"】"); // 扫描完成:执行新库迁移和旧库清理过程 movedataservice.movedata(tableone) ; // datatwotemplate.update("delete from table_one_1 where id=? and phone=?",tableone.getid(),tableone.getphone()); } } } }
三、演示执行流程
1、项目流程图
2、测试执行流程
(1)、访问8002 数据查询端口
http://127.0.0.1:8002/selectonebyphone/phone20 日志输出: 8001 服务查询到数据 8001 === >> tableone :+{tableone}
(2)、执行8001 数据扫描迁移
http://127.0.0.1:8001/scandata
(3)、再次访问8002 数据查询端口
http://127.0.0.1:8002/selectonebyphone/phone20 日志输出: 8002 服务查询到数据 8002 === >> tableone :+{tableone}
四、源代码地址
github地址:知了一笑 https://github.com/cicadasmile 码云地址:知了一笑 https://gitee.com/cicadasmile
上一篇: Python——工厂模式