【OpenFeign 面試專題】

csdn
openfeign

OpenFeign 面試專題

  • OpenFeign 的核心原理
  • OpenFeign 如何與 Ribbon、Hystrix 集成
  • Ribbon的負載均衡策略
  • 如何自定義 OpenFeign 的請求編碼和響應解碼
  • OpenFeign 如何傳遞請求頭(Header)信息
  • OpenFeign 如何處理超時和重試
  • OpenFeign 支持哪些 HTTP 客戶端實現
  • 如何記錄 OpenFeign 的請求日志
  • OpenFeign 如何傳遞文件(上傳/下載)
  • OpenFeign 與 RestTemplate 的區別
  • 如何解決 OpenFeign 調用時出現的 404 或參數錯誤
  • 高頻追問問題

OpenFeign 的核心原理

OpenFeign 是基于 動態代理 的聲明式 HTTP 客戶端,通過接口注解描述 HTTP 請求(如 @RequestMapping),在運行時生成代理類實現遠程調用。其核心流程:

  1. 解析接口方法上的注解(如 @GetMapping),生成 HTTP 請求模板。
  2. 結合 Ribbon 實現負載均衡(從服務注冊中心獲取服務實例列表)。
  3. 通過編碼器(Encoder)將參數轉換為請求體,通過解碼(Decoder)將響應轉換為對象。
  4. 發送 HTTP 請求并處理響應。

OpenFeign 如何與 Ribbon、Hystrix 集成

  • Ribbon:OpenFeign 默認集成 Ribbon 實現客戶端負載均衡。通過配置文件(如 application.yml)或 @RibbonClient 指定服務實例列表和負載策略。
  • Hystrix:通過 feign.hystrix.enabled=true 開啟熔斷,結合 @FeignClient(fallback=Fallback.class) 指定降級類。

Ribbon的負載均衡策略

  • 輪詢策略(RoundRobinRule)

    • 原理:按順序依次選擇服務實例,循環往復。
    • 特點
      • 簡單、公平,每個實例均勻分擔請求。
      • 考慮實例的負載、性能差異。
    • 適用場景:所有實例性能相近且負載均衡要求不高的場景。
  • 隨機策略(RandomRule)

    • 原理:從可用實例中隨機選擇一個。
    • 特點
      • 實現簡單,分散請求壓力。
      • 可能出現短時間內某些實例負載較高。
    • 適用場景:實例性能差異不大,且需要快速分配請求的場景。
  • 加權響應時間策略(WeightedResponseTimeRule)

    • 原理:根據實例的平均響應時間動態分配權重,響應時間越短的實例,被選中的概率越高。
      • 響應時間權重公式:權重 = 總平均響應時間 - 實例平均響應時間
    • 特點
      • 自動感知實例性能,優先選擇響應快的實例。
      • 需要持續計算響應時間,有一定性能開銷。
    • 適用場景:實例性能差異較大,需優先調用高性能節點的場景。
  • 區域感知策略(ZoneAvoidanceRule,默認策略)

    • 原理:優先選擇與調用方處于同一區域的實例,避免跨區域調用;若區域內無可用實例,則跨區域選擇。
    • 特點
      • 減少網絡延遲,提高調用效率
      • 結合了輪詢和可用性過濾(如剔除故障實例)。
    • 適用場景:服務部署在多區域(如多個機房),需優先本地調用的場景。
  • 重試策略(RetryRule)

    • 原理:在某個策略(如輪詢)基礎上,增加重試機制。若首次選擇實例失敗(如超時),則在指定時間內重試其他實例。
    • 特點
      • 提高容錯能力,避免因單次失敗導致請求失敗。
      • 可能增加請求延遲。
    • 適用場景:網絡不穩定或實例偶發故障的場景。
  • 最小并發策略(BestAvailableRule)

    • 原理:選擇當前并發請求數最少的實例。
    • 特點
      • 動態分配負載,避免高并發實例過載。
      • 需要實時統計實例的并發數,實現復雜度較高。
    • 適用場景:實例負載差異明顯,需動態平衡請求壓力的場景。
  • 可用性過濾策略(AvailabilityFilteringRule)

    • 原理:過濾掉故障實例(如連續連接失敗)和高并發實例,然后從剩余實例中輪詢選擇。
    • 特點
      • 提高系統可用性,避免調用問題節點。
      • 依賴實例健康狀態監控。
    • 適用場景:需要自動屏蔽故障節點的場景。
  • 策略對比與選擇建議

    策略核心邏輯優點缺點適用場景
    輪詢(RoundRobin)依次循環選擇簡單、公平忽略實例性能差異實例性能相近的簡單場景
    隨機(Random)完全隨機選擇實現簡單可能負載不均快速分配請求,無特殊要求
    加權響應時間按響應時間動態分配權重智能優化性能計算開銷大實例性能差異大的場景
    區域感知(默認)優先同區域實例減少網絡延遲,高可用依賴區域劃分多區域部署的微服務架構
    重試(Retry)失敗后重試其他實例提高容錯性可能增加延遲網絡抖動或偶發故障場景
    最小并發選擇并發最低的實例動態負載均衡實現復雜,需統計并發數高并發且實例負載不均的場景
    可用性過濾過濾故障和高并發實例提高系統穩定性依賴健康檢查機制需要自動容錯的場景

