基於分布式微服務的秒殺搶購功能的實現


參考:樂優商城的秒殺思路

借下圖

樂優.png

秒殺設計到的微服務

  1. 注冊中心(Eurake) : @EnableEurekaServer開啟注冊中心,實現對各種微服務的集中管理
  2. 網關徽服務(zuul) : @EnableDiscoveryClient將服 務注冊到到注冊中心,@EnablezuulProxy開啟 網關服務,對微服務路口做統一管理, 實現路由,降級(容錯回退),限流的功能。如果多台服務器,可以通過路徑和服務的綁定path: /user-service/* ; serviceld: user-service2,實現負載均衡(默認是Ribbon輪詢,還有隨機)
  3. 用戶中心微服務(user-service) :@EnableDiscoveryClient將 用戶中心微服務注冊到到注冊中心,實現注冊和登錄功能
  4. 授權中心微服務(auth-service) : @EnableDiscoveryClient將用戶中心微服務注冊到到注冊中心實現對登錄的鑒權。
  5. 商品微服務(item-service) : @EnableDiscoveryClient將商品微服務注冊到到注冊中心,做商品的添加和查詢。

具體秒殺流程邏輯

  1. 網關對部分不需要登錄認證的接口放行(要優化)1.注冊用戶,網關對注冊放行
  2. 登錄接口到網關,被路由到授權中心,授權中心微服務調用用戶中心的登錄接口進行校驗,校驗成功,利用JWT生成token,然后利用RSA非對稱加密token,生成公鑰和私鑰保存,然后將token返回到客戶端
秒殺業務
  1. 在商品微服務中設置秒殺參數,根據參數的商品Id查詢商品,構建商品秒殺表,添加,然后更新redis緩存
BoundHashOperations<String, Object, Object> hashOperations = this.stringRedisTemplate.boundHashOps(KEY PREFIX);

      1/判斷是否存在此K值

      if (hashOperations.hasKey(KEY PREFI){

      hashOperations.delete(KEY_ PREFIX);

      seckiloods.forEach(goods > hashOperatiosput(goos.getkud(.totring(), goods.getstock).totrin));))
  1. 使用秒殺功能需要登錄驗證,創建登錄攔截(LoginInterceptor extends HandlerinterceptorAdapter)對token進行驗證,認證通過將用戶信息存放到線程域中,並且走一個限流攔截AccessInterceptor extends HandlerinterceptorAdapter)實現限流功能
  2. 構建秒殺路徑(限流),加密,保存到redis緩存,隱藏秒殺路徑,防止刷單。
4. 秒殺

4.1. 驗證秒殺路徑
4.2. 讀取庫存, 減1后更新緩存
4.3. 庫存不足直接返回“排隊中”
4.4. 庫存充足, 將商品信息封裝入隊MQ,然后直接返回“排隊中”
5. 然后訂單微服務監聽隊列,消費隊列,5.1判斷庫存不足,將該商品設置成不可秒殺狀態,5.2查看是否秒殺到,秒殺到直接返回,5.3沒有秒殺到,創建訂單

GitHub:正版參考:https://github.com/lyj8330328/leyou


免責聲明!

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



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