參考:樂優商城的秒殺思路
借下圖
秒殺設計到的微服務
- 注冊中心(Eurake) : @EnableEurekaServer開啟注冊中心,實現對各種微服務的集中管理
- 網關徽服務(zuul) : @EnableDiscoveryClient將服 務注冊到到注冊中心,@EnablezuulProxy開啟 網關服務,對微服務路口做統一管理, 實現路由,降級(容錯回退),限流的功能。如果多台服務器,可以通過路徑和服務的綁定path: /user-service/* ; serviceld: user-service2,實現負載均衡(默認是Ribbon輪詢,還有隨機)
- 用戶中心微服務(user-service) :@EnableDiscoveryClient將 用戶中心微服務注冊到到注冊中心,實現注冊和登錄功能
- 授權中心微服務(auth-service) : @EnableDiscoveryClient將用戶中心微服務注冊到到注冊中心實現對登錄的鑒權。
- 商品微服務(item-service) : @EnableDiscoveryClient將商品微服務注冊到到注冊中心,做商品的添加和查詢。
具體秒殺流程邏輯
- 網關對部分不需要登錄認證的接口放行(要優化)1.注冊用戶,網關對注冊放行
- 登錄接口到網關,被路由到授權中心,授權中心微服務調用用戶中心的登錄接口進行校驗,校驗成功,利用JWT生成token,然后利用RSA非對稱加密token,生成公鑰和私鑰保存,然后將token返回到客戶端
秒殺業務
- 在商品微服務中設置秒殺參數,根據參數的商品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));))
- 使用秒殺功能需要登錄驗證,創建登錄攔截(LoginInterceptor extends HandlerinterceptorAdapter)對token進行驗證,認證通過將用戶信息存放到線程域中,並且走一個限流攔截AccessInterceptor extends HandlerinterceptorAdapter)實現限流功能
- 構建秒殺路徑(限流),加密,保存到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