本文源碼:GitHub·點這裏 || GitEE·點這裏git
shard-common-entity: 公共代碼塊 shard-open-inte: 開放接口管理 shard-eureka-7001: 註冊中心 shard-two-provider-8001: 8001 基於兩臺庫的服務 shard-three-provider-8002:8002 基於三臺庫的服務
(1)shard-eureka-7001: 註冊中心 (2)shard-two-provider-8001: 8001 基於兩臺庫的服務 (3)shard-three-provider-8002:8002 基於三臺庫的服務
按照順序啓動,且等一個服務徹底啓動後,在啓動下一個服務,否則可能遇到一些坑。github
基於Feign的調用方式 做用:基於兩臺分庫分表的數據查詢接口。web
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) ; }
基於Feign的調用方式 做用:基於三臺分庫分表的數據存儲接口。spring
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) ; }
查詢流程圖 sql
代碼塊數據庫
/** * 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 ; }
遷移流程圖 app
代碼塊ide
/** * 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)、訪問8002 數據查詢端口測試
http://127.0.0.1:8002/selectOneByPhone/phone20 日誌輸出: 8001 服務查詢到數據 8001 === >> tableOne :+{tableOne}
(2)、執行8001 數據掃描遷移spa
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