基於SpringCloud實現Shard-Jdbc的分庫分表模式,資料庫擴容方案

来源:https://www.cnblogs.com/cicada-smile/archive/2019/08/04/11297554.html
-Advertisement-
Play Games

一、項目結構 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



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • AJAX PHP示例 AJAX用於創建更多互動式應用程式。 以下示例演示了當用戶在輸入欄位中鍵入字元時,網頁如何與Web伺服器通信: 體驗一下交互 在上面的示例中,當用戶在輸入欄位中鍵入字元時,showHint()執行被調用的函數。該函數由onkeyup事件觸發。 代碼說明:首先,檢查input欄位 ...
  • 搜羅到兩種相容性還不錯的方式。 1、第一種,通過clipboard.js插件實現(推薦) 此插件封裝了很多種使用方式很方便,具體demo,可以去GitHub上看,clipboard傳送門 2、第二種,純js實現: 上面兩種方式相容性都不錯,親測可用。 ...
  • 在CSS里,標簽位置居中一直是困擾Web前端的難題。在本文中,我對這類問題進行了探究和給出了幾點建議,供讀者參考。 1 行內標簽 1.1 水平居中 在父級標簽中使用 text-align: center。 效果: 1.2 垂直居中 如果是單行,則為該標簽設置行高(line-height)且與其父級標 ...
  • 介紹 客戶端不應該依賴它不需要的介面,即 一個類對另一個類的依賴應該建立在最小介面上 。 Demo引入 先來看一張圖: 如上圖所示:類A通過介面MyInterface依賴類B,類C通過介面MyInterface依賴類D;但是,類A只是想要使用B實現的介面MyInterface中的1,2,3方法,類C ...
  • 發佈 http://cxf.apache.org/download.html下載cfx項目解壓,配置系統環境 maven web項目里添加cfx 怎麼調用這些方法參考 https://www.cnblogs.com/tk55/p/11298435.html ...
  • 舉個慄子 問題描述 不同國家的人在NBA打球,但都是用英文交流。 簡單實現 Player Forwards Center Guards 測試 測試結果 存在問題 姚明剛到NBA時可能英文還不太好,也就是說聽不懂教練的戰術安排,attach 和 defense 不知道什麼意思,因此這樣實現會有問題,需 ...
  • 常見服務:http://www.webxml.com.cn/zh_cn/support.aspx 可能用到缺少的ArrayOfString.java文件 package com.test.wes.weather; import java.util.ArrayList; import java.uti ...
  • JDK1.5新特性: 1.自動拆裝箱. 2.泛型 3.可變參數 4.靜態導入 5.增強for迴圈 6.互斥鎖 7.枚舉 8.註解 JDK1.6新特性: 1.Desktop類和SystemTray類 2.使用JAXB2來實現對象與XML之間的映射 3.StAX 4.使用Compiler API 5.輕 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...