跳轉到結算頁,擷取訂單确認頁需要的資料時,出現以下3種問題:
1.Feign遠端調用丢失請求頭的問題:
order子產品裡調用了cart子產品,但是本地cookie裡沒有資料,請求頭中沒有攜帶Cookie,就會被認為沒登入
解決:
寫一個filter,把原來的請求頭給目前的新請求加上
2.Feign異步丢失上下文問題:
因為使用的是ThreadLocal傳遞資料,但是ThreadLocal的資料統一隻能在同一個線程下,而異步情況是開了幾個不同的線程,此時ThreadLocal就無法同步資料了
解決:為每一個新開的線程指派原先的資料
查詢位址:
擷取不到目前登入使用者的id
查詢商品資訊:
因為要解決前一個問題,也就是Feign遠端調用丢失請求頭的問題時改寫了遠端調用攔截器,它擷取目前請求的方法時用到了RequestContextHolder類,而由于Feign異步上下文丢失的問題,擷取不到目前請求
3.下單操作的幂等性:
insert和update不是幂等,select和delete是天然幂等。但insert在加入了主鍵時,是幂等的;update如果是以下形式就是幂等的,因為沒有改變狀态:update t set c=1 where p=2。而update set c=c+1 where p=2就不是幂等的
解決幂等性:
使用token令牌。1.擷取令牌 2.對比令牌 3.删除令牌 三個操作要是原子性的
擷取訂單确認頁資料時就生成一個token存入redis中
在下單方法中要先從redis中擷取到令牌token進行比較:
擷取結算頁的全流程: