Spring Cloud OpenFeign 常用注解_筆記

Spring Cloud OpenFeign 提供了一種聲明式、模板化的HTTP客戶端,可以通過簡單的接口描述遠程調用,而不必手動編寫低級的 HTTP 客戶端代碼。FeignClient用法參考:FeignClient用法-筆記-CSDN博客。這里梳理Spring Cloud OpenFeign 常用注解。

1.?@FeignClient

功能:聲明一個Feign客戶端,用于訪問遠程服務。
適用場景:定義需要調用的其他微服務的接口。
注意事項

  • name?或?value?屬性指定服務名(在服務注冊中心注冊的名稱)。
  • 可以配置URL直接指定地址(用于測試或非注冊中心場景)。
  • 支持配置降級處理(通過fallbackfallbackFactory)。

示例

@FeignClient(name = "user-service", url = "http://localhost:8080", fallback = UserClientFallback.class)
public interface UserClient {@GetMapping("/users/{id}")User getUserById(@PathVariable("id") Long id);
}// 降級實現
@Component
public class UserClientFallback implements UserClient {@Overridepublic User getUserById(Long id) {return new User(0L, "默認用戶");}
}

2.?@RequestMapping?及變種

?@RequestMapping?及變種 (@GetMapping,?@PostMapping?等):

功能:指定Feign客戶端方法對應的HTTP方法和路徑。
適用場景:定義遠程調用的具體端點。
注意事項

  • 與Spring MVC中的用法一致,但用于Feign客戶端接口。
  • 路徑中可以使用占位符(配合@PathVariable使用)。

示例

@FeignClient(name = "order-service")
public interface OrderClient {@PostMapping("/orders")Order createOrder(@RequestBody Order order);@GetMapping("/orders/{orderId}")Order getOrder(@PathVariable("orderId") String orderId);
}

3.?@PathVariable

功能:將方法參數綁定到URI模板變量。
適用場景:當URL路徑中包含動態變量時(如RESTful風格)。
注意事項

  • 必須指定valuename屬性來匹配URI模板中的變量名(與 MVC 不同,在Feign中必須顯式指定,不能省略)。
  • 不支持 Spring MVC 的?@PathVariable(required = false)
  • 路徑變量不能為空

示例

@FeignClient(name = "product-service")
public interface ProductClient {@GetMapping("/products/{productId}")Product getProduct(@PathVariable("productId") Long id); // 注意:這里必須指定"productId"
}

4.?@RequestHeader

功能:將方法參數綁定到HTTP請求頭。
適用場景:需要傳遞自定義HTTP頭信息(如認證token)。

  • 傳遞認證令牌(Authorization)
  • 設置內容協商頭(Accept)
  • 自定義業務標識頭

注意事項

  • 可以傳遞單個值,也可以傳遞Map來設置多個請求頭。
  • 支持占位符表達式
  • 不會被 Spring MVC 的?@RequestHeader?解析
  • 如果請求頭的值是動態的,必須用@RequestHeader注解。

示例

@FeignClient(name = "auth-service")
public interface AuthClient {@GetMapping("/userinfo")UserInfo getUserInfo(@RequestHeader("Authorization") String token);// 傳遞多個請求頭@PostMapping("/update")void update(@RequestHeader Map<String, String> headers, @RequestBody UserInfo userInfo);
}

5.?@RequestParam

功能:將方法參數綁定到HTTP請求參數(URL查詢參數)。
適用場景

  • 傳遞單個或少量查詢參數。
  • 非結構化參數傳遞
  • 數組/集合類型參數

注意事項

  • 數組參數格式:?ids=1,2,3?或??ids=1&ids=2
  • 如果參數是可選,需要設置required=false(默認是true)。
  • 當參數較多時,建議使用@SpringQueryMap代替。

示例

@FeignClient(name = "search-service")
public interface SearchClient {@GetMapping("/search")List<Product> searchProducts(@RequestParam("kw") String keyword, @RequestParam(value = "page", required = false, defaultValue = "0") int page);// 數組參數@DeleteMapping("/items")void deleteItems(@RequestParam("ids") List<Long> ids);
}

6.?@SpringQueryMap?

