基于SpringCloud实现Shard-Jdbc的分库分表模式,数据库扩容方案
发布时间:2020-12-15 05:28:48 所属栏目:Java 来源:网络整理
导读:一、项目结构 1、工程结构 2、模块命名 shard-common-entity: 公共代码块shard-open-inte: 开放接口管理shard-eureka-7001: 注册中心shard-two-provider-8001: 8001 基于两台库的服务shard-three-provider-8002:8002 基于三台库的服务 3、代码依赖结构
一、项目结构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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- java – HttpClient发布进度和MultipartEntityBu
- java – String Tokenizer:用逗号分割字符串,用
- java – 如何在Spring MVC Web App中为大多数请求
- Codeforces Round #590 D. Distinct Characters
- java – 当我想将EJB暴露给同一个应用服务器上的
- java – 元素类型“property”的内容必须匹配
- java – AWS Lambda invokeAsync的替换(不建议使
- selenium+java+testng框架
- java – 如何将组件放在其他组件之上?
- java – 如何知道Parse.initialize()是否已被调用
热点阅读