【OpenFeign】基礎使用

【OpenFeign】基礎使用

  • 1. Feign介紹
    • 1.1 使用示例
    • 1.2 Feign與RPC對比
    • 1.3 SpringCloud Alibaba快速整合OpenFeign
      • 1.3.1 詳細代碼

1. Feign介紹

1.什么是 Feign

Feign 是 Netflix 開發的一個 聲明式的 HTTP 客戶端,在 Spring Cloud 中被廣泛使用。它的目標是:讓我們調用遠程 HTTP API 的方式,像調用本地接口一樣簡單。

換句話說:

  • 不用手寫 RestTemplate 的各種請求
  • 只要定義一個接口 + 注解,Spring Cloud Feign 就會幫你生成實現類,并通過 HTTP 調用對應的遠程服務。

2.Feign 的核心特點

  • 聲明式調用:只需在接口上加注解 (@FeignClient),不用寫具體實現。

  • 與 Spring Cloud 集成:能和 Eureka、Nacos 等注冊中心結合,實現服務發現。

  • 內置負載均衡:在 Spring Cloud Netflix 時代默認結合 Ribbon,現在一般結合 Spring Cloud LoadBalancer。

  • 支持攔截器:可以統一處理請求頭(如 token)、日志打印、重試等。

  • 支持編碼解碼:內置 JSON 編解碼,可以和 Jackson、Gson 等整合。

3.Feign 的發展

Netflix Feign(早期版本):最初由 Netflix 開發,后被 Spring Cloud 整合。
OpenFeign(現在常用的版本):Spring Cloud 現在默認使用的是 Spring Cloud OpenFeign,它是對 Feign 的增強版本。

1.1 使用示例

假設有一個 user-service 提供 REST 接口:

@RestController
@RequestMapping("/user")
public class UserController {@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return new User(id, "張三");}
}

在另一個服務(比如 order-service)中,我們要調用 user-service:
① 定義 Feign 接口

@FeignClient(name = "user-service")  // user-service 是注冊在 Nacos/Eureka 上的服務名
public interface UserClient {@GetMapping("/user/{id}")User getUserById(@PathVariable("id") Long id);
}

② 注入并調用