功能:將POJO對象轉換為URL查詢參數。當我們需要將一個對象作為查詢參數傳遞給另一個服務時,使用這個注解可以避免手動拼接URL查詢字符串。
適用場景

  • 在Feign客戶端中,需要傳遞多個查詢參數,而這些參數被封裝在一個對象中。
  • 傳遞復雜或多條件的查詢參數(避免在方法中寫多個@RequestParam)。

注意事項

  • 支持嵌套對象的轉換(通過點號.連接屬性,如user.address.city)。
  • 只能用于Feign客戶端。
  • 適用于GET請求,因為GET請求通常使用查詢參數傳遞數據。
  • GET 請求參數長度限制(約 2048 字符)

示例

@FeignClient(name = "user-service")
public interface UserClient {@GetMapping("/users/search")List<User> searchUsers(@SpringQueryMap UserSearchCriteria criteria);
}// 查詢條件POJO
public class UserSearchCriteria {private String name;private Integer age;private Address address; // 嵌套對象// getters and setters
}public class Address {private String city;private String street;// getters and setters
}//當我們調用userClient.searchUsers(new UserQuery("張三", 25,new Address("beijing","xierqi")))時,
//Feign會生成一個URL:/users?name=張三&age=25&address.city=beijing&address.street=xierqi。

補充說明:

在Spring MVC中,如果我們想在Controller的方法中接收多個查詢參數,可以直接使用一個POJO對象作為參數,而不需要任何注解,Spring MVC會自動將查詢參數綁定到對象中(但要求該對象有默認構造函數,并且屬性名與查詢參數名匹配)。例如:

@Controller
public class UserController {@GetMapping("/users/search")List<User> searchUsers(UserSearchCriteria criteria){//......}
}

但是,在Feign客戶端中,我們不能直接這樣做,因為Feign默認不會將對象轉換為查詢參數,所以需要使用@SpringQueryMap注解。

總結:

注解功能適用場景注意事項
@FeignClient聲明Feign客戶端定義遠程服務調用接口配置服務名、URL、降級等
@RequestMapping指定HTTP方法和路徑定義遠程調用的端點支持各種HTTP方法注解變體
@PathVariable綁定路徑變量RESTful風格的URL路徑參數必須顯式指定變量名
@RequestHeader綁定請求頭傳遞自定義頭信息(如認證token)可傳遞單個頭或多個頭(Map)
@RequestParam綁定查詢參數傳遞少量查詢條件可選參數需設置required=false
@SpringQueryMapPOJO轉查詢參數傳遞復雜或多條件查詢支持嵌套對象,只能用于Feign

使用這些注解,可以方便地定義Feign客戶端,實現微服務之間的優雅調用。常見用法總結:

