一、項目結構 1、工程結構 2、模塊命名 3、代碼依賴結構 4、項目啟動順序 按照順序啟動,且等一個服務完全啟動後,在啟動下一個服務,不然可能遇到一些坑。 二、核心代碼塊 1、8001 服務提供一個對外服務 基於Feign的調用方式 作用:基於兩台分庫分表的數據查詢介面。 2、8002 服務提供一個 ...
一、項目結構
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