源碼地址:https://github.com/ThoughtsBeta/flash-sale
高並發多方案秒殺架構
本源碼原是小冊的配套源碼,旨在幫助小冊讀者從源碼解構高並發設計的核心要義,現已開源。源碼包含兩個部分:核心應用和網關應用。受限於版權要求,如需詳盡的源碼解讀,請參閱小冊《高並發秒殺設計精要與實現》。
源碼核心特性
- 基於Spring Boot和Spring Cloud的完整分布式架構應用實踐;
- 本地緩存與分布式緩存的設計技巧;
- 同步下單和高並發庫存扣減方式;
- 異步隊列下單和庫存扣減;
- 去中心化分庫分表和分桶庫存扣減;
- 限流的原理和應用;
- 黑白攻防和安全風控策略;
- 領域驅動設計方法與實踐;
- 限流、降級與熔斷落地與實踐;
- 容器化技術與Swarm集群部署;
- Redis+Nacos+RocketMQ+ELK等10+中間件的應用與實踐;
- 應用動態配置方法和實踐;
- 分布式架構的度量與監控;
- RESTful APIs設計與體驗。
鏈路視角下的整體架構
一、源碼快速上手指南
為了方便讀者快速上手源碼,我們制作了視頻指南,請移步B站查看。
二、源碼結構
三、技術選型概覽
為了兼顧不同層次的讀者,降低對技術理解的門檻和成本,在具體的技術選型上我們主要采用目前市面上主流的技術產品和方案:
- 應用框架:Spring Boot,Spring Cloud Gateway,Srping Cloud Sleuth
- 數據庫:MySQL+Mybatis
- 緩存:Redis+本地緩存
- 單元測試:Junit
- 容器化:Docker
- 容器化管理:Swarm、Portainer
- 可觀性與可視化監控:Prometheus、Grafana
- 限流、降級與熔斷:Sentinel
- 動態配置:Nacos
- 日志治理:Elasticsearch、Logstash、Kibana
- 測試工具:Postman和Jmeter
四、如何啟動並運行應用
對於FlashSale所使用到的中間件,我們提供了基於Docker-compose的完整方案,讀者可以在Docker環境下一鍵安裝。下載並打開源碼之后,在項目的根目錄下,你會看到enviroment
目錄。這個目錄有四個相關的額文件和文件夾:
- docker-compose.yml:【完整版】中間件部署腳本。相關中間件的安裝腳本,你可以通過執行
docker-compose -f docker-compose.yml up
命令安裝所依賴的全部中間件; - docker-compose-light.yml:【輕量版】中間件部署腳本(本地開發推薦),移除了非必要的中間件服務。相關中間件的安裝腳本,你可以通過執行
docker-compose -f docker-compose-light.yml up
命令安裝所依賴的全部中間件; - docker-cluster-middlewares.yml:【集群化】的中間件部署方案,適用於Swarm網絡下的集群部署,具體部署方式可以參考第15章節;
- docker-cluster-apps.yml:【集群化】的應用部署方案,適用於Swarm網絡下的集群部署,具體部署方式可以參考第15章節;
- config:相關中間件的配置文件所在位置,包括Prometheus和MYSQL等配置;
- grafana-storage: grafana存儲的配置數據。之所以要把這個文件也提供出來,主要是因為Grafana的數據源和報表配置相對比較麻煩,自行配置可能需要倒騰好一陣子,我們提供出來便可以直接加載使用;
- data:部分中間件的數據存儲位置,包括MYSQL等。這個目錄的數據是由中間件系統運行時產生,數據多且雜亂,我們並沒有把它放在git中,因此你下載源碼后不會看到它,但是運行時就會出現。那為什么要把它放在這個位置,而不是計算機系統的其他位置?這個主要是為了方便數據查看和管理,你可以隨時清除所有數據重新來過,當然也可以把它放在任何地方。
第一步:啟動中間件
- 下載源碼后進入
environment
目錄,執行docker-compose -f docker-compose-light.yml up
啟動中間件; - 如果你對Docker命令不熟悉,建議安裝Docker Desktop簡化容器管理,可以直觀看到容器的啟動狀態和日志輸出;
- 需要停止所有容器時,請執行
docker-compose -f docker-compose-light.yml down
; - 需要重新創建所有容器時,請執行
docker-compose -f docker-compose-light.yml up --force-recreate
.
關於數據庫中庫表的初始化
對於FlashSale所使用的業務表,我們已經將初始化腳本放在enviroment/config/mysql
中,docker-compose在安裝完MYSQL之后,便會執行數據表初始化動作,實現數據庫的開箱即用。
.
├── config
│ └── mysql
│ └── init
│ ├── flash_sale_init.sql // 默認主庫初始化語句
│ ├── flash_sale_init_sharding_0.sql // #0號數據庫初始化語句
│ ├── flash_sale_init_sharding_1.sql // #1號數據庫初始化語句
│ └── nacos_init.sql //Nacos持久化語句
├── docker-cluster-apps.yml
├── docker-cluster-middlewares.yml
├── docker-compose-light.yml
└── docker-compose.yml
需要稍微注意的時,我們為MYSQL提供了兩份初始化腳本:flash_sale_init.sql
和nacos_init.yml
,前者是業務表初始化腳本,后者是Nacos的初始化腳本,因為FlashSale需要借助Nacos所提供的動態配置功能,但是Nacos默認是內存存儲,所以我們為它實現了基於MYSQL的持久化存儲方案。
第二步:通過IDE啟動應用運行
在啟用應用前,請務必確保已成功執行第一步,並且各中間件容器啟動成功。
- 下載源碼后執行
./mvnw clean install
完成系統依賴包的安裝; - 選擇
start
模塊中的com.actionworks.flashsale.FlashSaleApplication
作為程序入口運行。
特別提醒
本地啟動時請在IDE中指定properties為local
.
在調試階段,推薦使用這種方式。FlashSale啟動時,將會連接到前面所安裝的中間件。
可選:通過Docker啟動運行
除了在IDE啟動FlashSale之外,通過Docker啟動也是一種非常便捷的方案。
- 通過下面的命令構建FlashSale本地鏡像:
docker build -t flash-sale-app .
構建完成后,通過docker images
查看鏡像是否已經存在。
- 將下面的配置添加到前面所說的
docker-compose.yml
中,在運行中間的時候,也將同時啟動系統。當然,我們也可以通過獨立的文件運行。需要注意的是,在通過docker運行時,FlashSale將和中間件共處同一個網絡中,我們為此創建了獨立的配置文件,在運行時需要指定docker
配置。
services:
flash-sale-app:
image: flash-sale-app
container_name: flash-sale-app
environment:
- SPRING_PROFILES_ACTIVE=docker
ports:
- 8090:8090
networks:
- thoughts-beta-cluster-apps
restart: on-failure
flash-sale-gateway:
image: flash-sale-gateway
container_name: flash-sale-gateway
environment:
- SPRING_PROFILES_ACTIVE=docker
ports:
- 8080:8080
networks:
- thoughts-beta-cluster-apps
restart: on-failure
五、 如何測試接口
在完成中間件的安裝和初始化,並啟動應用后,接下來我們可以試着測試接口,來判斷中間件和應用是否已經就緒並工作正常。
同樣的,我們不會讓讀者自己創建腳本和准備測試數據,畢竟這不符合我們讀者至上和開箱即用的原則。為此,在項目的根目錄下,你會看到我們提供的postman
目錄,它是Postman的測試腳本,包含了接口定義和測試數據,你可以直接選擇某個接口點擊測試即可。
Postman的腳本位置如下所示:
├── environment
│ ├── config
│ ├── data
│ ├── docker-compose.yml
│ └── grafana-storage
└── postman
└── flash-sale-postman.json # 測試腳本
關於作者
- 《王者並發課》專欄
- 訂閱號:MetaThoughts