電商秒殺系統:整體介紹


參考

ABP微服務示例

什么是電商秒殺系統--參考文檔

項目需求

規模

模擬京東秒殺,千萬級用戶搶購十萬商品。

秒殺業務流程

用戶==》秒殺==》生成訂單==》支付

單台服務器每秒查詢率

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”

中台(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異步生成訂單:
    • 聚合服務發布生成訂單的消息
    • 訂單服務訂閱的消息,然后根據消息生成訂單到數據庫

高並發拆分原則

  1.  拆分原則
    1. 系統角度:按照系統功能/業務拆分,比如:電商系統,商品,支付,訂單,用戶
    2. 功能角度:例如:商品添加,刪除,批量更新,優惠券,使用,發放,添加
    3. 讀寫拆分:例如:商品讀和寫讀商品的系統,寫商品的系統
  2. 無狀態原則
    讀商品的系統進行橫向擴展,分流
    生產環境 無狀態服務(硬編碼)+有狀態配置(json文件)
  3. 服務化原則
    單機不行是否可以集群,使用nginx是否可以進行負載均衡
  4. 消息隊列原則
    解耦,異步,限流
  5. 緩存原則
    本地緩存(一級緩存):內存緩存,和逬程同生死(字典)
    本地分布式緩存(二級緩存):內存緩存,逬程共享,但是通過內網訪問字典+ redis (內網)
    分布式緩存(三級緩存):內存緩存,逬程共享,但是通過外網訪問
  6. 異步並發化原則
    async await實現異步操作

快速啟動項目服務

單個服務啟動

在項目的根目錄下,建立一個或者多個bat文件,寫入下面命令,然后雙擊打開就好

文件夾路徑可以是完整路徑,也可以是針對當前文件夾的相對路徑

 

批量服務啟動

START cmd /k " "     命令會自動打開多個窗口執行冒號內的命令

注意要把有依賴其他服務的命令放到最后一行,這里是參考端口號順序

 

遷移注意 

  • 每個項目遷移前檢查上下文Context文件,要有DbSet類的再遷移,沒DbSet類的不用遷移
  • 沒有遷移文件的先生成遷移文件,或者刪除遷移文件夾重新添加遷移,最后再更新數據庫
  • 可以在程序中一次生成整個數據庫的sql腳本,然后在服務器上創建數據庫,EF生成腳本命令:script-migration

項目啟動順序

mysql服務

consual服務

RabbitMQ服務

Redis服務

skywalking服務

一鍵批量啟動7個項目服務

備注:也可以把全部需要啟動的命令都寫入到“一鍵批量啟動”中,這樣點擊一次就行了

項目時序圖

時序圖

 

架構圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM