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
  • 最近做項目過程中,使用到了海康相機,官方只提供了C/C++的SDK,沒有搜尋到一個合適的封裝了的C#庫,故自己動手,簡單的封裝了一下,方便大家也方便自己使用和二次開發 ...
  • 前言 MediatR 是 .NET 下的一個實現消息傳遞的庫,輕量級、簡潔高效,用於實現進程內的消息傳遞機制。它基於中介者設計模式,支持請求/響應、命令、查詢、通知和事件等多種消息傳遞模式。通過泛型支持,MediatR 可以智能地調度不同類型的消息,非常適合用於領域事件處理。 在本文中,將通過一個簡 ...
  • 前言 今天給大家推薦一個超實用的開源項目《.NET 7 + Vue 許可權管理系統 小白快速上手》,DncZeus的願景就是做一個.NET 領域小白也能上手的簡易、通用的後臺許可權管理模板系統基礎框架。 不管你是技術小白還是技術大佬或者是不懂前端Vue 的新手,這個項目可以快速上手讓我們從0到1,搭建自 ...
  • 第1章:WPF概述 本章目標 瞭解Windows圖形演化 瞭解WPF高級API 瞭解解析度無關性概念 瞭解WPF體繫結構 瞭解WPF 4.5 WPF概述 ​ 歡迎使用 Windows Presentation Foundation (WPF) 桌面指南,這是一個與解析度無關的 UI 框架,使用基於矢 ...
  • 在日常開發中,並不是所有的功能都是用戶可見的,還在一些背後默默支持的程式,這些程式通常以服務的形式出現,統稱為輔助角色服務。今天以一個簡單的小例子,簡述基於.NET開發輔助角色服務的相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 第3章:佈局 本章目標 理解佈局的原則 理解佈局的過程 理解佈局的容器 掌握各類佈局容器的運用 理解 WPF 中的佈局 WPF 佈局原則 ​ WPF 視窗只能包含單個元素。為在WPF 視窗中放置多個元素並創建更貼近實用的用戶男面,需要在視窗上放置一個容器,然後在這個容器中添加其他元素。造成這一限制的 ...
  • 前言 在平時項目開發中,定時任務調度是一項重要的功能,廣泛應用於後臺作業、計劃任務和自動化腳本等模塊。 FreeScheduler 是一款輕量級且功能強大的定時任務調度庫,它支持臨時的延時任務和重覆迴圈任務(可持久化),能夠按秒、每天/每周/每月固定時間或自定義間隔執行(CRON 表達式)。 此外 ...
  • 目錄Blazor 組件基礎路由導航參數組件參數路由參數生命周期事件狀態更改組件事件 Blazor 組件 基礎 新建一個項目命名為 MyComponents ,項目模板的交互類型選 Auto ,其它保持預設選項: 客戶端組件 (Auto/WebAssembly): 最終解決方案裡面會有兩個項目:伺服器 ...
  • 先看一下效果吧: isChecked = false 的時候的效果 isChecked = true 的時候的效果 然後我們來實現一下這個效果吧 第一步:創建一個空的wpf項目; 第二步:在項目裡面添加一個checkbox <Grid> <CheckBox HorizontalAlignment=" ...
  • 在編寫上位機軟體時,需要經常處理命令拼接與其他設備進行通信,通常對不同的命令封裝成不同的方法,擴展稍許麻煩。 本次擬以特性方式實現,以兼顧維護性與擴展性。 思想: 一種命令對應一個類,其類中的各個屬性對應各個命令段,通過特性的方式,實現其在這包數據命令中的位置、大端或小端及其轉換為對應的目標類型; ...