如何自定義 OpenFeign 的請求編碼和響應解碼

實現 EncoderDecoder 接口,并通過配置類注冊:

@Configuration
public class FeignConfig {@Beanpublic Encoder customEncoder() {return new MyEncoder(); // 處理復雜請求體(如文件上傳)}@Beanpublic Decoder customDecoder() {return new MyDecoder(); // 處理非 JSON 響應(如 XML)}
}

OpenFeign 如何傳遞請求頭(Header)信息

  • 方法 1:使用 @RequestHeader 注解顯式傳遞
    @GetMapping("/api")
    String getData(@RequestHeader("Authorization") String token);
    
  • 方法 2:通過 RequestInterceptor 攔截器全局添加:
    public class AuthInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {template.header("Authorization", "Bearer xxx");}
    }
    

OpenFeign 如何處理超時和重試

  • 超時配置(默認 Ribbon 超時時間為 1s):
    feign:client:config:default:connectTimeout: 5000readTimeout: 5000
    
  • 重試機制:默認不重試,需自定義 Retryer
    @Bean
    public Retryer feignRetryer() {return new Retryer.Default(100, 1000, 3); // 間隔 100ms,最大間隔 1s,重試 3 次
    }
    

OpenFeign 支持哪些 HTTP 客戶端實現

OpenFeign 支持多種 HTTP 客戶端,默認使用 JDK 的HttpURLConnection,可通過配置切換:

  • Apache HttpClient
    <dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId>
    </dependency>
    
  • OKHttp
    feign:httpclient:enabled: falseokhttp:enabled: true
    

如何記錄 OpenFeign 的請求日志

配置日志級別(需 Logger.Level Bean):

@Configuration
public class FeignConfig {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL; // NONE, BASIC, HEADERS, FULL}
}
logging:level:com.example.FeignClient: DEBUG  # 指定 Feign 接口的包路徑

OpenFeign 如何傳遞文件(上傳/下載)

使用 @RequestPartmultipart/form-data 格式:

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String uploadFile(@RequestPart("file") MultipartFile file);

需確保引入 spring-cloud-starter-openfeign 和文件處理依賴(如 spring-web)。

OpenFeign 與 RestTemplate 的區別

特性OpenFeignRestTemplate
使用方式聲明式接口(注解驅動)編程式(手動構建請求)
可讀性高(代碼簡潔,類似 Spring MVC)低(代碼冗余)
負載均衡默認集成 Ribbon需手動結合 Ribbon
熔斷支持需結合 Hystrix 或 Sentinel需手動集成

如何解決 OpenFeign 調用時出現的 404 或參數錯誤

  • 404 錯誤:檢查服務名、路徑、HTTP 方法是否與提供者一致。
  • 參數錯誤
    • 使用 @RequestParam@PathVariable 明確參數傳遞方式。
    • 復雜對象默認轉為請求體(POST 請求),GET 請求需拆解為簡單參數。

高頻追問問題

  • 如何通過 OpenFeign 實現服務發現
    • 集成 Eureka/Nacos,通過 @FeignClient(name = “service-name”) 自動發現服務實例。
  • OpenFeign 的性能調優有哪些手段
    • 使用 OKHttp 或 Apache HttpClient 替代默認實現。
    • 合理配置連接池、超時時間和重試策略。
  • 如何實現 OpenFeign 的請求/響應壓縮
    feign:compression:request:enabled: truemime-types: text/xml, application/jsonresponse:enabled: true
    

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

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

相關文章

Adobe Acrobat Pro setting

防火墻斷網組織彈窗 Adobe軟件突然彈窗“THIS APP HAS BEEN DISABLED”&#xff1f;別慌&#xff0c;幾步教你輕松解決&#xff01; 禁用代理 解決Adobe出現This unlicensed Photoshop app has been disabled.禁止使用 rules:- DOMAIN-KEYWORD,adobe,REJECT

搜索插入位置(js實現,LeetCode:35)

給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法。 示例 1: 輸入: nums [1,3,5,6], target 5 輸出: 2示例 2: 輸入…

5. 前后端實現文件上傳與解析

1. 說明 在實際開發中&#xff0c;比較常見的一個功能是需要在前端頁面中選擇系統中的某個文件上傳到服務器中進行解析&#xff0c;解析后的文件內容可以用來在服務器中當作參數&#xff0c;或者傳遞給其它組件使用&#xff0c;或者需要存儲到數據庫中。所以本文就提供一種方式…

《靈珠覺醒:從零到算法金仙的C++修煉》卷三·天劫試煉(32)萬劍歸宗破妖陣 - 最長遞增子序列(LIS)

《靈珠覺醒:從零到算法金仙的C++修煉》卷三天劫試煉(32)萬劍歸宗破妖陣 - 最長遞增子序列(LIS) 哪吒在數據修仙界中繼續他的修煉之旅。這一次,他來到了一片神秘的萬劍谷,谷中有一座巨大的萬劍歸宗劍陣,劍陣閃爍著神秘的光芒。谷口有一塊巨大的石碑,上面刻著一行文字:…

【redis】使用redis作為緩存時所注意事項

緩存更新策略 在 Redis 緩存中&#xff0c;緩存的更新策略主要有**定期生成&#xff08;定時更新&#xff09;和實時生成&#xff08;即時更新&#xff09;**兩種方式。不同的策略適用于不同的業務場景&#xff0c;涉及性能、數據一致性和系統負載等方面的權衡。 1. 定期生成&…

計算機網絡:計算機網絡的分類

按分布范圍分類&#xff1a;廣域網&#xff0c;城域網&#xff0c;局域網&#xff0c;個域網 按傳輸技術分類&#xff1a;廣播式網絡&#xff0c;點對點網絡 按拓撲結構分類&#xff1a;總線型&#xff0c;環形&#xff0c;星形&#xff0c;網狀 按傳輸介質分類&#xff1a;…

解決pip安裝uv時下載速度慢

驗證優化效果 方案 1&#xff1a;臨時使用國內鏡像源&#xff08;推薦&#xff09; pip install uv -i https://pypi.tuna.tsinghua.edu.cn/simple 速度提升&#xff1a;鏡像源服務器位于國內&#xff0c;帶寬充足&#xff0c;通常可達 1-10MB/s 支持源列表&#xff1a; # 清…

SpringCloud Alibaba——入門簡介

一、是什么 &#xff08;1&#xff09;誕生 2018.10.31&#xff0c;Spring Cloud Alibaba 正式入駐了 Spring Cloud 官方孵化器&#xff0c;并在 Maven 中央庫發布了第一個版本 &#xff08;2&#xff09;介紹 &#xff08;3&#xff09;&#xff1f;何為必須組件 二、能干嘛…

Python完全指南:從基礎到實踐的編程藝術

引言&#xff1a;數字時代的瑞士軍刀 在人工智能與大數據浪潮中&#xff0c;Python如同編程世界的"瑞士軍刀"&#xff0c;以其優雅的語法和強大的生態征服全球開發者。本文將從語言哲學到實戰應用&#xff0c;為您展開Python編程的全景畫卷&#xff0c;揭示這門語言…

Docker 運行 GPUStack 的詳細教程

GPUStack GPUStack 是一個用于運行 AI 模型的開源 GPU 集群管理器。它具有廣泛的硬件兼容性&#xff0c;支持多種品牌的 GPU&#xff0c;并能在 Apple MacBook、Windows PC 和 Linux 服務器上運行。GPUStack 支持各種 AI 模型&#xff0c;包括大型語言模型&#xff08;LLMs&am…

