天天看點

19.下單服務(Feign遠端調用丢失請求頭、Feign異步丢失上下文、幂等性)

跳轉到結算頁,擷取訂單确認頁需要的資料時,出現以下3種問題:

1.Feign遠端調用丢失請求頭的問題:

order子產品裡調用了cart子產品,但是本地cookie裡沒有資料,請求頭中沒有攜帶Cookie,就會被認為沒登入

19.下單服務(Feign遠端調用丢失請求頭、Feign異步丢失上下文、幂等性)

解決:

寫一個filter,把原來的請求頭給目前的新請求加上

19.下單服務(Feign遠端調用丢失請求頭、Feign異步丢失上下文、幂等性)

2.Feign異步丢失上下文問題:

因為使用的是ThreadLocal傳遞資料,但是ThreadLocal的資料統一隻能在同一個線程下,而異步情況是開了幾個不同的線程,此時ThreadLocal就無法同步資料了

19.下單服務(Feign遠端調用丢失請求頭、Feign異步丢失上下文、幂等性)

解決:為每一個新開的線程指派原先的資料

19.下單服務(Feign遠端調用丢失請求頭、Feign異步丢失上下文、幂等性)

查詢位址:

擷取不到目前登入使用者的id

19.下單服務(Feign遠端調用丢失請求頭、Feign異步丢失上下文、幂等性)

查詢商品資訊:

因為要解決前一個問題,也就是Feign遠端調用丢失請求頭的問題時改寫了遠端調用攔截器,它擷取目前請求的方法時用到了RequestContextHolder類,而由于Feign異步上下文丢失的問題,擷取不到目前請求

19.下單服務(Feign遠端調用丢失請求頭、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.删除令牌 三個操作要是原子性的

19.下單服務(Feign遠端調用丢失請求頭、Feign異步丢失上下文、幂等性)
19.下單服務(Feign遠端調用丢失請求頭、Feign異步丢失上下文、幂等性)

擷取訂單确認頁資料時就生成一個token存入redis中

19.下單服務(Feign遠端調用丢失請求頭、Feign異步丢失上下文、幂等性)

在下單方法中要先從redis中擷取到令牌token進行比較:

19.下單服務(Feign遠端調用丢失請求頭、Feign異步丢失上下文、幂等性)

擷取結算頁的全流程:

19.下單服務(Feign遠端調用丢失請求頭、Feign異步丢失上下文、幂等性)
19.下單服務(Feign遠端調用丢失請求頭、Feign異步丢失上下文、幂等性)