參考
項目需求
規模
模擬京東秒殺,千萬級用戶搶購十萬商品。
秒殺業務流程
用戶==》秒殺==》生成訂單==》支付
單台服務器每秒查詢率
900/s QPS(每秒查詢率)
項目描述
該項目實現了千萬級用戶搶購十萬商品的秒殺功能,具體包括產品展示、用戶登陸注冊、下單、支付、防刷等功能,運用jmeter做壓力測試,
主要用到asp.net core、webapi、微服務、IdentityServer4、restful、redis、lua、nginx、Consul、RabbitMQ、限流、降級、skywalking、AutoMapper等技術
項目環境准備
服務器環境
- Linux=》CentOS 7/8:操作系統
- k8s:容器編排工具
- docker:容器
- nginx:web服務器
開發工具
- VS2019、MySql
壓測工具
- jmeter
軟件環境
- jquery 3.5
- bootstrap
- asp.net core mvc 3.1
- asp.net core 3.1
- IdentityServer4
- mysql 5.7
- RabbitMQ
- Consul
- skywalking
- redis+lua
項目結構說明:
說明:其他服務都是項目引用依賴框架層Cores和公共層Commons
框架層(Framework):組件層
- Cores(核心層 / 基礎設施層):
- Cluster:集群、負載均衡組件
- DynamicMiddleware:動態中間調用組件
- Exceptions:異常組件
- Logs:日志組件
- MicroClients:微服務客戶端組件
- Middleware:中台調用組件,用於管理微服務之間的通訊。暫時使用http協議的方式,后期優化可以改為grpc框架的方式
- Pollys:熔斷降級
- Registry:注冊
- Utils:工具
前台 (Fronts):前端
- SeckillFronts(秒殺前台):5007
- Seckill 控制器和視圖:默認首頁
- 調用聚合服務:wwwroot / js 中通過JavaScript腳本文件來調用 “秒殺聚合服務5006”
- Seckill 控制器和視圖:默認首頁
中台(Middles)
- Commons(公共層):
- 對象映射器:AutoMapper
- Web框架:AspNetCore
- ORM: EntityFrameworkCore
- 數據庫: MySql
- 分布式緩存: CSRedisCore
- ProductServices(商品服務):5001
- OrderServices(訂單服務):5002
- PaymentServices(支付服務):5003
- SeckillServices(秒殺服務):5004
- UserServices(用戶服務): 5005
- SeckillAggregateServices(秒殺聚合服務):5006 ,集群時只要單獨部署這個秒殺聚合服務就行
高並發集群實現
秒殺聚合服務集群
- 秒殺覺和服務做集群,扣減庫存時直接從Redis緩存集群中扣減庫存
- Redis緩存(Rdis沒有做集群,只有一個redis):Redis + lua(批量執行、原子執行)
- 消息隊列RabbitMQ異步生成訂單:
- 聚合服務發布生成訂單的消息
- 訂單服務訂閱的消息,然后根據消息生成訂單到數據庫
高並發拆分原則
- 拆分原則
- 系統角度:按照系統功能/業務拆分,比如:電商系統,商品,支付,訂單,用戶
- 功能角度:例如:商品添加,刪除,批量更新,優惠券,使用,發放,添加
- 讀寫拆分:例如:商品讀和寫讀商品的系統,寫商品的系統
- 無狀態原則
讀商品的系統進行橫向擴展,分流
生產環境 無狀態服務(硬編碼)+有狀態配置(json文件) - 服務化原則
單機不行是否可以集群,使用nginx是否可以進行負載均衡 - 消息隊列原則
解耦,異步,限流 - 緩存原則
本地緩存(一級緩存):內存緩存,和逬程同生死(字典)
本地分布式緩存(二級緩存):內存緩存,逬程共享,但是通過內網訪問字典+ redis (內網)
分布式緩存(三級緩存):內存緩存,逬程共享,但是通過外網訪問 - 異步並發化原則
async await實現異步操作
快速啟動項目服務
單個服務啟動
在項目的根目錄下,建立一個或者多個bat文件,寫入下面命令,然后雙擊打開就好
文件夾路徑可以是完整路徑,也可以是針對當前文件夾的相對路徑
批量服務啟動
START cmd /k " " 命令會自動打開多個窗口執行冒號內的命令
注意要把有依賴其他服務的命令放到最后一行,這里是參考端口號順序
遷移注意
- 每個項目遷移前檢查上下文Context文件,要有DbSet類的再遷移,沒DbSet類的不用遷移
- 沒有遷移文件的先生成遷移文件,或者刪除遷移文件夾重新添加遷移,最后再更新數據庫
- 可以在程序中一次生成整個數據庫的sql腳本,然后在服務器上創建數據庫,EF生成腳本命令:script-migration
項目啟動順序
mysql服務
consual服務
RabbitMQ服務
Redis服務
skywalking服務
一鍵批量啟動7個項目服務
備注:也可以把全部需要啟動的命令都寫入到“一鍵批量啟動”中,這樣點擊一次就行了
項目時序圖
時序圖
架構圖