Stories

Detail Return Return

【Spring開發】SpringCloud交友項目實戰第11篇:分片集羣【附代碼文檔】 - Stories Detail

🏆🏆🏆教程全知識點簡介:1、Dubbo的前世今生 1、項目介紹 1.1、項目背景 1.2、市場分析 1.3、目標用户羣體 1.4、使用場景 1.5、競爭對手分析 1.7、技術方案 2、前後端分離開發思想 3、開發工具與環境搭建 3.1、開發工具 3.2、環境搭建 4、sms_code驗證瑪 4.1 阿里雲短信 4.2 自動裝配 1. 完善用户信息 1.2 百度人臉識別 1.2.1 概述 1.2.2 賬號申請 1.2.4 抽取模板工具 2.2 更新用户資料 2.2.1 接口文檔 2.2.2 代碼實現 3. 統一token處理 3.1.需求分析 3.2 解決方案 攔截器(Interceptor) ThreadLocal MongoDB入門 數據庫以及表的操作 新增數據 更新數據 刪除數據 查詢數據 1.3 設置陌生人問題 1.4 通知設置 1.5 黑名單管理 4. SpringData-Mongo 4.2 完成基本操作 5. 今日佳人 5.1 表結構設計 5.2 服務提供者 5.2.0 導入依賴 5.2.2 RecommendUserApi接口 分片集羣 原理介紹 集羣搭建 2、圈子功能 2.1、功能説明 3、圈子實現 3.2、發佈動態 1. 動態查詢 1.1 查詢好友動態 2. 圈子互動 2.3 動態點贊 2.4.3 喜歡標識 安裝 準備 使用 1. 即時通信 2. 環信 2.1 開發簡介 2.2 環信Console 2.3 環信API介紹 初始化 基礎API 3. 抽取環信組件 3.1 編寫Properties對象 3.2 編寫HuanXinTemplate 3.3 編寫自動配置類 2. MongoDB地理位置檢索 2.1 地理位置索引 Point LineString Polygon 2.2 案例 3. 上報地理位置 4. 搜附近 1. 我的訪客 1.2 記錄訪客數據 tanhua-model tanhua-app-server tanhua-dubbo-interface 1.3 首頁誰看過我 需求分析 3. FastDFS 3.2. 工作原理 3.2.1. 文件的上傳 分佈式文件系統FDFS配置 4. 發佈小視頻 1、用户凍結解凍 1.1 用户凍結 1.3 查詢數據列表 1.4 明日系統修改 2.2 定時任務 3、內容審核 1、瞭解推薦系統 1.1、什麼是推薦系統? 1.3、推薦系統業務流程 1.4、協同過濾推薦算法 1.5、ALS算法 2、好友推薦 2.1、流程 2.2、部署好友推薦服務

<!-- start:bj1 -->

📚📚👉👉👉本站這篇博客:   https://segmentfault.com/a/1190000047259848    中查看

📚📚👉👉👉本站這篇博客:   https://segmentfault.com/a/1190000047225317    中查看

<!-- end:bj1 -->

✨ 本教程項目亮點

🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考

🎯🎯🎯全教程總章節


🚀🚀🚀本篇主要內容

分片集羣

高數據量和吞吐量的數據庫應用會對單機的性能造成較大壓力,大的查詢量會將單機的CPU耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的內存而將壓力轉移到磁盤IO上。

  為了解決這些問題,有兩個基本的方法: 垂直擴展和水平擴展。

    垂直擴展:增加更多的CPU和存儲資源來擴展容量。

    水平擴展:將數據集分佈在多個服務器上。水平擴展即分片。

原理介紹

分片(sharding)是MongoDB用來將大型集合分割到不同服務器(或者説一個集羣)上所採用的方法。

例如,如果數據庫1tb的數據集,並有4個分片,然後每個分片可能僅持有256 GB的數據。如果有40個分片,那麼每個切分可能只有25GB的數據。

MongoDB中數據的分片是以集合為基本單位的,集合中的數據通過片鍵(Shard key)被分成多部分。其實片鍵就是在集合中選一個鍵,用該鍵的值作為數據拆分的依據。

一般片鍵採用範圍或哈希的方式進行分片。

集羣搭建

環境準備

先創建一個如下的目錄結果:

  • 在root目錄下創建mongodb目錄。內部依次創建文件夾(node1,node2,node3)。
  • 在node1文件夾下創建:config-server1,mongos1,shard11,shard21文件夾

    • config-server1目錄下創建backup,config,db文件夾
    • mongos1,shard11,shard21同上創建
  • 在node2和node3文件夾下創建

配置服務
創建容器

進入node1,node2,node3的config-serverx目錄。執行docker命令創建並啓動docker容器

配置服務1

#進入目錄
cd /root/mongodb/node1/config-server1
#創建並啓動容器。
docker run --restart=always --privileged=true -p 10021:27019 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --name pro-file-server-config1 mongo:4.0.0 -f /etc/mongod/config.conf --configsvr --replSet "rs-file-server-config-server" --bind_ip_all

配置服務2

#進入目錄
cd /root/mongodb/node2/config-server2
#創建並啓動容器。
docker run --restart=always --privileged=true -p 10022:27019 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --name pro-file-server-config2 mongo:4.0.0 -f /etc/mongod/config.conf --configsvr --replSet "rs-file-server-config-server" --bind_ip_all

配置服務2

