Retrofit vs Feign: 介紹、對比及示例

1. 介紹

Retrofit

Retrofit 是 Square 公司開發的一個類型安全的 HTTP 客戶端庫,主要用于 Android 和 Java 應用。它將 HTTP API 轉換為 Java 接口,通過注解來描述 HTTP 請求。

主要特點:

  • 基于注解的 API 定義
  • 支持同步和異步調用
  • 支持多種數據格式轉換 (JSON, XML 等)
  • 可與 RxJava、Coroutines 等集成
  • 主要用于移動端開發

Feign

Feign 是 Netflix 開發的一個聲明式 Web Service 客戶端,后被納入 Spring Cloud 生態。它使得編寫 Web Service 客戶端變得更簡單。

主要特點:

  • 聲明式的 REST 客戶端
  • 與 Spring Cloud 深度集成
  • 支持負載均衡 (與 Ribbon 集成)
  • 支持服務發現 (與 Eureka 集成)
  • 主要用于微服務間的調用

2. 對比

特性RetrofitFeign
開發公司SquareNetflix (現屬于 Spring Cloud)
主要使用場景Android/Java 客戶端應用微服務間調用
注解支持
同步/異步都支持主要同步,可通過其他方式實現異步
集成能力OkHttp, RxJava, CoroutinesRibbon, Hystrix, Eureka
配置復雜度相對簡單與 Spring Cloud 集成時較復雜
負載均衡不支持支持 (通過 Ribbon)
服務發現不支持支持 (通過 Eureka)
社區支持主要面向移動端主要面向微服務

3. 示例代碼

Retrofit 示例

