java分库框架shard_基于SpringCloud实现Shard-Jdbc的分库分表模式,数据库扩容方案

本文介绍了一种基于Spring Cloud的分库分表解决方案,通过两个服务(8001和8002)实现数据查询与迁移。8001服务负责基于两台数据库的数据查询,而8002服务则提供了数据存储接口并实现了数据从旧库向新库的迁移。

一、项目结构

1、工程结构

54618772dbc0be7f14ccfd575427ac1b.png

2、模块命名

shard-common-entity: 公共代码块

shard-open-inte: 开放接口管理

shard-eureka-7001: 注册中心

shard-two-provider-8001: 8001 基于两台库的服务

shard-three-provider-8002:8002 基于三台库的服务

3、代码依赖结构

b413f094c9a5b0c89227456ef517fb8f.png

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服务数据查询接口

查询流程图

7bd60d85b01a724394ef5df11f13435f.png

代码块

/**

* 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 数据扫描迁移代码

迁移流程图

1ffc312e32e3708d2b65fb7103da9d5a.png

代码块

/**

* 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 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、项目流程图

2f984ab51483d34bc7b3a4b909a9b900.png

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/spring-cloud-base

GitEE·地址

https://gitee.com/cicadasmile/spring-cloud-base

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值