springboot~openfeign開啟熔斷之後MDC為null的解決

来源:https://www.cnblogs.com/lori/archive/2023/01/30/17076219.html
-Advertisement-
Play Games

上一篇說了關於MDC跨線程為null的理解,而本講主要說一下,如何去解決它,事實上,Hystrix為我們留了這個口,我們只需要繼承HystrixConcurrencyStrategy,然後重寫wrapCallable方法,再把這個重寫的對象註冊到Hystrix里就可以了,跨線程共用數據,可以使用阿裡 ...


上一篇說了關於MDC跨線程為null的理解,而本講主要說一下,如何去解決它,事實上,Hystrix為我們留了這個口,我們只需要繼承HystrixConcurrencyStrategy,然後重寫wrapCallable方法,再把這個重寫的對象註冊到Hystrix里就可以了,跨線程共用數據,可以使用阿裡的 transmittable-thread-local組件,如果只是共離MDC的話,可以自己寫個組件就行。

一 ThreadMdcUtil用來同步MDC對象

public class ThreadMdcUtil {

	public static <T> Callable<T> wrap(final Callable<T> callable, final Map<String, String> context) {
		return () -> {
			if (context == null) {
				MDC.clear();
			}
			else {
				MDC.setContextMap(context);
			}
			try {
				return callable.call();
			}
			finally {
				MDC.clear();
			}
		};
	}

	public static Runnable wrap(final Runnable runnable, final Map<String, String> context) {
		return () -> {
			if (context == null) {
				MDC.clear();
			}
			else {
				MDC.setContextMap(context);
			}
			try {
				runnable.run();
			}
			finally {
				MDC.clear();
			}
		};
	}

}

重寫HystrixConcurrencyStrategy,將主線程的MDC傳入Hystrix建立的新線程

/**
 * 線程上下文傳遞,hystrix的相關實現有興趣可以看源碼, hystrix提供了這個口子可以處理線程間傳值問題,這裡不做過多贅述
 */
public class RequestContextHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {

	@Override
	public <T> Callable<T> wrapCallable(final Callable<T> callable) {
		// 使用阿裡的 TtlCallable 重新包一層,解決線程間數據傳遞問題
		// return TtlCallable.get(callable);
		// 使用自定義的包裝對象,將當前mdc複製到Hystrix新線程中
		return ThreadMdcUtil.wrap(callable, MDC.getCopyOfContextMap());
	}

}

註冊我們的RequestContextHystrixConcurrencyStrategy策略到Hystrix

@Configuration
@Slf4j
public class HystrixCircuitBreakerConfiguration {

	@PostConstruct
	public void init() {
		HystrixPlugins.getInstance().registerConcurrencyStrategy(
				new RequestContextHystrixConcurrencyStrategy());
	}

}

運行結果,使用openFeign時,已經共用了traceId這個數據值

作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980

支付寶掃一掃,為大叔打賞!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文已收錄至Github,推薦閱讀 👉 Java隨想錄 微信公眾號:Java隨想錄 CSDN: 碼農BookSea 不知道自己的無知,乃是雙倍的無知。——柏拉圖 跨代引用問題 跨代引用是指新生代中存在對老年代對象的引用,或者老年代中存在對新生代的引用。 假如要現在進行一次只局限於新生代區域內的收集 ...
  • JdbcTemplate-01 看一個實際需求: 如果希望使用spring框架做項目,Spring框架如何處理對資料庫的操作呢? 方案一:使用之前的JdbcUtils類 方案二:spring提供了一個操作資料庫(表)的功能強大的類JdbcTemplate。我們可以通過ioc容器來配置一個JdbcTe ...
  • 工作之餘,想搞一些東西,於是寫了這麼一個服務。目標是做一個通用的聊天程式,包含群聊、單聊、群聊天增刪成員這些必須功能,以及支持各種類型的聊天等。 後端使用 rust ,前端使用 react 這一套,ui 上做的比較簡單,主要是驗證一下後端能力,展示使用。 主要功能有:用戶體系,聊天組,組成員和消息, ...
  • 最近在寫一個基於代理池的高併發爬蟲,目標是用單機從某網站 API 爬取十億級別的JSON數據。 代理池 有兩種方式能夠實現爬蟲對代理池的充分利用: 搭建一個 Tunnel Proxy 伺服器維護代理池 在爬蟲項目內部自動切換代理 所謂 Tunnel Proxy 實際上是將切換代理的操作交給了代理服務 ...
  • 引言 近日一直忙著做持續集成,處於安全性考慮,需要在離線環境運行。項目依托Jenkins做Java/Python/Vue等工程的鏡像構建,其中Java工程基本基於Maven,在外網條件下通過IDEA或者mvn命令均可正常打包,原本思路是將本地的repo全量拷貝到伺服器,再執行同樣的mvn命令,但實際 ...
  • keytool VS openssl keytool 和 openssl 是倆個證書管理工具。 keytool 是 java JDK 自帶的證書管理工具,使用 keytool 可以生成密鑰,創建證書。只要裝了 jdk,並正確設置了環境變數,就可以之間通過命令行執行 keytool 命令來管理證書。 ...
  • 【前置內容】Spring 學習筆記全系列傳送門: Spring學習筆記 - 第一章 - IoC(控制反轉)、IoC容器、Bean的實例化與生命周期、DI(依賴註入) Spring學習筆記 - 第二章 - 註解開發、配置管理第三方Bean、註解管理第三方Bean、Spring 整合 MyBatis 和 ...
  • 1、創建工程後點擊IP Catalog 2、在搜索欄搜索ROM,並選擇Block Memory Generator 3、在彈出來的界面中選擇單口ROM 4、然後修改位寬和深度(這裡根據我的需求設置為8位寬,4096深度);並把使能埠取消;勾上Core Output Register,使數據延遲一個 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...