欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-26 12:09:57
一、项目结构 1、工程结构 2、模块命名 3、代码依赖结构 4、项目启动顺序 按照顺序启动,且等一个服务完全启动后,在启动下一个服务,不然可能遇到一些坑。 二、核心代码块 1、8001 服务提供一个对外服务 基于Feign的调用方式 作用:基于两台分库分表的数据查询接口。 2、8002 服务提供一个 ......

一、项目结构

1、工程结构

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

2、模块命名

shard-common-entity:   公共代码块
shard-open-inte:        开放接口管理
shard-eureka-7001:      注册中心
shard-two-provider-8001: 8001 基于两台库的服务
shard-three-provider-8002:8002 基于三台库的服务

3、代码依赖结构

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

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

查询流程图
基于SpringCloud实现Shard-Jdbc的分库分表模式,数据库扩容方案
代码块

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

迁移流程图
基于SpringCloud实现Shard-Jdbc的分库分表模式,数据库扩容方案
代码块

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

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

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

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