重生之我在暑假學習微服務第八天《OpenFeign篇》

  • ?個人主頁:VON
  • 文章所屬專欄:微服務

?

微服務系列文章

重生之我在暑假學習微服務第一天《MybatisPlus-上篇》
重生之我在暑假學習微服務第二天《MybatisPlus-下篇》
重生之我在暑假學習微服務第三天《Docker-上篇》
重生之我在暑假學習微服務第四天《Docker-下篇》
重生之我在暑假學習微服務第五天《Docker部署項目篇》
重生之我在暑假學習微服務第六天《微服務之拆分項目篇》
重生之我在暑假學習微服務第七天《微服務之服務治理篇》
未完待續....

特別聲明:本系列所涉及資料皆為黑馬程序員課程中的資料

目錄

?一、認識OpenFeign

1、引入依賴

?2、在啟動類中引入注解?編輯

3、編寫客戶端

4、開始調用

二、實現原理

1. 核心組件與工作流程

(1)接口掃描與代理生成

(2)方法注解解析

(3)HTTP 請求構建與發送

(4)響應處理與結果轉換

2. 關鍵組件詳解

三、利用連接池來進行優化

1、引入依賴

2、修改yaml文件

四、最佳使用方式

1、創建hm-api模塊

?2、改造hm-api模塊

?3、在cart模塊引入api依賴

4、修改啟動類?

5、測試

五、日志

結語


?

?一、認識OpenFeign

不知道昨天的大家學習的如何了,今天和昨天學的東西大致一致,就是利用新技術(OpenFeign )來簡化我們的代碼。

OpenFeign 是一個聲明式的 HTTP 客戶端框架,主要用于簡化 RESTful API 的調用。它通過注解和接口定義的方式,讓開發者能夠以更簡潔的方式編寫 HTTP 請求邏輯,而無需手動處理底層的 HTTP 通信細節。

1、引入依賴

<!--        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、在啟動類中引入注解

3、編寫客戶端

4、開始調用

先導入

?這樣就直接將上面這一段簡化成了一行代碼

啟動成功!!!?

?

二、實現原理

