谷粒商城項目介紹


本篇為項目大綱,詳細涉及的知識點可以查看 谷粒商城所學知識點整理總結

基本信息

谷粒商城是一個微服務項目,總體上分為前台購物模塊和后台數據管理模塊。基於 SpringCloud + SpringCloudAlibaba + MyBatis-Plus + Redis + SpringSession + RabbitMQ + Nginx + ES 實現,Nginx 實現反向代理和動靜分離,采用 Docker 容器化部署。前台商城系統包括:用戶登錄、注冊、商品搜索、商品詳情、購物車、下訂單流程、秒殺活動等模塊。后台管理系統包括:系統管理、商品系統、優惠營銷、庫存系統、訂單系統、用戶系統、內容管理等七大模塊。其中的基本功能都實現,部分細節功能由於時間原因未能實現。項目視頻地址

 

項目結構與使用組件

注冊、配置中心:Nacos

網關:gateway

遠程調用:Feign

分布式事務:本地事務+延時隊列

限流、降級、熔斷:Sentinel

鏈路追蹤:Sleuth + Zipkin 可視化

 分別是權限模塊(登陸注冊)、購物車模塊、公共模塊(公共的依賴)、優惠活動模塊(秒殺活動)、網關、用戶模塊、訂單模塊、商品模塊、搜索模塊、秒殺模塊、第三方模塊(一些第三方依賴)、倉儲模塊、后台管理模塊(實現后台登陸注冊等一些基本功能)。

 

后台管理

系統管理

主要是一些角色、權限的配置,SQL的監控,定時任務的查看、修改,后台界面菜單的管理等。

 

商品系統

主要是對商品相關數據的管理。如分類、品牌、屬性的查詢、修改,商品維護等。

其中屬性分為規格屬性和銷售屬性,屬性可以被屬性組關聯。

商品維護分為spu管理、發布商品、商品管理。spu管理主要是對spu的屬性進行查看修改,對spu進行上架操作。

 

上架會將spu的信息保存到ES中,隨后就可以在前台搜索欄中檢索到。

發布商品則是對商品進行發布操作,配置價格、屬性、基本信息等。

圖片的保存使用阿里雲的OSS存儲來實現。

 

優惠營銷

 優惠營銷主要包括滿減折扣、秒殺活動等。秒殺活動可以配置一次秒殺活動,並且配置這次活動中的多個秒殺場次,並且配置每個場次關聯的商品。

 

庫存系統

主要是對sku庫存消息的管理,一個倉庫下可以關聯多個商品庫存,在庫存量不夠時可以先創建采購需求,隨后將若干個采購需求組成一個采購單,隨后再由采購人員拉取采購單,進行采購。

 

訂單系統

 主要是查詢、修改訂單、支付等訂單相關的數據。

 

用戶系統

主要是對商城用戶的基本信息、會員信息進行查詢和修改。

 

前台功能

注冊

前端界面表單使用了JS表單校驗,后台使用JSR303進行校驗。驗證碼原本想使用短信驗證碼,但是發現阿里雲、騰訊雲都需要項目上線證書驗證,所以改用了谷歌的圖片驗證碼配置 Redis 來實現, key 本來准備使用 sessionID 來實現,但是發現獲取驗證碼的請求對應的 sessionId 與提交表單時的 sessionId 是不同的,所以又采用 session.hashCode() 來作為 key。並且在點擊時會將發送的驗證碼請求攜帶一個時間戳,用於獲取新的驗證碼來實現刷新驗證碼的功能。

同時密碼在存儲時使用了 SpringSecurity 的 BCryptPasswordEncoder 來加密,保證密碼的安全性。

 

登陸

使用 OAuth2.0 + SpringSession 實現。

登陸采用了兩種登陸方式,用戶名密碼登陸和第三方社交授權登陸(OAuth2.0),第三方目前只支持微博登陸。

 在登陸成功后,會將用戶消息通過 SpringSession 保存在 Redis 中,並且向瀏覽器添加包含用戶消息的 Cookie,范圍為主域名,以后在不同模塊間跳轉都可以通過攜帶的 Cookie 用戶信息去 redis 中查到當前用戶的信息。

 

商品檢索

使用ES實現。

由於商品檢索的條件多,且訪問量大,所以使用 ES 來保存檢索的商品的主要數據。目前可以通過分類以及搜索欄來檢索商品

 

 在檢索界面,會根據當前商品相關的銷售屬性、品牌來顯示篩選條件,在增加條件后還會根據該條件下包含的屬性類型來動態改變條件。

 

購物車

使用Redis+本地Cookie實現。