  1. 服務間調用:首選?@FeignClient?+ Spring Cloud 服務發現
  2. GET 參數
    • 簡單參數 →?@RequestParam
    • 復雜參數 →?@SpringQueryMap
  3. 路徑參數:必須顯式命名?@PathVariable("id")
  4. 請求頭:動態頭用?@RequestHeader
  5. 特殊格式
    • 表單 → 自定義?Encoder
    • 文件 →?@RequestPart(需額外配置)
  6. 錯誤處理
    • 熔斷降級 →?fallback/fallbackFactory
    • 錯誤解碼 → 實現?ErrorDecoder

一個完整示例:

// 完整示例
@FeignClient(name = "user-service",fallbackFactory = UserClientFallbackFactory.class
)
public interface UserClient {@GetMapping("/users/{userId}")User getUser(@PathVariable("userId") String id,@RequestHeader("X-Trace-Id") String traceId);@PostMapping("/users/search")List<User> searchUsers(@SpringQueryMap UserQuery query,@RequestHeader Map<String, String> headers);
}@Component
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {@Overridepublic UserClient create(Throwable cause) {return new UserClient() {@Overridepublic User getUser(String id, String traceId) {return new User("fallback-user");}// ...其他方法降級實現};}
}

相關閱讀:

  • FeignClient用法-筆記-CSDN博客
  • Spring MVC中常用注解_筆記-CSDN博客

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

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

相關文章

移動端自動化Appium框架

文章目錄環境搭建JAVAAndroid SDKGenymotion模擬器環境搭建 JAVA 1、安裝JDK 從官網下載所需安裝包&#xff0c;默認安裝即可。 https://www.oracle.com/cn/java/technologies/downloads/ 2、配置環境變量 設置 - 編輯系統環境變量 - 環境變量。 系統變量下新建JAVA_HOME&a…

算法第26天|貪心算法:用最少數量的箭引爆氣球、無重疊區間、劃分字母區間

今日總結 用最少數量的箭引爆氣球 題目鏈接&#xff1a;452. 用最少數量的箭引爆氣球 - 力扣&#xff08;LeetCode&#xff09; 代碼隨想錄 整體思路&#xff1a; 1、統一度量 &#xff1a; 將所有區間按照左端點進行排序&#xff1a; 用到了二維的sort&#xff0c;在類中需…

最新版的electron通信規則

介紹: 以前electron require(electron/remote).fs 就能調用node中的各種api,最新版可能為了安全考慮,除了主main.js入口文件以外,其他的地方都不能調用node中的api,比如里面的各種函數,如fs,path等。這節課來教大家最新版本的electron如何進行通信。 結構: 了解通信之前…

Python爬蟲實戰:研究PyPLN庫相關技術

1. 引言 隨著全球化的發展,葡萄牙語作為世界第六大語言,其在互聯網上的文本數據量不斷增長。如何從海量的葡萄牙語文本中提取有價值的信息,成為自然語言處理領域的重要研究方向。 PyPLN (Python Natural Language Processing Toolkit) 是一個專門針對葡萄牙語設計的自然語言…

層次分析法代碼筆記

層次分析法 一、核心 在層次分析法中&#xff0c;通過 算術平均法、幾何平均法、特征值法 計算指標權重&#xff0c;再通過 一致性檢驗 確保判斷矩陣邏輯合理&#xff0c;為多準則決策提供量化依據。 二、代碼 &#xff08;一&#xff09;一致性檢驗&#xff08;判斷矩陣合理性…

[精選] 2025最新生成 SSH 密鑰和 SSL 證書的標準流程(Linux/macOS/Windows系統服務器通用方案)

[精選] 2025最新生成 SSH 密鑰和 SSL 證書的標準流程&#xff08;Linux/macOS/Windows系統服務器通用方案&#xff09; 在現代網絡中&#xff0c;SSH&#xff08;安全外殼協議&#xff09;和 SSL&#xff08;安全套接層協議&#xff09;是保證數據傳輸安全和身份驗證的重要技術…

開發框架安全ThinkPHPLaravelSpringBootStruts2SpringCloud復現

PHP-ThinkphpLaravelThinkPHP是一套開源的、基于PHP的輕量級Web應用開發框架綜合工具&#xff1a;武器庫-Thinkphp專檢&#xff08;3-6版本&#xff09;如何判斷是TP6框架開發的web程序&#xff0c;基于源碼、路徑、圖標、基于報錯可發現dex.php?xxx 在其6.0.13版本及以前/?c…

uniapp+vue3小程序點擊保存圖片、保存二維碼

介紹 步驟1:引入必要的API 在script部分,確保引入了uni的相關API,如uni.downloadFile和uni.saveImageToPhotosAlbum。 步驟2:下載圖片到本地 在toInvite函數中,使用uni.downloadFile將圖片下載到本地,并獲取本地路徑。 步驟3:處理權限和保存邏輯 在saveToAlbum函數…

Golang中GROM多表關聯跟原生SQL多表關聯區別

文章目錄前言一、GROM多表關聯二、原生Sql多表關聯前言 對比GROM多表關聯和原生Sql多表關聯 一、GROM多表關聯 適用于返回全部數據需要邏輯外鍵&#xff08;不會在數據庫創建任何約束&#xff09;適合三個表以下的關聯有幾張表就會查詢幾次 type Product struct {gorm.Model …

設計模式六:工廠模式(Factory Pattern)

概念定義一個創建對象的接口&#xff0c;但讓子類決定實例化哪個類。實現示例#include <iostream> #include <memory>// 產品基類 class Product { public:virtual void use() 0;virtual ~Product() default; };// 具體產品A class ConcreteProductA : public Pr…

應用層自定義協議【序列化+反序列化】

文章目錄再談 “協議”重新理解read、write、recv、send和tcp為什么支持全雙工Server.cc網絡版計算機實現Socket封裝&#xff08;模板方法類&#xff09;socket.hpp定制協議JsonJson安裝定義一個期望的報文格式Protocol.hppParser.hppCalculator.hpp完整的處理過程Client.cc三層…

dify創建OCR工作流

實現ocr識別文件內容&#xff0c;引用dify的一個插件&#xff0c;插件名稱&#xff1a;mineru 引用在線版本mineru 具體操作說明&#xff0c;參見視頻&#xff1a; 第六篇&#xff1a;DifyOCR&#xff0c;掃描件最優解_嗶哩嗶哩_bilibili 引用本地部署mineru 上面的這種使用…

備受關注的“Facebook Email Scraper”如何操作?

Facebook Email Scraper&#xff08;臉書郵箱提取工具&#xff09;是一類用于從Facebook平臺提取公開郵箱信息的工具&#xff0c;其核心功能是通過解析用戶主頁、群組、頁面等公開內容&#xff0c;識別并提取其中包含的郵箱地址&#xff0c;為用戶提供結構化的聯系方式數據。這…

【網絡原理】萬字長文解密UDP/TCP——手把手教你理解網絡通信

目錄 1.前言 2.正文 2.1UDP協議 2.1.1UDP協議端格式 2.1.2UDP的特點 2.1.3理解UDP的“不可靠” 2.1.4面向數據報 2.1.5基于UDP的應用層協議 2.2TCP協議 2.2.1TCP協議端格式 2.2.2TCP十個核心機制 2.2.2.1確認應答 2.2.2.2超時重傳 確認應答超時重傳 vs 三次握手 …

MATLAB軟件使用頻繁,企業如何做到“少買多用”?

在制造企業的工程計算、算法研發、系統建模等場景中&#xff0c;MATLAB 已成為不可或缺的核心工具。 無論是動力學建模、控制算法開發&#xff0c;還是信號處理和數據可視化&#xff0c;MATLAB 的高頻使用場景覆蓋了從研發部門到測試部門的多個崗位。然而&#xff0c;企業 IT 負…

數據結構自學Day13 -- 快速排序--“分而治之”

&#x1f536; 一、快速排序&#xff08;Quick Sort&#xff09;&#x1f4cc; 基本思想&#xff1a;分而治之&#xff1a;每次從數組中選一個“基準”&#xff08;pivot&#xff09;&#xff0c;把比它小的放左邊&#xff0c;大的放右邊。對左右子數組遞歸排序。&#x1f9e0;…

Linux 進程與服務管理~進程基礎、進程查看、進程控制、服務管理、開機啟動??

在 Linux 系統中,進程與服務管理是運維和開發的核心技能之一。進程是程序運行的實例,服務是長期運行的后臺進程(守護進程)。掌握進程與服務的管理方法,能有效排查系統問題、優化資源使用。以下從 ??進程基礎、進程查看、進程控制、服務管理、開機啟動?? 五大模塊詳細講…

論文筆記 | Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes

論文地址&#xff1a;Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes 概述&#xff1a;本文提出 RGB-Stacking 基準測試&#xff0c;研究如何僅憑 RGB 攝像頭視覺和本體感知&#xff0c;實現機器人對 復雜幾何物體的高效堆疊。通過結合仿真專家訓練、交互…

React 英語打地鼠游戲——一個寓教于樂的英語學習游戲

&#x1f3af; 英語打地鼠游戲 一個寓教于樂的英語學習游戲&#xff0c;通過經典的打地鼠玩法幫助用戶學習英語單詞。 ? 項目特色 &#x1f3ae; 游戲化學習 經典打地鼠玩法&#xff1a;6 個洞穴&#xff0c;聽英文選單詞即時反饋&#xff1a;答對/答錯立即語音提示計分系…

Qt--Widget類對象的構造函數分析

Widget類對象的構造函數分析&#xff0c;用更直觀的方式解釋這段代碼的作用和工作原理&#xff1a;代碼&#xff1a;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }代碼解析 Widget::Widget(QWidget *parent) // 構造函數定…