┌─────────────────┐  啟動時掃描  ┌───────────────────────────────┐
│  @EnableFeignClients  ────────→  掃描@FeignClient標記的接口   │
└─────────────────┘             └──────────────┬────────────────┘│
┌─────────────────┐  生成動態代理  ┌────────────▼────────────────┐
│  Spring容器注冊  ←──────────────  為接口創建JDK動態代理對象    │
└────────┬────────┘             └───────────────────────────────┘│
┌────────▼────────┐  調用接口方法  ┌───────────────────────────────┐
│  業務代碼注入接口  ───────────────→  觸發動態代理的invoke方法    │
└─────────────────┘             └────────────┬────────────────┘│
┌────────────────────────────────────────────▼─────────────────────────┐
│                           解析請求信息                                │
│  1. 解析@FeignClient的服務名、@GetMapping等注解的HTTP方法/路徑        │
│  2. 提取方法參數(@PathVariable/@RequestParam等)                     │
│  3. 拼接基礎URL(服務名 + 接口路徑)                                  │
└────────────────────────────────────┬─────────────────────────────────┘│
┌────────────────────────────────────▼─────────────────────────────────┐
│                           服務地址解析                                │
│  1. 若集成服務發現(Eureka/Nacos),通過服務名獲取實例列表             │
│  2. 若集成負載均衡(Ribbon),選擇具體服務實例(如輪詢/隨機策略)      │
│  3. 生成最終請求地址(如http://192.168.1.100:8080/users/1)           │
└────────────────────────────────────┬─────────────────────────────────┘│
┌────────────────────────────────────▼─────────────────────────────────┐
│                           構建HTTP請求                               │
│  1. Encoder將請求參數序列化(如JSON)                                 │
│  2. 組裝請求頭(默認頭 + 自定義Interceptor添加的頭)                  │
│  3. 構建完整請求對象(Method/URL/Body/Headers)                       │
└────────────────────────────────────┬─────────────────────────────────┘│
┌────────────────────────────────────▼─────────────────────────────────┐
│                           發送HTTP請求                               │
│  1. 通過Client組件(默認HttpURLConnection,可替換為OkHttp)發送請求   │
│  2. 若配置Retryer,失敗時執行重試邏輯                                │
└────────────────────────────────────┬─────────────────────────────────┘│
┌────────────────────────────────────▼─────────────────────────────────┐
│                           處理響應結果                                │
│  1. 接收響應(狀態碼/響應體)                                         │
│  2. 若狀態碼非2xx,拋出FeignException(或觸發fallback)               │
│  3. Decoder將響應體反序列化為返回值對象(如User)                     │
└────────────────────────────────────┬─────────────────────────────────┘│
┌─────────────────┐  返回結果  ┌─────▼───────────┐
│  業務代碼接收結果  ←──────────  動態代理返回數據  │
└─────────────────┘             └─────────────────┘

1. 核心組件與工作流程

OpenFeign 的工作流程可分為四個關鍵步驟:

(1)接口掃描與代理生成
  • 啟動時掃描:通過?@EnableFeignClients?注解觸發掃描,Spring 會掃描指定包下所有被?@FeignClient?注解標記的接口。
  • 動態代理創建:對每個?@FeignClient?接口,OpenFeign 會通過?Feign.Builder?創建一個動態代理對象(JDK 動態代理),并將其注冊到 Spring 容器中。
    • 后續業務代碼中注入該接口時,實際使用的是這個代理對象。
(2)方法注解解析

當調用代理對象的接口方法時,代理會觸發以下操作:

  • 解析注解信息:解析方法上的?@RequestMapping@GetMapping@PostMapping?等注解,提取 HTTP 方法(GET/POST 等)、URL 路徑、請求參數、請求頭等信息。
  • 拼接請求 URL:結合?@FeignClient?中的?value(服務名)和方法上的路徑,生成完整的請求 URL(如?http://服務名/路徑)。
    • 服務名會通過服務發現(如 Eureka、Nacos)轉換為實際的服務地址。
(3)HTTP 請求構建與發送
  • 構建請求:根據解析到的信息,OpenFeign 會構建一個 HTTP 請求對象(包含 URL、方法、參數、header 等)。
  • 執行請求:通過內部的?Client?組件發送 HTTP 請求。默認使用 JDK 原生的?HttpURLConnection,也可配置為 OkHttp、Apache HttpClient 等。
    • 若集成了負載均衡(如 Ribbon、Spring Cloud LoadBalancer),會先通過負載均衡策略選擇具體服務實例的地址。
(4)響應處理與結果轉換
  • 接收響應:Client 組件接收 HTTP 響應,解析響應狀態碼、響應體等。
  • 結果轉換:根據接口方法的返回值類型,將響應體轉換為對應的 Java 對象(默認使用 Jackson 進行 JSON 反序列化)。
  • 異常處理:若響應狀態碼非 2xx,會根據配置拋出對應的異常(如?FeignException)。

2. 關鍵組件詳解

  • FeignClient?注解:標記接口為 Feign 客戶端,包含服務名、URL、 fallback 等配置。
  • Contract:定義注解 解析規則,默認支持 Spring MVC 的注解(如?@RequestMapping),也可自定義。
  • Encoder/Decoder
    • Encoder:將請求參數對象轉換為 HTTP 請求體(如 JSON 序列化)。
    • Decoder:將 HTTP 響應體轉換為接口方法的返回值對象。
  • Client:實際執行 HTTP 請求的組件,可替換為 OkHttp、HttpClient 等。
  • Retryer:請求失敗時的重試策略,默認不重試,可自定義重試邏輯。
  • Interceptor:請求 / 響應攔截器,可用于統一添加 header、日志打印等。

OpenFeign 的核心是通過動態代理將接口方法調用映射為 HTTP 請求,其實現依賴于:

  • 注解解析提取請求信息;
  • 動態代理生成接口實現類;
  • 可擴展的 HTTP 客戶端發送請求;
  • 序列化 / 反序列化處理數據轉換。

三、利用連接池來進行優化

1、引入依賴

2、修改yaml文件

直接在最后添加即可

四、最佳使用方式

1、創建hm-api模塊

引入相關依賴

?2、改造hm-api模塊

將cart服務中的Item相關的都剪切過來

?3、在cart模塊引入api依賴

4、修改啟動類?

?最后修改下啟動類使得他們能夠連接起來

5、測試

可以看到數據正常顯示,修改成功!

五、日志

可以看到我們這里發起請求的時候并沒有日志

先添加一個類來存儲日志級別

在啟動類中應用一下?

重新啟動項目發起請求查看日志,可以看到這里的日志十分完整了?

結語

本文介紹了微服務開發中使用OpenFeign的技術要點。主要內容包括:1)OpenFeign的基本使用,通過聲明式接口簡化HTTP調用;2)核心原理分析,包括動態代理生成、注解解析、請求構建和響應處理流程;3)優化實踐,如引入連接池提高性能;4)最佳使用方式,通過api模塊統一管理服務接口;5)日志配置方法,便于調試監控。文章結合具體代碼示例,詳細講解了如何利用OpenFeign簡化微服務間的遠程調用,并給出了性能優化和規范使用的建議。