購物車分為未登錄狀態和登陸狀態,在未登陸時,購物車的數據會在 redis 中保存 30 天,在登陸后,購物車數據會一直保存,並且會將購物車數據和之前未登錄時加入到購物車的數據進行合並。主要使用 Cookie 來保存購物車數據,在第一次執行后服務器會返回一個保存當前臨時用戶購物車ID的 Cookie,在登陸后會通過攜帶的Cookie,查詢對應的購物車數據並與登陸用戶ID對應的 Redis 數據進行合並,再刪除臨時Cookie 的數據。同時也實現購物車項的增加刪除。

 

 

訂單系統

1、實現使用了 RabbitMQ 的延時隊列+本地事務 來解決分布式事務。同時使用手動確認來保證消息可靠性。

由於下單過程會涉及到很多模塊,並且其中數據的准確性也是要求最高的,任意一個數據出錯都會對整塊數據造成影響。所以應該使用事務對整個過程進行控制,但是因為數據的變動涉及到多個模塊,傳統的單體事務並不能滿足這個場景,所以就引入了分布式事務,但是由於強一致性的分布式事務解決方案會使得系統的性能下降,所以本項目使用的是弱一致性+最終一致性。在調用遠程方法鎖庫存時為了防止發生異常添加了事務,並且發送解庫存消息給延時隊列,保證在之后主業務發生異常之前鎖的庫存也可以正常解鎖,實現數據最終一致性

具體實現就是在訂單模塊的主事務方法中進行訂單、訂單項數據的添加,並調用遠程接口進行鎖庫存操作。然后根據這次遠程調用的結果選擇訂單的狀態,最后發送一個釋放庫存、修改訂單狀態的消息給延時隊列,並且調用遠程的鎖庫存操作也會發送一個釋放庫存的消息給延時隊列,這樣可以解決兩個問題。1)一段時間內用戶未支付訂單庫存會自動解鎖;2)如果調用的遠程鎖庫操作正常執行,但是本地事務方法發生了異常,那么遠程未回滾庫存也會在一段時間后也會自動解鎖。

2、使用 Redis 存儲訂單令牌,以此實現支付訂單接口的冪等性。

通過 lua腳本來驗證和刪除令牌(在進入結算頁面時會在 redis 存入一個數據作為令牌,隨后生成訂單時則會通過腳本來檢查這個數據是否存在,如果存在就將其刪除並返回1,否則返回0,因為需要查詢和刪除的通過是原子性所以使用腳本來實現),成功后執行業務代碼。

3、使用支付寶沙箱環境模擬支付過程。賬號:dubfpq8758@sandbox.com。密碼和支付密碼都是111111。在支付成功后修改訂單狀態並保存支付流水記錄。

4、為了防止在支付界面一直等待直到后台隊列將訂單取消再完成支付,導致數據錯亂,在消息取消訂單時同時會關閉支付界面

5、為了防止由於消息積壓、網絡波動等原因導致解庫存的消息先於取消訂單的消息被接收執行,導致解庫存失敗(解庫存會先判斷訂單狀態是否是取消狀態再進行解庫存)所以在取消訂單中也會發送一條解庫存的消息。並且為了保證解庫存的冪等性,在庫存表中添加了庫存工作單記錄用於標記當前訂單商品的的庫存是否已經解鎖了。

 

秒殺功能

使用定時任務+異步任務來實現秒殺功能。在每天的三點整會觸發定時異步任務,將接下來三天內的所有秒殺場次以及秒殺商品的相關信息添加到 Redis 中(防止高並發的請求訪問數據庫),秒殺方法使用 Sentinel 進行限流控制,秒殺商品會在首頁展示,並且在商品詳情頁中提示。

 

 秒殺商品的下單與普通不同,其會直接跳過加入購物車步驟,直接創建好訂單,隨后可以直接支付。

秒殺的流程是:

1、校驗秒殺驗證碼(在將秒殺商品展出時會創建一個秒殺隨機碼保存到商品屬性中,並且展示隱藏在秒殺頁面里,在秒殺時會取出商品信息進行比較)。

2、校驗秒殺時間是否一致。

3、校驗單次購買數量是否超過限制。

4、嘗試向redis保存 "userID+場次ID+skuId" 為key的數據,如果成功說明是第一次,否則說明當前是重復操作,失敗。

5、通過秒殺庫存前綴+秒殺商品的秒殺隨機碼作為key來進行信號量的扣減來模擬鎖庫操作,再發送消息給秒殺的消息隊列,使其在后台對數據庫進行鎖庫操作。

 

redis 數據結構

 


免責聲明!

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



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