自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實(shí)戰(zhàn)!openFeign如何實(shí)現(xiàn)全鏈路JWT令牌信息不丟失?

開發(fā) 前端
令牌中繼通俗的講則是讓令牌在微服務(wù)鏈路調(diào)用中傳遞下去,保證各個(gè)微服務(wù)能夠獲取令牌中的用戶信息。

???

今天這篇文章介紹一下JWT令牌如何在微服務(wù)鏈路中保證信息不丟失?官方稱為令牌中繼。

什么是令牌中繼?

令牌中繼通俗的講則是讓令牌在微服務(wù)鏈路調(diào)用中傳遞下去,保證各個(gè)微服務(wù)能夠獲取令牌中的用戶信息。

以下訂單的例子來說,如下圖:

???

下單流程

客戶端攜帶令牌請(qǐng)求網(wǎng)關(guān),網(wǎng)關(guān)鑒權(quán)成功后會(huì)將令牌中的用戶信息解析出來放在請(qǐng)求頭中下發(fā)給訂單服務(wù),同樣的,訂單服務(wù)需要將用戶信息傳遞給賬戶服務(wù)獲取該用戶的賬戶信息。

那么問題來了?如何保證網(wǎng)關(guān)服務(wù)->訂單服務(wù)->賬戶服務(wù)這條鏈路中的用戶信息傳遞下去是個(gè)痛點(diǎn)

解決方案

令牌在openFeign調(diào)用過程中是不能自動(dòng)中繼的,因此必須手動(dòng)的將令牌信息傳遞下去。

注意:openFeign在開啟熔斷降級(jí)后內(nèi)部調(diào)用開啟了子線程,因此傳統(tǒng)的方案直接在RequestInterceptor中設(shè)置是不可行的。

那么如何保證子線程也能獲取請(qǐng)求頭中的用戶信息呢?

答案是:RequestContextHolder這個(gè)神器。

RequestContextHolder內(nèi)部通過InheritableThreadLocal實(shí)現(xiàn)子線程共享信息。

在FeignCircuitBreakerInvocationHandler這個(gè)類中也是有如下一行代碼:

RequestContextHolder.setRequestAttributes(requestAttributes); 



正是使用RequestContextHolder將request的信息保存在其中,因此實(shí)現(xiàn)令牌中繼只需要讀取RequestContextHolder的信息即可。

詳細(xì)代碼如下:

/**  * @author 公眾號(hào):碼猿技術(shù)專欄  * 用于實(shí)現(xiàn)令牌信息中繼  */ @Component public class FeignRequestInterceptor implements RequestInterceptor {     @Override     public void apply(RequestTemplate template) {         //從RequestContextHolder中獲取HttpServletRequest         HttpServletRequest httpServletRequest = RequestContextUtils.getRequest();         //獲取RequestContextHolder中的信息         Map<String, String> headers = getHeaders(httpServletRequest);         //放入feign的RequestTemplate中         for (Map.Entry<String, String> entry : headers.entrySet()) {             template.header(entry.getKey(), entry.getValue());         }     }      /**      * 獲取原請(qǐng)求頭      */     private Map<String, String> getHeaders(HttpServletRequest request) {         Map<String, String> map = new LinkedHashMap<>();         Enumeration<String> enumeration = request.getHeaderNames();         if (enumeration != null) {             while (enumeration.hasMoreElements()) {                 String key = enumeration.nextElement();                 String value = request.getHeader(key);                 map.put(key, value);             }         }         return map;     } } 



源碼目錄如下圖:

???


責(zé)任編輯:武曉燕 來源: 碼猿技術(shù)專欄
相關(guān)推薦

2023-11-14 09:04:15

用戶節(jié)點(diǎn)不可用

2023-01-30 22:34:44

Node.js前端

2021-10-22 09:00:59

令牌JWT

2021-12-30 08:13:00

JWT登錄令牌

2024-10-23 12:50:13

數(shù)據(jù)飛輪數(shù)字化

2023-11-21 09:35:49

全量部署微服務(wù)

2024-01-05 00:29:36

全鏈路灰度發(fā)布云原生

2025-01-20 08:10:00

微服務(wù)架構(gòu)SLF4J

2023-06-01 08:54:08

RabbitMQ確認(rèn)機(jī)制生產(chǎn)端

2022-08-31 22:25:53

微服務(wù)架構(gòu)DevOPs

2022-02-15 17:56:19

SpringBoot日志

2022-12-28 09:07:41

2023-10-16 23:43:52

云原生可觀測(cè)性

2023-11-13 10:41:44

Spring微服務(wù)

2022-05-23 08:23:24

鏈路追蹤SleuthSpring

2024-09-27 20:00:04

2023-03-02 09:17:50

全鏈路監(jiān)控系統(tǒng)

2024-08-21 08:09:17

2025-04-22 00:05:00

2024-03-13 08:56:17

全鏈路壓力測(cè)試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)