@Service
public class OrderService {@Autowiredprivate UserClient userClient;public void createOrder(Long userId) {User user = userClient.getUserById(userId); // 直接像調用本地方法一樣System.out.println("下單用戶: " + user.getName());}
}

這樣,Feign 就會幫你把 getUserById() 變成 HTTP 調用。

1.2 Feign與RPC對比

特性Feign(HTTP 客戶端)RPC(Dubbo/gRPC 等)
協議HTTP/HTTPS (REST)TCP/HTTP2/自定義協議
序列化方式JSON / XMLProtobuf / Hessian / Thrift
調用方式HTTP 請求,返回 JSON遠程方法調用(接近本地調用)
性能中等(HTTP+JSON 有開銷)高效(協議二進制、TCP直連)
跨語言支持很好(所有語言都支持 HTTP)較好(需官方 SDK,如 gRPC)
常見場景Web 微服務調用高性能微服務 / 內部系統調用

1.3 SpringCloud Alibaba快速整合OpenFeign

1.引入依賴

在這里插入圖片描述
2.編寫調用接口+@FeignClient注解
在這里插入圖片描述
3.調用端在啟動類上添加@EnableFeignClients注解
在這里插入圖片描述
4.發起調用,像本地方法一樣調用

1.3.1 詳細代碼

在這里插入圖片描述

調用方

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.beijing</groupId><artifactId>springcloudalibaba</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.beijing</groupId><artifactId>order-openFeign</artifactId><version>1.0.1-SNAPSHOT</version><name>order</name><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- 添加openFeign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies></project>
server:port: 14031management:endpoints:web:exposure:include=*:spring:application:name: order-openFeigncloud:nacos:discovery:server-addr: 115.190.126.xxx:8848namespace: prodgroup: demo-1
package com.beijing.controller;import com.beijing.order.feign.StockFeignService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** @author aaa* @version 1.0* @date 2025/08/27*/
@RestController
@RequestMapping("/order")
public class OrderController {@Resourceprivate StockFeignService stockFeignService;@RequestMapping("/add")public String add() {String reduct = stockFeignService.reduct();return "add order" + reduct;}
}
package com.beijing;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;/*** @author aaa* @version 1.0* @date 2025/08/27*/
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class OrderFeignApplication {public static void main(String[] args) {SpringApplication.run(OrderFeignApplication.class, args);}
}
package com.beijing.order.feign;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;@FeignClient(name = "stock", path = "/stock")
public interface StockFeignService {@RequestMapping("/reduct")public String reduct();
}

被調用方

package com.beijing;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** @author aaa* @version 1.0* @date 2025/08/27*/
@EnableDiscoveryClient
@SpringBootApplication
public class StockApplication {public static void main(String[] args) {SpringApplication.run(StockApplication.class, args);}
}
package com.beijing.Controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author fanzhen@ict.ac.cn* @version 1.0* @date 2025/08/27*/
@RestController
@RequestMapping("/stock")
public class StockController {@RequestMapping("/reduct")public String reduct() {System.out.println("扣減庫存開始");return "扣減庫存成功";}
}
server:port: 14029management:endpoints:web:exposure:include=*:spring:application:name: stockcloud:nacos:discovery:server-addr: 115.190.126.xxx:8848namespace: prodgroup: demo-1
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.beijing</groupId><artifactId>springcloudalibaba</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.beijing</groupId><artifactId>stock</artifactId><version>1.0.1-SNAPSHOT</version><name>stock</name><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies></project>

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

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

相關文章

訪問相同的url,相同入參的請求,Apifox/Postman可以正常響應結果,而本地調用不行(或結果不同)

文章目錄問題概述Apifox查看實際請求總結問題概述 開發中有一個需求需要去別的系統中拿數據&#xff0c;配置好相關參數后發起請求時發現響應結果和在Apifox上不同&#xff0c;Apifox上正常顯示數據&#xff0c;而本地調用后返回數據不存在。 這就很奇怪了&#xff0c;想了很多…

數據結構(C語言篇):(七)雙向鏈表

目錄 前言 一、概念與結構 二、雙向鏈表的實現 2.1 頭文件的準備 2.2 函數的實現 2.2.1 LTPushBack( )函數&#xff08;尾插&#xff09; &#xff08;1&#xff09;LTBuyNode( ) &#xff08;2&#xff09;LTInit( ) &#xff08;3&#xff09;LTPrint( ) &#x…

從拿起簡歷(resume)重新找工作開始聊起

經濟蕭條或經濟衰退在經濟相關學術上似乎有著嚴格的定義&#xff0c;我不知道我們的經濟是否已經走向了衰退或者蕭條&#xff0c;但有一點那是肯定的&#xff0c;那就現在我們的經濟肯定是不景氣的。經濟不景氣會怎么樣&#xff1f;是的&#xff0c;會有很多人失業&#xff0c;…

OS+MySQL+(其他)八股小記

魯迅先生曾經說過&#xff0c;每天進步一點點&#xff0c;媽媽夸我小天才。 依舊今日八股&#xff0c;這是我在多個文檔整合一起的&#xff0c;可能格式有些問題&#xff0c;請諒解。 操作系統 1.進程和線程的區別&#xff1f; 進程是代碼在數據集合的一次執行活動&#xff0c;…

Transformer的并行計算與長序列處理瓶頸總結

&#x1f31f; 第0層&#xff1a;極簡版&#xff08;30秒理解&#xff09;一句話核心&#xff1a;Transformer像圓桌會議——所有人都能同時交流&#xff08;并行優勢&#xff09;&#xff0c;但人越多會議越混亂&#xff08;長序列瓶頸&#xff09;。核心問題 并行優勢&#x…

Vue 3 useId 完全指南:生成唯一標識符的最佳實踐

&#x1f4d6; 概述 useId() 是 Vue 3 中的一個組合式 API 函數&#xff0c;用于生成唯一的標識符。它確保在服務端渲染&#xff08;SSR&#xff09;和客戶端渲染之間生成一致的 ID&#xff0c;避免水合不匹配的問題。 &#x1f3af; 基本概念 什么是 useId&#xff1f; useId…

CGroup 資源控制組 + Docker 網絡模式

1 CGroup 資源控制組1.1 為什么需要 CGroup - 容器本質 宿主機上一組進程 - 若無資源邊界&#xff0c;一個暴走容器即可拖垮整機 - CGroup 提供**內核級硬限制**&#xff0c;比 ulimit、nice 更可靠1.2 核心概念 3 件套 | 概念 | 一句話解釋 | 查看方式 | | Hierarchy | 樹…

【ArcGIS微課1000例】0150:如何根據地名獲取經緯度坐標

本文介紹了三種獲取地理坐標的方法:1)在ArcGIS Pro中通過搜索功能定位目標點(如月牙泉)并查看其WGS84坐標;2)使用ArcGIS內置工具獲取坐標;3)推薦三個在線工具(maplocation、地球在線、yanue)支持批量查詢和多地圖源坐標轉換。強調了使用WGS84坐標系以減少誤差,并展示…

HTML應用指南:利用GET請求獲取MSN財經股價數據并可視化

隨著數字化金融服務的不斷深化&#xff0c;及時、準確的財經信息已成為投資者決策與市場分析的重要支撐。MSN財經股價數據服務作為廣受信賴的金融信息平臺&#xff0c;依托微軟強大的技術架構與數據整合能力&#xff0c;持續為全球用戶提供全面、可靠的證券市場數據。平臺不僅提…

雅思聽力第四課:配對題核心技巧與詞匯深化