?

?

?

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

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

相關文章

風光儲綜合能源系統雙層優化規劃設計【MATLAB模型實現】

本模型基于雙層優化框架&#xff0c;利用KKT條件、大M法、對偶理論求解&#xff0c;專注于綜合能源系統&#xff08;微電網&#xff09;多電源容量優化配置的模型介紹。代碼采用CPLEX求解器&#xff0c;注釋詳盡&#xff0c;非常適合新手學習該類問題的建模與求解思路。 模型總…

雪花算法重復id問題

原理解析 雪花算法實現簡單、適配性強&#xff0c;無論是電商訂單、日志追蹤還是分布式存儲&#xff0c;都能滿足 “唯一、有序、高效、可擴展” 的核心需求&#xff0c;因此成為分布式ID主流選擇。雪花算法生成的ID是一個64位的整數&#xff0c;由多段不同意義的數字拼接而成&…

MQTT 入門教程:三步從 Docker 部署到 Java 客戶端實現

在物聯網&#xff08;IoT&#xff09;與邊緣計算快速發展的今天&#xff0c;設備間的高效通信成為核心需求。MQTT 作為一種輕量級的發布 / 訂閱模式協議&#xff0c;憑借其低帶寬占用、強穩定性和靈活的消息路由能力&#xff0c;已成為物聯網通信的事實標準。無論是智能家居的設…

公網服務器上Nginx或者Openresty如何屏蔽IP直接掃描

0x01 背景云服務器很多時候為了通信需要設置公網訪問&#xff0c;但是網絡當中存在很多的掃描器&#xff0c;無時無刻在掃描&#xff0c;當80,443端口暴露時&#xff0c;成了這些掃描IP的攻擊對象&#xff0c;無時無刻收到威脅。0x02 掃描攻擊方式1.直接通過公網IP地址進行一些…

C語言(長期更新)第8講 函數遞歸

C語言&#xff08;長期更新&#xff09; 第8講:函數遞歸 跟著潼心走&#xff0c;輕松拿捏C語言&#xff0c;困惑通通走&#xff0c;一去不回頭~歡迎開始今天的學習內容&#xff0c;你的支持就是博主最大的動力。 目錄 C語言&#xff08;長期更新&#xff09; 第8講 函數遞歸…

[硬件電路-129]:模擬電路 - 繼電器的工作原理、關鍵指標、常用芯片與管腳定義

一、工作原理繼電器是一種基于電磁感應原理的自動開關裝置&#xff0c;通過控制小電流電路實現大電流電路的通斷。其核心結構包括&#xff1a;電磁鐵&#xff08;線圈鐵芯&#xff09;&#xff1a;通電時產生磁場&#xff0c;吸引銜鐵動作。觸點系統&#xff1a;包含常開觸點&a…

Haproxy調度算法 - 靜態算法介紹與使用

文章目錄一、概述二、socat工具三、static-rr四、firstHAProxy通過固定參數 balance 指明對后端服務器的調度算法&#xff0c;該參數可以配置在listen或backend選項中。HAProxy的調度算法分為靜態和動態調度算法&#xff0c;但是有些算法可以根據參數在靜態和動態算法中相互轉換…

模擬激光相機工作站版本6.0 5.2.32 6.0.44 6.031 5.2.20

模擬激光相機工作站版本6.0 5.2.32 6.0.44 6.031 5.2.20

AWS Blockchain Templates:快速部署企業級區塊鏈網絡的終極解決方案

無需精通底層架構&#xff0c;一鍵搭建Hyperledger Fabric或以太坊網絡&#xff01;AWS Blockchain Templates 可幫助您快速基于不同的區塊鏈框架在 AWS 上創建和部署區塊鏈網絡。區塊鏈是一種分布式數據庫技術&#xff0c;用于維護不斷增長的交易記錄和智能合約集合&#xff0…

Vue 服務端渲染 Nuxt 使用詳解

