Spring Boot 中使用 Feign 調用內網 IP 接口并記錄入參與出參

在微服務架構中,服務間的通信是常見的需求。Spring Cloud 提供的 Feign 客戶端是一個聲明式的 Web 服務客戶端,它使得服務間的調用變得非常簡單。然而,在實際開發中,我們可能需要調用內網 IP 地址的接口,并且希望記錄請求的入參和響應的出參,以便于調試和監控。本文將詳細介紹如何實現這一需求。

1. Feign 簡介

Feign 是一個基于 Java 的聲明式 Web 服務客戶端,它使得編寫 HTTP 客戶端變得更加容易。通過 Feign,你可以使用接口和注解的方式定義與遠程服務的交互,而無需編寫復雜的 HTTP 請求代碼。Feign 與 Spring Cloud 集成后,可以方便地在 Spring Boot 項目中使用。

2. 調用內網 IP 接口

在某些場景下,我們需要調用內網 IP 地址的接口。例如,你的微服務部署在內網環境中,需要訪問其他內網服務。Feign 支持直接指定服務的 URL,這使得調用內網 IP 接口變得非常簡單。

2.1 配置 Feign 客戶端

在 Spring Boot 項目中,可以通過 @FeignClient 注解的 url 屬性直接指定內網 IP 地址。例如:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient(value = "inner-service", url = "http://192.168.1.100:8080")
public interface InnerServiceClient {@GetMapping("/api/endpoint")String getSomeData();
}

在上述代碼中,value 屬性用于標識服務名稱,而 url 屬性直接指定了內網 IP 地址和端口。

3. 記錄入參和出參

為了更好地調試和監控,我們可能需要記錄請求的入參和響應的出參。Feign 提供了強大的攔截器機制,可以通過實現 RequestInterceptorDecoder 接口來實現這一需求。

3.1 自定義請求攔截器

請求攔截器可以在請求發送前對請求進行處理。通過實現 RequestInterceptor 接口,我們可以記錄請求的入參:

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class FeignRequestInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {// 獲取請求的入參String requestBody = new String(requestTemplate.request().body(), StandardCharsets.UTF_8);log.info("Feign 請求入參:{}", requestBody);}
}

3.2 自定義響應攔截器

響應攔截器可以在響應解碼時對響應進行處理。通過實現 Decoder 接口,我們可以記錄響應的出參:

import feign.FeignException;
import feign.Request;
import feign.Response;
import feign.codec.DecodeException;
import feign.codec.Decoder;
import io.micrometer.core.instrument.util.IOUtils;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;@Slf4j
public class FeignLogDecoder implements Decoder {private final Decoder delegate;public FeignLogDecoder(Decoder delegate) {this.delegate = delegate;}@Overridepublic Object decode(Response response, Type type) throws IOException {// 獲取響應體String responseBody = IOUtils.toString(response.body().asInputStream(), StandardCharsets.UTF_8);log.info("Feign 響應出參:{}", responseBody);// 將響應體重新寫入 Response 對象中,供后續處理return delegate.decode(response.toBuilder().body(responseBody, StandardCharsets.UTF_8).build(), type);}
}

3.3 配置 Feign 客戶端

將自定義的攔截器和解碼器注冊到 Feign 客戶端中:

import feign.codec.Decoder;
import feign.optionals.OptionalDecoder;
import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FeignConfig {@Beanpublic RequestInterceptor requestInterceptor() {return new FeignRequestInterceptor();}@Beanpublic Decoder feignDecoder() {return new FeignLogDecoder(new OptionalDecoder(new ResponseEntityDecoder(new SpringDecoder())));}
}

3.4 使用 Feign 客戶端

在 Feign 客戶端中使用自定義的配置類:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;@FeignClient(value = "inner-service", url = "http://192.168.1.100:8080", configuration = FeignConfig.class)
public interface InnerServiceClient {@GetMapping("/api/endpoint")String getSomeData();
}

4. 配置 Feign 日志級別

為了更好地調試和記錄日志,可以在 application.ymlapplication.properties 文件中配置 Feign 的日志級別:

logging:level:com.example.feign: DEBUG

5. 注意事項