// 1. 定義接口
public interface GitHubService {@GET("users/{user}/repos")Call<List<Repo>> listRepos(@Path("user") String user);@GET("users/{user}/repos")Observable<List<Repo>> listReposRx(@Path("user") String user);
}// 2. 創建 Retrofit 實例
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();// 3. 創建服務實例
GitHubService service = retrofit.create(GitHubService.class);// 4. 同步調用
Call<List<Repo>> call = service.listRepos("octocat");
Response<List<Repo>> response = call.execute();// 5. 異步調用
call.enqueue(new Callback<List<Repo>>() {@Overridepublic void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {// 處理響應}@Overridepublic void onFailure(Call<List<Repo>> call, Throwable t) {// 處理錯誤}
});// 6. RxJava 方式調用
service.listReposRx("octocat").subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(repos -> {// 處理結果}, throwable -> {// 處理錯誤});

Feign 示例

// 1. 添加依賴 (Spring Cloud OpenFeign)
// 在Spring Boot應用中// 2. 啟用Feign客戶端
@SpringBootApplication
@EnableFeignClients
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}// 3. 定義Feign客戶端接口
@FeignClient(name = "github-client", url = "https://api.github.com")
public interface GitHubClient {@GetMapping("/users/{user}/repos")List<Repo> listRepos(@PathVariable("user") String user);// 帶負載均衡的示例 (需要服務注冊中心)@FeignClient(name = "user-service") // 從注冊中心獲取服務實例@GetMapping("/api/users/{id}")User getUserById(@PathVariable("id") Long id);
}// 4. 在Controller或Service中使用
@RestController
public class MyController {private final GitHubClient gitHubClient;public MyController(GitHubClient gitHubClient) {this.gitHubClient = gitHubClient;}@GetMapping("/repos/{user}")public List<Repo> getRepos(@PathVariable String user) {return gitHubClient.listRepos(user);}
}// 5. 配置示例 (application.yml)
feign:client:config:default:connectTimeout: 5000readTimeout: 5000loggerLevel: basichystrix:enabled: true # 啟用熔斷

4. 如何選擇

  • 選擇 Retrofit 當:

    • 開發 Android 應用
    • 需要與 RxJava 或 Coroutines 集成
    • 調用第三方 API 而非自己的微服務
    • 需要更輕量級的解決方案
  • 選擇 Feign 當:

    • 開發 Spring Cloud 微服務
    • 需要服務發現和負載均衡
    • 需要與 Hystrix 熔斷器集成
    • 在服務間進行 REST 調用

兩者都是優秀的 HTTP 客戶端庫,選擇取決于具體的使用場景和技術棧。

如果需要更復雜的微服務功能(如負載均衡、服務發現),Feign 仍是更好的選擇,但 Retrofit 在客戶端場景下的簡潔性和性能表現更勝一籌。

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

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

相關文章

SpringBoot整合MyBatis-Plus:零XML實現高效CRUD

前言 作為一名開發者&#xff0c;數據庫操作是我們日常工作中不可或缺的部分。傳統的MyBatis雖然強大&#xff0c;但需要編寫大量XML映射文件&#xff0c;這在快速開發的今天顯得效率不足。MyBatis-Plus&#xff08;簡稱MP&#xff09;作為MyBatis的增強工具&#xff0c;在保留…

SpringCloud之Gateway基礎認識-服務網關

0、Gateway基本知識 Gateway 是在 Spring 生態系統之上構建的 API 網關服務&#xff0c;基于 Spring &#xff0c;Spring Boot 和 Project Reactor 等技術。 Gateway 旨在提供一種簡單而有效的方式來對 API 進行路由&#xff0c;以及提供一些強大的過濾器功能&#xff0c;例如…

Redis掃盲

Redis 緩存中間件 基礎篇 鍵值數據庫 key Value 是NoSql數據庫 非結構化、無關聯的、非SQL、BASE&#xff08;無法滿足ACID&#xff09; 命令執行是單線程&#xff0c;符合原子性。 低延遲、速度塊&#xff08;基于內存&#xff0c;IO多路復用&#xff0c;良好的編碼&am…

【FMMT】基于模糊多模態變壓器模型的個性化情感分析

遇到很難的文獻看不懂,不應該感到氣餒,應該激動,因為外審估計也看不太懂,那么學明白了可以嚇唬他 缺陷一:輸入依賴性與上下文建模不足?? ??缺陷描述??: 傳統自注意力機制缺乏因果關系,難以捕捉序列歷史背景多模態數據間的復雜依賴關系未被充分建模CNN/RNN類模型在…

Qt Creator 配置 Android 編譯環境

Qt Creator 配置 Android 編譯環境 環境配置流程下載JDK修改Qt Creator默認android配置文件修改sdk_definitions.json配置修改的內容 Qt Creator配置 異常處理刪除提示占用編譯報錯連接安卓機調試APP閃退無法進入 debug 斷點 環境 Qt Creator 版本 qtcreator-16.0.1Win10 嗯, …

使用聊天模型和提示模板構建一個簡單的 LLM 應用程序

官方教程 官方案例 在上面的鏈接注冊后&#xff0c;請確保設置您的環境變量以開始記錄追蹤 export LANGSMITH_TRACING"true" export LANGSMITH_API_KEY"..."或者&#xff0c;如果在筆記本中&#xff0c;您可以使用以下命令設置它們 import getpass imp…

React vs Vue:點擊外部事件處理的對比與實現

React vs Vue&#xff1a;點擊外部事件處理的對比與實現 在 Web 應用中&#xff0c;“點擊外部事件監聽”是一種常見需求&#xff0c;典型應用如&#xff1a;點擊彈窗外部關閉彈窗、點擊下拉菜單外關閉菜單。雖然在 React 和 Vue 中實現的原理類似——都是通過監聽 document 的…

3335. 字符串轉換后的長度 I

3335. 字符串轉換后的長度 I class Solution:def lengthAfterTransformations(self, s: str, t: int) -> int:# 大質數mod 10**97# 創建一個長度為26的數組cnt&#xff0c;對應26個小寫字母cnt [0]*26# 計算出s中26個字符分別有多少個for ch in s:cnt[ord(ch)-ord(a)] 1f…

Java詳解LeetCode 熱題 100(15):LeetCode 189. 輪轉數組(Rotate Array)詳解

文章目錄 1. 題目描述2. 理解題目3. 解法一&#xff1a;使用額外數組3.1 思路3.2 Java代碼實現3.3 代碼詳解3.4 復雜度分析3.5 適用場景 4. 解法二&#xff1a;環狀替換法&#xff08;原地算法&#xff09;4.1 思路4.2 Java代碼實現4.3 代碼詳解4.4 復雜度分析4.5 陷阱與注意事…

數據治理域——日志數據采集設計

摘要 本文主要介紹了Web頁面端日志采集的設計。首先闡述了頁面瀏覽日志采集&#xff0c;包括客戶端日志采集的實現方式、采集內容及技術亮點。接著介紹了無線客戶端端日志采集&#xff0c;包括UserTrack的核心設計、移動端與瀏覽器端采集差異以及典型應用場景崩潰分析。最后探…

PYTHON訓練營DAY24

# SO代碼我們的感情好像跳樓機 # 元組創建時&#xff0c;可以省略括號&#xff1a;my_tuple4 10, 20, thirty # 字符串要加“ ” 元組 一、創建 my_tuple1 (1, 2, 3) my_tuple2 (a, b, c) my_tuple3 (1, hello, 3.14, [4, 5]) # 可以包含不同類型的元素 print(my_tupl…

超聲波傳感器模塊

歡迎來到 破曉的歷程的 博客 ??不負時光&#xff0c;不負己?? 文章目錄 1.HC-SR04介紹2.HC-SR04原理介紹2.1原理概述3.2原理詳解 4驅動代碼編寫4.1寫前思考4.2硬件連線 5.總結hcsr04.hhcsr04.c 1.HC-SR04介紹 超聲波傳感器有很多種類的型號&#xff1a;HC-SR04、UC-025、…

《Effective Python》第2章 字符串和切片操作——深入理解Python 中的字符數據類型(bytes 與 str)的差異

引言 本篇博客基于學習《Effective Python》第三版 Chapter 2: Strings and Slicing 中的 Item 10: Know the Differences Between bytes and str 的總結與延伸。在 Python 編程中&#xff0c;字符串處理是幾乎每個開發者都會頻繁接觸的基礎操作。然而&#xff0c;Python 中的…

py7zr解壓文件時報錯CrcError(crc32, f.crc32, f.filename)

報錯信息 Traceback (most recent call last):File "/home/hp/project/test/file_util.py", line 130, in extract_archive_7zarchive.extract(targets[fixed_file], pathoutput_dir, recursiveTrue)File "/home/hp/miniconda3/envs/celery/lib/python3.10/sit…

物理:由基本粒子組成的個體能否提煉和重組?

個體差異源于基本粒子組合的復雜性與隨機性,這一假設若成立,確實可能為生物醫學帶來革命性突破——但需要突破技術、理論與系統層級的多重壁壘。以下從科學邏輯與技術路徑展開分析: 一、隨機組合中的共性與穩定結構 1. 自然界的自組織規律 涌現性(Emergence):盡管粒子組…

動態路由EIGRP的配置

動態路由EIGRP的配置 動態路由EIGRP&#xff1a;增強內部網關協議 為何收斂快、不成環&#xff1f; 路由計算的無環路和路由的收斂速度是路由計算的重要指標。EIGRP協議由于使用了DUAL算法&#xff0c;使得EIGRP協議在路由計算中不可能有環路路由產生&#xff0c;同時路由計…

組合問題(多條件)

39. 組合總和 - 力扣&#xff08;LeetCode&#xff09; class Solution { private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates, int target,int sum,int startIndex){if(sum>target){return;}if(…

SimScape物理建模實例2--帶控制的單質量彈簧阻尼系統

模型下載&#xff1a; 基于simscape&#xff0c;單質量系統帶位置控制資源-CSDN文庫 在實例1中&#xff0c;我們搭建了不帶控制的單質量彈簧阻尼系統&#xff0c;該系統沒有外界力量介入&#xff0c;只有彈簧的初始彈力&#xff0c;帶著彈簧使勁彈來彈去。 SimScape物理建模實…

OpenAI Text 模型與 Chat 模型調用實戰指南:從基礎配置到創意花店命名

在 AI 應用開發的浪潮中&#xff0c;OpenAI 的大語言模型成為開發者實現創新功能的得力工具。其中&#xff0c;Text 模型和 Chat 模型作為核心接口&#xff0c;被廣泛應用于文本生成、對話交互等場景。本文將以 “為花店起名” 為實際需求&#xff0c;手把手教你如何安全調用這…

網頁常見水印實現方式

文章目錄 1 明水印技術實現1.1 DOM覆蓋方案1.2 Canvas動態渲染1.3 CSS偽元素方案2 暗水印技術解析2.1 空域LSB算法2.2 頻域傅里葉變換3 防篡改機制設計3.1 MutationObserver防護3.2 Canvas指紋追蹤4 前后端實現對比5 攻防博弈深度分析5.1 常見破解手段5.2 進階防御策略6 選型近…