現在&#xff0c;請拿出劍橋真題&#xff0c;開始你的刻意練習&#xff01; 內容大綱 課程核心目標舊題回顧與基礎鞏固配對題/匹配題核心解題策略考點總結與精聽訓練表 一、課程核心目標 掌握第二部分配對題的解題策略攻克第三部分匹配題的改寫難點系統整理高頻場景詞匯與特…

SQL Server從入門到項目實踐(超值版)讀書筆記 25

第12章 存儲過程的應用 &#x1f389;學習指引 存儲過程&#xff08;Stored Procedure&#xff09;是在大型數據庫系統中&#xff0c;一組為了完成特定功能的SQL語句集&#xff0c;存儲過程時數據庫中的一個重要對象&#xff0c;它代替了傳統的逐條執行SQL語句的方式。本章就來…

20.29 QLoRA適配器實戰:24GB顯卡輕松微調650億參數大模型

QLoRA適配器實戰:24GB顯卡輕松微調650億參數大模型 QLoRA 適配器配置深度解析 一、QLoRA 適配器核心原理 QLoRA 作為當前大模型微調領域的前沿技術,通過量化與低秩適配的協同設計,在保證模型效果的前提下實現了顯存占用的革命性降低。其核心由三大技術支柱構成: 4位量化…

QMainWindow使用QTabWidget添加多個QWidget

QTabWidget添加其它Wdiget的2個函數如下&#xff1a; QTabWidget的介紹可參考官網QTabWidget Class | Qt Widgets | Qt 6.9.1 直接上代碼&#xff0c;代碼如下&#xff1a; #include <QMainWindow>#include <QApplication> #include <QVBoxLayout> #includ…

AI學習機哪個好?選這幾款步步高就對了

隨著新教改政策的推進&#xff0c;教育對孩子的綜合素養提出了更高要求。英語更重聽說、數學更重思維&#xff0c;這讓許多家長在輔導孩子時感到壓力倍增。因此&#xff0c;如何選擇一款能真正幫助孩子提升能力的學習機&#xff0c;成為了大家普遍關心的問題。面對市場上功能各…

【設計模式】--重點知識點總結

題1 1、工廠和產品之間是依賴關系 2、工廠方法模式&#xff1a;工廠方法不能為靜態方法。如果是靜態方法&#xff0c;子類無法重寫行為。 簡單工廠可以用靜態方法 3、采用設計模式&#xff0c;以保證成功的設計和體系結構 4、建造者模式&#xff1a;&#xff08;1&#xf…

輕量實現 OCPP 1.6 JSON 協議(歐洲版)的充電樁調試平臺

1 項目概覽 1.1 目標與適用場景 1.1.1 簡介 本文介紹的開源項目 ocpp_charge&#xff0c;是一個 自研輕量實現 OCPP 1.6 JSON 協議&#xff08;歐洲版&#xff09; 的充電樁調試平臺。 它沒有依賴官方 OCPP 1.6J 庫&#xff0c;而是從零實現協議解析與會話管理&#xff0c;適…

Ubuntu 搭建 Solana 區塊鏈開發環境 + Anchor 智能合約完整教程

文章目錄簡介特征核心概念Solana 的工作原理&#xff08;簡單版&#xff09;為什么人們選擇 Solana開發環境準備Solana 官網Solana 文檔Anchor 文檔GithubRust SDK快速安裝 Solana&#xff08;推薦&#xff09;單獨安裝 Solana安裝依賴項安裝 Solana CLI安裝 Anchor CLI安裝 AV…

curl 介紹及使用教程

文章目錄 什么是 curl? 1. 解析用戶輸入與初始化 2. 建立網絡連接 3. 構建并發送請求 4. 接收并處理響應 5. 清理資源 核心特點總結 基本語法 常用功能及示例 1. 基本 HTTP 請求 2. 發送 GET 請求 3. 發送 POST 請求 4. 設置請求頭 5. 處理認證 6. 斷點續傳 7. 跟隨重定向 8. …

【第十一章】Python 隊列全方位解析:從基礎到實戰

Python 隊列全方位解析&#xff1a;從基礎到實戰 本文將從基礎概念到高級應用&#xff0c;用 “文字解釋 代碼示例 圖表對比 實戰案例” 的方式&#xff0c;全面覆蓋 Python 隊列知識&#xff0c;零基礎也能輕松掌握。 文章目錄Python 隊列全方位解析&#xff1a;從基礎到實…

跨平臺開發框架實測:React Native vs Flutter vs Kotlin Multiplatform

本文聚焦 React Native、Flutter 和 Kotlin Multiplatform 三大跨平臺開發框架&#xff0c;從性能表現、開發效率、生態系統、跨平臺一致性及學習成本五個關鍵維度展開實測對比。通過具體場景的測試數據與實際開發體驗&#xff0c;剖析各框架的優勢與短板&#xff0c;為開發者在…