#進入目錄
cd /root/mongodb/node3/config-server3
#創建並啓動容器。
docker run --restart=always --privileged=true -p 10023:27019 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --name pro-file-server-config3 mongo:4.0.0 -f /etc/mongod/config.conf --configsvr --replSet "rs-file-server-config-server" --bind_ip_all`
配置Mongo

將3個配置服務關聯到一起

通過docker進入任意一台config-server配置三台服務器之間的聯繫

Ehcache 文檔

#進入pro-file-server-config1配置服務器
docker exec -it pro-file-server-config1 /bin/bash
#連接mongo 配置服務器暴露的默認端口為27019
mongo -port 27019
#執行配置內容
rs.initiate({
_id: "rs-file-server-config-server",
configsvr: true,
members: [
{ _id : 0,host : "192.168.136.163:10021" },
{ _id : 1,host : "192.168.136.163:10022" },
{ _id : 2, host : "192.168.136.163:10023" }
]
});
#查看狀態
rs.status()
路由服務
創建容器

mongos1

#進入目錄
cd /root/mongodb/node1/mongos1
#創建並啓動容器。
docker run --restart=always --privileged=true -p 10011:27017 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --entrypoint mongos --name pro-file-server-mongos1 mongo:4.0.0 -f /etc/mongod/config.conf --configdb rs-file-server-config-server/192.168.50.100:10021,192.168.50.100:10022,192.168.50.100:10023 --bind_ip_all

mongos2

#進入目錄
cd /root/mongodb/node2/mongos2
#創建並啓動容器。
docker run --restart=always --privileged=true -p 10012:27017 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --entrypoint mongos --name pro-file-server-mongos2 mongo:4.0.0 -f /etc/mongod/config.conf --configdb rs-file-server-config-server/192.168.50.100:10021,192.168.50.100:10022,192.168.50.100:10023 --bind_ip_all

mongos3

#

## 副本集羣

對於中小型項目,使用副本集羣就夠了。

一個主,兩個從庫組成,主庫宕機時,這兩個從庫都可以被選為主庫。

 ![](/img/bVdmGCh)

當主庫宕機後,兩個從庫都會進行競選,其中一個變為主庫,當原主庫恢復後,作為從庫加入當前的複製集羣即可。

 ![](/img/bVdmGCi)

### 原理解釋

![](/img/bVdmGCj)

Master:代表主節點,主節點提供所有數據的CRUD服務

Backup:代表從節點,從節點不提供任何服務

Arbitration:代表仲裁節點,仲裁節點不存儲任何數據,其主要作用就是當主節點掛掉以後,把那個備份節點提升為一個主節點。

### 集羣搭建

**創建容器**

docker run -di --name=master_mongo -p 27017:27017 mongo:4.0.3 --replSet mongo_clus
docker run -di --name=backup_mongo1 -p 27018:27017 mongo:4.0.3 --replSet mongo_clus
docker run -di --name=backup_mongo2 -p 27019:27017 mongo:4.0.3 --replSet mongo_clus


 設置副本集名稱,也就是設置集羣名稱,必須要設置,否則沒法構建集羣

**配置**

進入`master_mongo`容器中

Java 語言規範

docker exec -it master_mongo /bin/bash


登錄`Mongo`

NetBeans 文檔

mongo -port 27017


創建集羣

cfg={
"_id":"mongo_clus",
members:[{

  _id:0,
  host:"192.168.136.161:27017",
  priority:2

},{

  _id:1,
  host:"192.168.136.161:27018",
  priority:1

},{

  _id:2,
  host:"192.168.136.161:27019",
  priority:2

}]
}

Apache Pulsar 文檔

C3P0 文檔

rs.initiate(cfg)


注意修改ip地址


## 説明

* 首頁推薦
* MongoDB集羣

- 圈子功能説明
- 圈子技術實現與方案
- 圈子實現發佈動態
- 圈子實現個人動態


## 1、首頁推薦

 ![](/img/bVdmGCk)

### 1.1、接口分析

地址:http://192.168.136.160:3000/project/19/interface/api/118

 ![](/img/bVdmGCl)

 ![](/img/bVdmGCm)

響應:

~~~json
{
    "counts": 4698,
    "pagesize": 20,
    "pages": 58,
    "page": 16,
    "items": [
        {
            "id": 1011,
            "avatar": "assets/images/avatar_2.png",
            "nickname": "黑馬小妹",
            "gender": "woman",
            "age": 23,
            "tags": [
                "本科",
                "年齡相仿",
                "單身"
            ],
            "fateValue": 96
        },
        {
            "id": 2495,
            "avatar": "assets/images/avatar_1.png",
            "nickname": "米朵妹妹",
            "gender": "man",
            "age": 28,
            "tags": [
                "年齡相仿",
                "本科",
                "單身"
            ],
            "fateValue": 87
        },
        {
            "id": 5708,
            "avatar": "assets/images/avatar_4.png",
            "nickname": "黑馬小妹",
            "gender": "man",
            "age": 24,
            "tags": [
                "單身",
                "本科",
                "年齡相仿"
            ],
            "fateValue": 94
        },
        {
            "id": 4768,
            "avatar": "assets/images/avatar_3.png",
            "nickname": "黑馬小妹",
            "gender": "man",
            "age": 24,
            "tags": [
                "年齡相仿",
                "單身",
                "本科"
            ],
            "fateValue": 80
        }
    ]
}
~~~

### 1.2、功能實現

#### 1.2.1 controller

`TanhuaController`編寫推薦列表方法

Dropwizard 文檔

Apache DBCP 文檔

/**

  • 查詢分頁推薦好友列表
    */

@GetMapping("/recommendation")
public ResponseEntity recommendation(RecommendUserDto dto) {

Add a new Comments

Some HTML is okay.