一、项目结构

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_2List<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}

四、源代码

https://github.com/cicadasmile/cloud-shard-jdbc

关注公众号号:【知了一笑】,持续更新

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

  1. 架构组件:基于Shard-Jdbc分库分表,数据库扩容方案

    架构组件:基于Shard-Jdbc分库分表,数据库扩容方案 一.数据库扩容 1.业务场景 互联网项目中有很多"数据量大,业务复杂度高,需要分库分表"的业务场景. 这样分层的架构 ( ...

  2. MySQL 分库分表及其平滑扩容方案

    作者:王克锋 出处:https://kefeng.wang/2018/07/22/mysql-sharding/ 众所周知,数据库很容易成为应用系统的瓶颈.单机数据库的资源和处理能力有限,在高并发的分 ...

  3. MySQL关于分库分表及其平滑扩容方案

    众所周知,数据库很容易成为应用系统的瓶颈.单机数据库的资源和处理能力有限,在高并发的分布式系统中,可采用分库分表突破单机局限.本文总结了分库分表的相关概念.全局ID的生成策略.分片策略.平滑扩容方案. ...

  4. mysql数据库分表备份脚本_MySQL分库分表备份数据库脚本的操作

    MySQL分库分表备份数据库脚本的操作 发布时间:2020-05-26 16:52:23 来源:51CTO 阅读:134 作者:三月 本篇文章给大家主要讲的是关于MySQL分库分表备份数据库脚本的操作 ...

  5. springcloud mysql库集群_SpringCloud实现分库分表模式下,数据库实时扩容方案

    一.项目结构 1.工程结构 2.模块命名 shard-common-entity: 公共代码块 shard-open-inte: 开放接口管理 shard-eureka-7001: 注册中心 shar ...

  6. 架构组件:基于shard-jdbc中间件,实现数据分库分表

    一.水平分割 1.水平分库 1).概念: 以字段为依据,按照一定策略,将一个库中的数据拆分到多个库中. 2).结果 每个库的结构都一样:数据都不一样: 所有库的并集是全量数据: 2.水平分表 1).概 ...

  7. 深入理解分布式技术 - 分库分表后的扩容解决方案

    文章目录 概述 路由规则与扩容方案 对主键进行哈希取模 优点 缺点 基于数据范围进行拆分 结合数据范围和哈希取模 小结 概述 在实际开发中,数据库的扩容和不同的分库分表规则直接相关,今天我们从系统设计 ...

  8. Linux数据库管理——day10——分库分表、数据库硬件优化

    分库分表     分库分表也称作分片技术,主要作用是将存放在一个数据库中的数据按照特定的方法进行拆分,分散存放在多个数据库中,以达到分散多台设备实现负载均衡 垂直分割        纵向切分,把一个表 ...

  9. mysql分库分表 ppt_数据库分库分表中间件架构解析.ppt

    数据库分库分表中间件架构解析 Processor(1) Processor(n) MySQL MySQL MySQL Cobar结构 Front-end Communication Applicati ...

最新文章

  1. Agile Controller产品概述
  2. 微信小程序canvas绘制环形图(含动画)
  3. 计算机2级access,计算机二级-Access-窗体的设计视图
  4. 一和零(二维01背包)
  5. 美国计算机科学发展,美国计算机工程发展现状
  6. 一位良心发现的交易员自述:我们是怎么玩弄散户的
  7. 前端布局之网格gird布局(简单易懂)
  8. Java学习笔记—UDP通信
  9. iis设置服务器文件权限设置,iis7如何配置写入权限以上传文件---急急急
  10. 剑指Offer之二叉树与双向链表
  11. 销售99绝招 成功没商量
  12. RecyclerView混合布局
  13. Mcmod模组下载脚本
  14. 【前端小实战】页面文字搜索功能
  15. 玩转Python量化金融工具之NumPy
  16. android选择头像弹窗,仿QQ的头像选择弹出的对话框
  17. 树莓派学前班——设置屏幕分辩率
  18. 【圣诞树代码】送她六棵圣诞树,祝她圣诞快乐~(送女朋友必备!)
  19. ubuntu设置swap(交换内存)
  20. OpenJudge NOI 1.5 编程基础之循环控制(21-30题)C++ 解题思路

热门文章

  1. 计组之数据运算:3、定点数、浮点数
  2. c++ winpcap开发(6)
  3. Python3bytes、hex、字符串之间相互转换
  4. 打印Python当前版本详细信息
  5. 使用Docker快速搭建生产环境
  6. 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第3节 接口_11_接口的常量定义和使用...
  7. 【转载】C#中可使用string.Empty代表空字符
  8. 【一本通1347】格子游戏
  9. 模板的日常~。~。。。(持续更新中...)
  10. Entity Framework加载相关实体——Explicit Loading