[特殊字符] SpringCloud項目中使用OpenFeign進行微服務遠程調用詳解(含連接池與日志配置)

📚 目錄

  1. 為什么要用OpenFeign?

  2. 在cart-service中整合OpenFeign
    2.1 引入依賴
    2.2 啟用OpenFeign
    2.3 編寫Feign客戶端
    2.4 調用Feign接口

  3. 開啟連接池,優化Feign性能
    3.1 引入OkHttp
    3.2 配置啟用OkHttp連接池
    3.3 驗證連接池生效

  4. Feign最佳實踐 —— 客戶端抽取
    4.1 避免重復編碼問題
    4.2 抽取公共Feign模塊
    4.3 配置掃描路徑

  5. 配置OpenFeign日志輸出

  6. 總結


1. 為什么要用OpenFeign?

在微服務中,服務與服務之間頻繁調用。傳統使用RestTemplate需要自己管理服務發現、負載均衡、URL拼接,代碼復雜且難以維護。

OpenFeign的優勢:

  • 聲明式接口開發,像調用本地方法一樣調用遠程服務

  • 內置負載均衡,支持 Ribbon、LoadBalancer

  • 支持連接池,支持超時重試、熔斷降級

  • 支持詳細日志輸出,方便排查問題

? 一句話總結:OpenFeign讓遠程調用優雅又高效!


2. 在cart-service中整合OpenFeign

cart-service 查詢我的購物車 為例,來演示整合OpenFeign。


2.1 引入依賴

cart-servicepom.xml 中添加:

<!-- OpenFeign -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency><!-- 負載均衡器 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

2.2 啟用OpenFeign

CartApplication 啟動類上添加注解:

@EnableFeignClients

表示開啟Feign客戶端掃描。


2.3 編寫Feign客戶端

com.hmall.cart.client 包下,新建接口 ItemClient

@FeignClient("item-service")
public interface ItemClient {@GetMapping("/items")List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}

說明:

  • @FeignClient("item-service"):指向要調用的微服務

  • @GetMapping("/items"):對應遠程接口路徑

  • @RequestParam("ids"):請求參數

  • 返回值會自動封裝成List<ItemDTO>


2.4 調用Feign接口

CartServiceImpl 中直接注入 ItemClient,然后調用即可:

@Autowired
private ItemClient itemClient;// 調用
List<ItemDTO> items = itemClient.queryItemByIds(cartItemIds);

? 不需要再寫 RestTemplate、不需要自己負載均衡,調用清晰簡單!


3. 開啟連接池,優化Feign性能

默認Feign底層用的是HttpURLConnection,不支持連接池,不適合高并發。

推薦使用 OkHttp 作為Feign底層,提高性能。


3.1 引入OkHttp依賴

cart-servicepom.xml 中添加:

<!-- OKHttp -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId>
</dependency>

3.2 配置啟用OkHttp連接池

application.yml 中增加配置:

feign:okhttp:enabled: true

? 這樣Feign就會自動使用OkHttp作為底層HTTP客戶端,并且自動使用連接池。


3.3 驗證連接池生效

FeignBlockingLoadBalancerClientexecute 方法打斷點調試,可以看到底層已經是 OkHttpClient 了,說明連接池生效了!


4. Feign最佳實踐 —— 客戶端抽取

未來 trade-service 也需要調用 item-service 的接口,重復定義 ItemClient 顯然不合理,需要做客戶端抽取


4.1 避免重復編碼問題

思路:把公共的Feign客戶端抽取出來,供各個微服務引用。


4.2 抽取公共Feign模塊

在項目下新建 hm-api 模塊,pom.xml配置:

<artifactId>hm-api</artifactId><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><dependency><groupId>io.swagger</groupId><artifactId>swagger-annotations</artifactId><version>1.6.6</version></dependency>
</dependencies>

然后將 ItemDTOItemClient 移動到 hm-api 模塊中。


4.3 配置掃描路徑

cart-servicetrade-service 的啟動類中添加:

  • 方式一:聲明掃描包

@EnableFeignClients(basePackages = "com.hmall.api.client")
  • 方式二:指定特定FeignClient

@EnableFeignClients(clients = {ItemClient.class})

這樣就可以正常引用公共模塊中的Feign接口了!


5. 配置OpenFeign日志輸出

默認OpenFeign日志級別是 NONE,不會打印請求和響應信息。開發測試時開啟詳細日志很有必要。


5.1 定義日志配置類

hm-api 模塊新增配置類:

@Configuration
public class DefaultFeignConfig {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.FULL;}
}

設置日志級別為 FULL,打印完整請求與響應數據。


5.2 配置日志生效方式

  • 局部生效:在單個 FeignClient 中指定