完整例子和調用關系qt OpenGL

項目結構 首先&#xff0c;你需要在 Qt 項目中創建一個類&#xff0c;繼承自 QOpenGLWidget 來進行 OpenGL 渲染。文件結構如下&#xff1a; - main.cpp - MyOpenGLWidget.h - MyOpenGLWidget.cpp - vertex_shader.glsl - fragment_shader.glsl 1. main.cpp 這是 Qt 項目的入口…

VSCode 配置優化指南:打造極致高效的前端開發環境

VSCode 配置優化指南&#xff1a;打造極致高效的前端開發環境 一、基礎環境配置&#xff1a;讓開發更流暢 1. 性能優化設置 // settings.json {"files.autoSave": "afterDelay", // 自動保存&#xff08;延遲1秒&#xff09;"files.exclud…

源IP泄露后如何涅槃重生?高可用架構與自動化防御體系設計

一、架構層解決方案 1. 高防代理架構設計 推薦架構&#xff1a; 用戶 → CDN&#xff08;緩存靜態資源&#xff09; → 高防IP&#xff08;流量清洗&#xff09; → 源站集群&#xff08;真實IP隱藏&#xff09; ↑ Web應用防火墻&#xff08;WAF&#xff09; 實施要點&a…

【英偉達AI論文】多模態大型語言模型的高效長視頻理解

摘要&#xff1a;近年來&#xff0c;基于視頻的多模態大型語言模型&#xff08;Video-LLMs&#xff09;通過將視頻處理為圖像幀序列&#xff0c;顯著提升了視頻理解能力。然而&#xff0c;許多現有方法在視覺主干網絡中獨立處理各幀&#xff0c;缺乏顯式的時序建模&#xff0c;…

無障礙閱讀(Web Accessibility)NVDA打開朗讀查看器后,enter鍵不生效的原因

用NVDA測試Web Accessibility時&#xff0c;打開朗讀查看器&#xff0c;enter鍵會無效&#xff0c;而不打開測試器&#xff0c;就沒有問題&#xff0c;很大原因是被應用的元素不是可聚焦的&#xff0c;解決方法嘗試&#xff1a; 將標簽改為可聚焦的語義化標簽&#xff0c;如 b…

2Android中的AIDL是什么以及如何使用它

一、Android中的AIDL概述 AIDL&#xff08;Android Interface Definition Language&#xff09;是Android系統中用于定義和實現跨進程通信&#xff08;IPC&#xff09;接口的語言。它允許一個進程向另一個進程發送請求并獲取響應&#xff0c;是Android中實現進程間通信的一種重…

Python繪制數據分析中經典的圖形--列線圖

Python繪制數據分析中經典的圖形–列線圖 列線圖是數據分析中的經典圖形&#xff0c;通過背后精妙的算法設計&#xff0c;展示線性模型&#xff08;logistic regression 和Cox&#xff09;中各個變量對于預測結果的總體貢獻&#xff08;線段長短&#xff09;&#xff0c;另外&…

leetcode【面試經典150系列】(一)

目錄 121.買賣股票最佳時機 題目描述 示例 算法分析 代碼(python3) 122.買賣股票最佳時機II 題目描述 示例 算法分析 代碼&#xff08;python3&#xff09; 55.跳躍游戲 題目描述 示例 算法分析 代碼 45.跳躍游戲II 題目描述 示例 算法分析 代碼 121.買賣股票…

為什么會出現redis數據庫?redis是什么?

什么是 Redis? 為什么要用 Redis? 下面我將從 Redis 出現的背景、Redis 的解決方案個來回答。 1、Redis 出現的背景 互聯網的應用越來越多&#xff0c;例如社交網絡、電商、實時服務發展的十分迅速&#xff0c;這就導致了傳統技術棧&#xff08;如關系型數據庫&#xff09;…

Windows 11下Git Bash執行cURL腳本400問題、CMD/PowerShell不能執行多行文本等問題記錄及解決方案

問題 在Postman里可成功執行的POST請求&#xff1a; 找到Postman的Code 因為cURL基本上算是行業標準&#xff0c;所以Postman默認選中cURL&#xff0c;支持切換不同的開發語言&#xff1a; 點擊上圖右上角的復制按鈕&#xff0c;得到cURL腳本。 Windows 11家庭版&#xff…