需求:
trade服務需要在下單后清空購物車
分析:
顯然,清空購物車需要調用cart服務,也就是這個功能的實現涉及到了微服務之間的轉發。
其次,清空購車還需要userId,所以需要使用RequestInterceptor來實現夾帶信息。
完整流程:
1.前端收到點擊事件“下單”,根據uri調用后端接口--->
2.springcloud網關拿到uri進行解析,從header中提取出token,Springcloud的Global攔截器進行鑒權,并且將其中根據token解析出的info存放在header中,進行后續的攔截過程。
網關查找到對應的服務,根據nacos提供的表單,采用負載均衡,選取對應端口攜帶header中的info進行轉發--->
3.trade服務在收到網關請求前,經過公有api模塊的springmvc攔截器,該攔截器將請求中的info讀取并存放在threadLocal中(該攔截器作用僅用于將info存放僅threadLocal,所以是對所有頁面放行的)--->
4.trade模塊執行對應功能,執行中調用cart模塊--->
6.調用cart模塊使用openfeign進行請求發送,由于cart服務需要userId,所以需要經過openfeign攔截器進行增強。因為對cart模塊發起的openfeign請求是由trade模塊完成的,所以使用的線程仍然是執行trade模塊功能的線程,該線程的threadLocal中存儲著info,攔截器將info信息從threadLocal中取出并存放在請求連接的請求頭中。--->
7.openfeign請求cart服務,openfeign請求仍然是一個http請求,既然是http請求,定然會被公有攔截器攔截。所以,攔截器取出請求頭中的info,并將其存在對應新線程的threadLocal中,執行清空購物車功能。--->
8.結束
總結:
整個過程實際上是info信息的傳遞
最初后端初次鑒權——在springcloud的GlobalFilter中進行,鑒權后得到info開始傳遞:
公有攔截器:從header讀取info,并存入trade線程的threadLocal
openfeign:將threadLocal的info取出,裝進新http請求的header
共有攔截器:從header讀取info,并存入cart線程的threadLocal