@FeignClient(value = "item-service", configuration = DefaultFeignConfig.class)
  • 全局生效:在 @EnableFeignClients 中指定

@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)

5.3 日志示例

輸出示例(查詢商品接口):

[ItemClient#queryItemByIds] ---> GET http://item-service/items?ids=1001 HTTP/1.1
[ItemClient#queryItemByIds] ---> END HTTP (0-byte body)
[ItemClient#queryItemByIds] <--- HTTP/1.1 200 (127ms)
...
{"id":1001,"name":"巴布豆拉拉褲","price":67100,"stock":10000,...}

? 可以清晰看到請求方法、URL、參數、響應內容,排查問題非常方便!


6. 總結

本篇完整講解了如何在微服務項目中:

  • 引入OpenFeign

  • 實現聲明式遠程調用

  • 優化連接池性能(使用OkHttp)

  • 進行Feign客戶端抽取復用

  • 配置請求日志,方便開發調試

? OpenFeign讓我們的微服務調用變得更加優雅、簡潔、性能更高。
? 配合OkHttp和合理日志配置,是生產級SpringCloud微服務系統必不可少的實踐!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903604.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903604.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903604.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VARIAN安捷倫真空泵維修清潔保養操作SOP換油操作流程內部轉子圖文并茂內部培訓手側

VARIAN安捷倫真空泵維修清潔保養操作SOP換油操作流程內部轉子圖文并茂內部培訓手側

【android bluetooth 案例分析 03】【PTS 測試 】【PBAP/PCE/SSM/BV-10-C】

1. PBAP/PCE/SSM/BV-10-C [PCE Does not share PbapSupportedFeatures bits] 這個 PTS 測試用例 PBAP/PCE/SSM/BV-10-C 的核心目的是驗證 PBAP 客戶端&#xff08;PCE&#xff09;在與舊版服務器通信時&#xff0c;不會發送 PbapSupportedFeatures 特性位&#xff0c;以確保兼…

批量刪除OpenStack實例

在Linux終端實現批量刪除OpenStack實例&#xff0c;支持并發刪除、安全確認、重試機制、優先清理運行中實例 #!/bin/bash # # 增強版 OpenStack 刪除實例腳本 # 功能&#xff1a;支持并發刪除、安全確認、重試機制、優先清理運行中實例 # 更新&#xff1a;2025年4月30日 # ##…

# 基于 Python 和 jieba 的中文文本自動摘要工具

基于 Python 和 jieba 的中文文本自動摘要工具 在信息爆炸的時代&#xff0c;快速準確地提取文本核心內容變得至關重要。今天&#xff0c;我將介紹一個基于 Python 和 jieba 的中文文本自動摘要工具&#xff0c;幫助你高效地從長文本中提取關鍵信息。 一、背景與需求 在處理…

Seaborn數據可視化庫

一、Seaborn介紹&#xff1a;基于Matplotlib的Python數據可視化庫&#xff0c;專注繪制統計圖形&#xff0c;簡化可視化過程&#xff0c;提供高級接口和美觀默認主題。 二、安裝與導入 1.安裝&#xff1a;可使用pip install seaborn或conda install seaborn&#xff0c;也可使…

機器視覺2D碼垛和機器視覺3D碼垛的區別

機器視覺3D碼垛是一種結合3D視覺技術和工業機器人的自動化系統,主要用于在復雜環境中精準識別、定位并堆疊(碼垛)各種形狀、尺寸的物體。它通過3D傳感器(如激光雷達、結構光相機、雙目視覺等)獲取物體的三維空間信息,并結合算法規劃機器人的抓取路徑和碼放策略,實現高效…

Python魔法函數深度解析

一、魔法函數是什么&#xff1f; 魔法函數&#xff08;Magic Methods&#xff09;是Python中以雙下劃線&#xff08;__xx__&#xff09;包裹的特殊方法&#xff0c;它們為類提供了一種與Python內置語法深度集成的能力。這些方法由解釋器自動調用&#xff0c;無需顯式調用&…

C++負載均衡遠程調用學習之自定義內存池管理

目錄 1.內存管理_io_buf的結構分析 2.Lars_內存管理_io_buf內存塊的實現 3.buf總結 4.buf_pool連接池的單例模式設計和基本屬性 5.buf_pool的初始化構造內存池 6.buf_pool的申請內存和重置內存實現 7.課前回顧 1.內存管理_io_buf的結構分析 ## 3) Lars系統總體架構 ? …

流水線問題(算法設計)C++

目錄 一、需求分析 1.1 問題描述 1.2 數據需求 1.3 功能需求 1.4 開發環境 二、概要設計 2.1 抽象數據類型 ADT 的定義 2.2 系統的主要功能模塊 2.3 功能模塊聯系圖 三、詳細設計 3.1 數據結構設計 3.2 主要算法 四、系統運行及結果分析 1. 用戶界面 2. 程序運行…

從實列中學習linux shell4: shell 腳本中 $0 $1 $2 $3 >> 以及 awk 都是干啥的?

在 Linux Shell 腳本中&#xff0c;這些符號和工具的功能如下&#xff1a; 一、位置參數 $0 $1 $2 $3 符號功能說明示例$0腳本自身的文件名若執行 ./test.sh&#xff0c;則 $0 值為 ./test.sh$1第一個參數執行 ./test.sh apple 時&#xff0c;$1 值為 "apple"$2第二…

TM1668芯片學習心得三

一、鍵掃數據儲存地址如下所示&#xff0c;先發讀鍵命令后&#xff0c;開始讀取按鍵數據BYTE1-BYTE5字節&#xff0c;讀數據從低位開始輸出&#xff0c;其中B6和B7位為無效位&#xff0c;此時芯片輸出為0。芯片K和KS引腳對應的按鍵按下時&#xff0c;相對應的字節內的 BIT位為1…

MySQL 基本查詢(一)

文章目錄 Create(insert)指定列的單行插入和全列插入多行全列插入和指定列的多行插入如果主鍵存在&#xff0c;要插入替換存在的值replace 基本select全列查詢指定列查詢where子句where子句案例語文成績在 [80, 90] 分的同學及語文成績數學成績是 58 或者 59 或者 98 或者 99 分…

LeetCode路徑總和系列問題解析:I、II、III的解決方案與優化

文章目錄 引言一、路徑總和 I&#xff08;LeetCode 112&#xff09;問題描述方法思路Java代碼實現復雜度分析 二、路徑總和 II&#xff08;LeetCode 113&#xff09;問題描述方法思路Java代碼實現復雜度分析 三、路徑總和 III&#xff08;LeetCode 437&#xff09;問題描述方法…

NFC 碰一碰發視頻貼牌技術,音頻功能的開發實踐與技術解析

在數字化營銷與信息交互場景中&#xff0c;NFC 碰一碰技術憑借其便捷性和高效性&#xff0c;成為快速傳遞多媒體內容的新選擇。通過 NFC 實現視頻音頻的快速傳輸&#xff0c;不僅能提升用戶體驗&#xff0c;還能為各類場景帶來創新應用。本文將深入探討該功能開發過程中的關鍵技…

跨境電商生死劫:IP篩查三法則破解封號魔咒

一、血淚數據&#xff1a;90%封號案源于IP污染 跨境電商平臺風控系統持續升級&#xff0c;2023年亞馬遜全球封號案例中&#xff0c;67%涉及賬號關聯&#xff08;Marketplace Pulse數據&#xff09;&#xff0c;其中IP問題占比高達91%。更觸目驚心的是&#xff1a; 新號存活率&…

MIPS架構詳解:定義、應用與其他架構對比

一、MIPS架構的定義 MIPS&#xff08;Microprocessor without Interlocked Pipeline Stages&#xff09; 是一種經典的精簡指令集&#xff08;RISC&#xff09;處理器架構&#xff0c;由斯坦福大學John Hennessy團隊于1981年提出&#xff0c;強調高效流水線設計和硬件簡化。 核…

第十六屆藍橋杯 2025 C/C++組 脈沖強度之和

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; 思路詳解&#xff1a; 代碼&#xff1a; 代碼詳解&#xff1a; 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; P12338 [藍橋杯 2025 省 B/Python B 第二場] 脈沖強度…

從Ping到iperf3:深度實戰無線網絡壓測與優化指南

以下是測試無線網絡穩定性的詳細步驟與工具指南&#xff0c;涵蓋信號質量、吞吐量、干擾排查等關鍵維度&#xff1a; 一、基礎信號質量測試 1. 信號強度與覆蓋測試 工具&#xff1a;手機APP&#xff08;WiFi Analyzer、NetSpot&#xff09;或筆記本&#xff08;Acrylic WiFi&a…

MySQL 連接池 (Pool) 常用方法詳解

MySQL 連接池 (Pool) 常用方法詳解 1. 創建連接池 首先需要創建連接池實例&#xff1a; const mysql require(mysql2/promise); // 使用Promise版本const pool mysql.createPool({host: localhost,user: root,password: password,database: test,waitForConnections: true…

大型連鎖酒店集團數據湖應用示例

目錄 一、應用前面臨的嚴峻背景 二、數據湖的精細化構建過程 &#xff08;一&#xff09;全域數據整合規劃 &#xff08;二&#xff09;高效的數據攝取與存儲架構搭建 &#xff08;三&#xff09;完善的元數據管理體系建設 &#xff08;四&#xff09;強大的數據分析平臺…