  1. 網絡連通性:確保調用方服務可以訪問內網 IP 地址。如果調用方和被調用方不在同一網絡,可能需要配置代理或網關。
  2. 安全性:內網 IP 地址通常不暴露在公網中,確保網絡環境安全,避免敏感信息泄露。
  3. 服務發現:如果你使用了服務發現(如 Eureka 或 Consul),可以直接通過服務名調用,而不需要硬編碼 IP 地址。如果必須使用 IP 地址,確保 IP 地址不會頻繁變動。
  4. 性能影響:記錄日志可能會對性能產生一定影響,建議在生產環境中根據實際需求調整日志級別。
  5. 線程安全RequestTemplateResponse 是線程安全的,因此在攔截器中直接操作這些對象是安全的。
  6. 敏感信息處理:如果請求或響應中包含敏感信息(如密碼、令牌等),需要在日志中進行脫敏處理。

6. 總結

通過上述步驟,我們可以在 Spring Boot 項目中使用 Feign 調用內網 IP 地址的接口,并記錄請求的入參和響應的出參。這不僅可以幫助我們更好地調試和監控服務間的通信,還可以提高系統的可維護性。希望本文對你有所幫助!

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

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

相關文章

【Java】 使用 HTTP 響應狀態碼定義web系統返回碼

系統狀態碼定義 public interface GlobalErrorCodeConstants {ErrorCode SUCCESS new ErrorCode(0, "成功");// 客戶端錯誤段 ErrorCode BAD_REQUEST new ErrorCode(400, "請求參數不正確");ErrorCode UNAUTHORIZED new ErrorCode(401, "賬號未登…

如何搭建spark yarn模式的集群

一、基礎環境準備 ?安裝JDK 1.8? 所有節點需安裝JDK并配置環境變量&#xff0c;確保JAVA_HOME正確指向安裝路徑14。?部署Hadoop集群? 安裝Hadoop&#xff08;推薦3.x版本&#xff09;&#xff0c;配置YARN資源管理器4。在yarn-site.xml中啟用資源調度&#xff1a; <pro…

python22-元組、列表、字典、集合推導式

課程&#xff1a;B站大學 記錄python學習&#xff0c;直到學會基本的爬蟲&#xff0c;使用python搭建接口自動化測試就算學會了&#xff0c;在進階webui自動化&#xff0c;app自動化 循環語句小作業 元組推導式列表推導式字典推導式實踐是檢驗真理的唯一標準 推導式 簡介 Pytho…

探索 CameraCtrl模型:視頻生成中的精確攝像機控制技術

在當今的視頻生成領域&#xff0c;精確控制攝像機軌跡一直是一個具有挑戰性的目標。許多現有的模型在處理攝像機姿態時往往忽略了精準控制的重要性&#xff0c;導致生成的視頻在攝像機運動方面不夠理想。為了解決這一問題&#xff0c;一種名為 CameraCtrl 的創新文本到視頻模型…

跨端開發技術總結

1.electron&#xff1a; 基于node.js 桌面端&#xff1a;window / linux / macos 手機端&#xff1a;無 頁面&#xff1a;網頁開發相關技術都可以 2.tauri 基于rust 桌面端&#xff1a;window / linux / macos 手機端&#xff1a;android / IOS 頁面&#xff1a;網頁開…

單片機-89C51部分:7、中斷

飛書文檔https://x509p6c8to.feishu.cn/wiki/A5gcwyL5giq1JOkkcsscn8eLnzf 一、中斷的作用 中斷是為使單片機具有對外部或內部隨機發生的事件實時處理而設置的&#xff0c;中斷功能的存在&#xff0c;很大程度上提高了單片機處理外部或內部事件的能力。它也是單片機最重要的功…

0805登錄_注冊_token_用戶信息_退出-網絡ajax請求2-react-仿低代碼平臺項目

文章目錄 1 JWT1.1 JWT結構1.2 工作流程1.3 優點1.4 缺點1.5 安全實踐1.6. 適用場景1.7 JWT與OAuth2**8. 示例代碼&#xff08;Node.js&#xff09;** 2 用戶mock和api3 注冊4 登錄5 token存儲6 請求攔截器設置token6 獲取用戶信息7 退出登錄結語 1 JWT JSON Web Token&#x…

大模型入門

一、模型入門路徑 1. 學習預備知識 編程語言&#xff1a;熟練掌握Python編程語言&#xff0c;包括基本語法、數據結構&#xff08;列表、字典、元組等&#xff09;、面向對象編程、文件操作等。Python有豐富的機器學習和深度學習庫&#xff0c;方便進行大模型的開發和實驗。數…

把dll模塊注入到游戲進程的方法_插APC注入

一、概述 APC是異步過程調用,系統創建線程的時候會為線程創建一個APC隊列,當線程調用SleepEx,WaitSingleObjectEx等函數時,并把線程狀態被設置為可提醒狀態時,線程并不會睡眠,而是檢查APC隊列是否為空,如果不為空,轉去執行APC隊列中的每一項,因此給目標進程中的線程插…

git 如何清空當前分支的歷史提交記錄,僅保留最后一次提交

本方法基于新建 Git 孤立分支實現&#xff1a; 1. ??首先檢出待清理的分支 在 IDEA 右下角檢查當前分支名稱 或執行 git branch 確認。如果不在目標分支上&#xff0c;會顯示 (HEAD detached at xxxxx)&#xff0c;這時需要先切換分支&#xff1a; git checkout 原分支名 2.…

【C++】Googletest應用

Googletest 1 配置 使用cmake配置&#xff1a; 具體文件后面上傳補充 ./test.out --gtest_filterXXXTest.xxx 2 gdb 為了跟蹤流程&#xff0c;可以使用gdb&#xff1b; gdb ./xxx.out gdb --args ./gtest --gtest_filterxxx.xxx設置運行參數 set args --gtest_filterxxx.…

JavaScript:從DOM概述到window對象的常見事件

一、BOM概述 1.BOM的概念 BOM&#xff08;Browser Object Model&#xff09;即瀏覽器對象模型&#xff0c;它提供了獨立于內容而與瀏覽器窗口進行交互的對象&#xff0c;其核心對象是window 2.BOM的構成 BOM比DOM更大&#xff0c;它包含DOM window對象是瀏覽器的頂級對象&a…

qobject與event事件應用

int main(int argc, char *argv[]) {QApplication a(argc, argv);MyWidget mainWidget;mainWidget.setWindowTitle("QObject與事件處理示例");mainWidget.resize(200, 200);mainWidget.show();return a.exec(); }QApplication a(argc, argv);&#xff1a;創建 QAppli…

QTableView復選框居中

目錄 方法一&#xff1a;QSS方法2:自定義復選框委托類一、構造函數 CheckBoxDelegate()二、paint() 方法三、editorEvent() 方法四、關鍵設計要點五、擴展應用場景六、代碼示例&#xff08;補充&#xff09; 方法一&#xff1a;QSS QTableView::indicator {position: relative…

基于QT的仿QQ音樂播放器

一、項目介紹 該項目是基于QT開發的?樂播放軟件&#xff0c;界面友好&#xff0c;功能豐富&#xff0c;主要功能如下&#xff1a; 窗口hand部分&#xff1a; 點擊最小化按鈕&#xff0c;窗口最小化 點擊最大化按鈕&#xff0c;窗口最大化 點擊關閉按鈕&#xff0c;程序退出 …

SQL知識點合集---第二彈

數據一 <select id"listPositionAuditCheckSample" resultType"net.nxe.cloud.content.server.entity.PositionAuditCheckSample"><trim prefixOverrides"union all"><if test"userSampleCount ! null and userSampleCount…

【QT】QT控制硬件

QT控制硬件 1.上位機程序開發2.具體例子控制led燈3. linux中的函數跟QT類里面的函數同名&#xff0c;發生沖突4.示例代碼 1.上位機程序開發 QT做一個上位機程序&#xff0c;控制底層的硬件設備(下位機) 總結&#xff1a; 在構造函數里面去初始化&#xff0c;打開硬件驅動在析…

Flutter介紹、Flutter Windows Android 環境搭建 真機調試

目錄 Flutter介紹 Windows 環境搭建 1.安裝配置JDK 2.下載安裝Android Studio 3.下載配置Flutter SDK ?4.運行Flutter doctor命令檢測環境是否配置成功 ?5.打開Android Studio安裝Flutter/Dart 插件 ?6.插件運行Flutter項目 ?編輯 Flutter Android真機調試 Flut…

Android Studio 中使用 SQLite 數據庫開發完整指南(Kotlin版本)

文章目錄 1. 項目準備1.1 創建新項目1.2 添加必要依賴 2. 數據庫設計3. 實現數據庫3.1 創建實體類 (Entity)3.2 創建數據訪問對象 (DAO)3.3 創建數據庫類 4. 創建 Repository5. 創建 ViewModel6. 實現 UI 層6.1 創建筆記列表 Activityactivity_notes_list.xmlNotesListActivity…

Vue基礎(7)_計算屬性

計算屬性(computed) 一、使用方式&#xff1a; 1.定義計算屬性&#xff1a; 在Vue組件中&#xff0c;通過在 computed 對象中定義計算屬性名稱及對應的計算函數來創建計算屬性。計算函數會返回計算屬性的值。 2.在模板中使用計算屬性&#xff1a; 在Vue的模板中&#xff0c;您…