Nuxt 是基于 Vue 的高層框架&#xff0c;專注于服務器端渲染應用開發。它封裝了繁瑣的配置和通用模式&#xff0c;提供了開箱即用的 SSR 功能&#xff0c;使開發者能夠專注于編寫業務邏輯。 1. Nuxt 的核心特性 SSR 支持&#xff1a;默認支持服務端渲染&#xff0c;提高應用性…

使用ACK Serverless容器化部署大語言模型FastChat

核心概念 阿里云ACK Serverless&#xff1a;是一種基于 Kubernetes 的無服務器容器服務。用戶無需管理底層節點和服務器&#xff0c;即可快速部署容器化應用&#xff0c;并根據實際使用的 CPU 和內存資源按需付費&#xff0c;只專注于應用本身而非基礎設施管理。 FastChat&…

最新Android Studio漢化教程--兼容插件包

[ ] 軟件版本&#xff1a;Android Studio Meerkat Feature Drop | 2024.3.2 Build #AI-243.25659.59.2432.13423653, built on April 30, 2025 Runtime version: 21.0.613368085-b895.109 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Toolkit: sun.awt.windows.WT…

Unity_數據持久化_IXmlSerializable接口

Unity數據持久化 三、XML數據持久化 3.5 IXmlSerializable接口 3.5.1 IXmlSerializable接口基礎概念 什么是IXmlSerializable接口&#xff1a; IXmlSerializable 是.NET框架提供的一個接口&#xff0c;允許類自定義XML序列化和反序列化的過程。當默認的XML序列化行為無法滿足需…

如何快速解決PDF解密新方法?

有時從網絡下載的PDF文檔會帶有加密限制&#xff0c;導致無法編輯、復制或打印。它的體積僅約10MB&#xff0c;無需安裝&#xff0c;解壓即用。遇到受限制的文件時&#xff0c;只需將其拖入界面&#xff0c;選擇是否覆蓋原文件&#xff0c;點擊執行&#xff0c;瞬間完成解密。「…

譯|數據驅動智慧供應鏈的構成要素與關聯思考

數據質量&#xff0c;通過識別關鍵決策和瓶頸構建信息供應鏈。該模型適用于優化庫存管理、自動化物流、預測需求、實現產品全生命周期追溯及應對突發風險。例如&#xff0c;通過AI機器人自動管理倉庫&#xff0c;或利用數字孿生模擬和優化全球采購網絡。 匯總來自三篇文章&…

OS21.【Linux】環境變量

目錄 1.與環境變量有關的實驗 A.對比命令和自制程序的運行 為什么.像ls、pwd這樣的命令運行是不需要加路徑? 執行自制程序而不加路徑的方法,看看PATH環境變量 方法1:將自制程序移動到系統的搜索路徑下 方法2:臨時修改PATH環境變量 B.查看系統中所有環境變量 解釋幾個常…

加密流量論文復現:《Detecting DNS over HTTPS based data exfiltration》(上)

本文將以我個人的理解去閱讀該篇流量加密論文&#xff0c;并在下一篇盡力對其中的實驗部分進行復現。話不多說&#xff0c;先從論文開始著手。 內容介紹 傳統的DNS(Domain Name System)協議是以明文傳輸的。DNS作為互聯網的基礎設施&#xff0c;最初設計時主要考慮的是功能和效…

Apache RocketMQ 中Message (消息)的核心概念

好的&#xff0c;我們來深入理解一下 Apache RocketMQ 中 Message (消息) 這個核心概念。這份文檔詳細闡述了消息的定義、在模型中的位置、內部屬性、約束和使用建議。 你可以將 Message 看作是 RocketMQ 系統中數據傳輸和處理的最小原子單位。它承載了業務數據&#xff0c;并附…

C 語言問題

1. C語言中 union 與 struct 的區別類型structunion內存分配機制編譯器為每個成員?獨立分配內存空間&#xff0c;總內存大小 所有成員大小之和&#xff08;考慮內存對齊&#xff09;所有成員?共享同一段內存空間&#xff0c;總內存大小 ?最大成員的大小?數據存儲特性1. 所…

[ LeetCode優選算法專題一雙指針-----盛最多的水]

1.題目鏈接 LeetCode盛最多的水 2.題目描述 3.題目解析 問題本質分析 "盛最多水的容器" 問題可以抽象為&#xff1a;在坐標軸上有 n 條垂直線段&#xff0c;第 i 條線段的兩個端點分別是 (i, 0) 和 (i, height [i])。找到兩條線段&#xff0c;使得它們與 x 軸共同…