【愚公系列】2023年11月 Java教學課程 188-SpringCloud(Feign遠程調用)

在這里插入圖片描述

🏆 作者簡介,愚公搬代碼
🏆《頭銜》:華為云特約編輯,華為云云享專家,華為開發者專家,華為產品云測專家,CSDN博客專家,阿里云專家博主,阿里云簽約作者,騰訊云優秀博主,騰訊云內容共創官,掘金優秀博主,51CTO博客專家等。
🏆《近期榮譽》:2022年CSDN博客之星TOP2,2022年華為云十佳博主等。
🏆《博客內容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鴻蒙、Linux、物聯網、網絡安全、大數據、人工智能、U3D游戲、小程序等相關領域知識。
🏆🎉歡迎 👍點贊?評論?收藏

文章目錄

  • 🚀前言
  • 🚀一、Feign遠程調用
    • 🔎1.Feign替代RestTemplate
      • 🦋1.1 引入依賴
      • 🦋1.2 添加注解
      • 🦋1.3 編寫Feign的客戶端
      • 🦋1.4 測試
    • 🔎2.自定義配置
      • 🦋2.1 配置文件方式
      • 🦋2.2 Java代碼方式
    • 🔎3.Feign使用優化
    • 🔎4.最佳實踐
      • 🦋4.1 繼承方式
      • 🦋4.2 抽取方式
      • 🦋4.3 實現基于抽取的最佳實踐
        • ??4.3.1 抽取
        • ??4.3.2 在order-service中使用feign-api
        • ??4.3.3 重啟測試
  • 🚀感謝:給讀者的一封信


🚀前言

微服務架構中,不同的服務之間需要相互通信來完成任務。其中一種常見的通信方式是遠程調用。遠程調用是指在不同的服務之間進行函數調用,而這些服務運行在不同的計算機、進程或容器中。

常見的微服務遠程調用方式有:

  1. REST API:基于 HTTP 協議實現,通過發送 HTTP 請求來調用服務,并通過 JSON 或 XML 等格式傳遞數據。

  2. gRPC:基于 Google 的開源 RPC 框架實現,支持多種語言,并使用 Protocol Buffers 作為數據格式,提供了更高效的數據傳輸和更簡單的接口定義。

  3. AMQP:基于消息隊列實現,使用消息進行服務之間的通信,可保證消息的可靠性和可恢復性。

  4. Apache Thrift:開源的跨語言 RPC 框架,可生成多種語言的代碼庫,并支持多種數據傳輸協議,如 TCP、HTTP、ZLIB、FRAMED 等。

  5. Socket:原始的方式,通過套接字進行通信,在性能上有一定優勢,但需要自行處理數據格式和協議。

🚀一、Feign遠程調用

用RestTemplate發起遠程調用的代碼:

在這里插入圖片描述

存在下面的問題:

  • 代碼可讀性差,編程體驗不統一
  • 參數復雜URL難以維護

Feign是一個聲明式的http客戶端,官方地址:https://github.com/OpenFeign/feign

其作用就是幫助我們優雅的實現http請求的發送,解決上面提到的問題。

在這里插入圖片描述

🔎1.Feign替代RestTemplate

🦋1.1 引入依賴

我們在order-service服務的pom文件中引入feign的依賴:

<!--feign依賴-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

🦋1.2 添加注解

在order-service的啟動類添加注解開啟Feign的功能:

在這里插入圖片描述

🦋1.3 編寫Feign的客戶端

在order-service中新建一個接口,內容如下:

package cn.itcast.order.client;import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}

這個客戶端主要是基于SpringMVC的注解來聲明遠程調用的信息,比如:

  • 服務名稱:userservice
  • 請求方式:GET
  • 請求路徑:/user/{id}
  • 請求參數:Long id
  • 返回值類型:User

這樣,Feign就可以幫助我們發送http請求,無需自己使用RestTemplate來發送了。

🦋1.4 測試

修改order-service中的OrderService類中的queryOrderById方法,使用Feign客戶端代替RestTemplate:

在這里插入圖片描述
運行
在這里插入圖片描述

🔎2.自定義配置

Feign可以支持很多的自定義配置,如下表所示:

類型作用說明
feign.Logger.Level修改日志級別包含四種不同的級別:NONE、BASIC、HEADERS、FULL
feign.codec.Decoder響應結果的解析器http遠程調用的結果做解析,例如解析json字符串為java對象
feign.codec.Encoder請求參數編碼將請求參數編碼,便于通過http請求發送
feign. Contract支持的注解格式默認是SpringMVC的注解
feign. Retryer失敗重試機制請求失敗的重試機制,默認是沒有,不過會使用Ribbon的重試

一般情況下,默認值就能滿足我們使用,如果要自定義時,只需要創建自定義的@Bean覆蓋默認Bean即可。

下面以日志為例來演示如何自定義配置。

🦋2.1 配置文件方式

基于配置文件修改feign的日志級別可以針對單個服務,可以在order-service中添加:

feign:  client:config: userservice: # 針對某個微服務的配置loggerLevel: FULL #  日志級別 

也可以針對所有服務:

feign:  client:config: default: # 這里用default就是全局配置,如果是寫服務名稱,則是針對某個微服務的配置loggerLevel: FULL #  日志級別 

如下圖所示:

在這里插入圖片描述

而日志的級別分為四種:

  • NONE:不記錄任何日志信息,這是默認值。
  • BASIC:僅記錄請求的方法,URL以及響應狀態碼和執行時間
  • HEADERS:在BASIC的基礎上,額外記錄了請求和響應的頭信息
  • FULL:記錄所有請求和響應的明細,包括頭信息、請求體、元數據。

🦋2.2 Java代碼方式

也可以基于Java代碼來修改日志級別,先聲明一個類,然后聲明一個Logger.Level的對象:

public class DefaultFeignConfiguration  {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.BASIC; // 日志級別為BASIC}
}

如果要全局生效,將其放到啟動類的@EnableFeignClients這個注解中:

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class) 

如果是局部生效,則把它放到對應的@FeignClient這個注解中:

@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class) 

優先級配置文件要高于代碼聲明式,如果想驗證新的需先注釋配置文件中的配置項

🔎3.Feign使用優化

Feign底層發起http請求,依賴于其它的框架。其底層客戶端實現包括:

  • URLConnection:默認實現,不支持連接池

  • Apache HttpClient :支持連接池

  • OKHttp:支持連接池

因此提高Feign的性能主要手段就是使用連接池代替默認的URLConnection。

這里我們用Apache的HttpClient來演示。

1)引入依賴

在order-service的pom文件中引入Apache的HttpClient依賴:

<!--httpClient的依賴 -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId>
</dependency>

2)配置連接池

在order-service的application.yml中添加配置:

feign:client:config:default: # default全局的配置loggerLevel: BASIC # 日志級別,BASIC就是基本的請求和響應信息httpclient:enabled: true # 開啟feign對HttpClient的支持max-connections: 200 # 最大的連接數max-connections-per-route: 50 # 每個路徑的最大連接數

運行測試

在這里插入圖片描述

🔎4.最佳實踐

🦋4.1 繼承方式

一樣的代碼可以通過繼承來共享:

1)定義一個API接口,利用定義方法,并基于SpringMVC注解做聲明。

2)Feign客戶端和Controller都集成改接口
在這里插入圖片描述

優點:

  • 簡單
  • 實現了代碼共享

缺點:

  • 服務提供方、服務消費方緊耦合

  • 參數列表中的注解映射并不會繼承,因此Controller中必須再次聲明方法、參數列表、注解

🦋4.2 抽取方式

將Feign的Client抽取為獨立模塊,并且把接口有關的POJO、默認的Feign配置都放到這個模塊中,提供給所有消費者使用。

例如,將UserClient、User、Feign的默認配置都抽取到一個feign-api包中,所有微服務引用該依賴包,即可直接使用。

在這里插入圖片描述

🦋4.3 實現基于抽取的最佳實踐

??4.3.1 抽取

首先創建一個module,命名為feign-api:

在這里插入圖片描述

在feign-api中然后引入feign的starter依賴

<?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"><parent><artifactId>cloud-demo</artifactId><groupId>cn.itcast.demo</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>feign-api</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies>
</project>

然后,order-service中編寫的UserClient、User、DefaultFeignConfiguration都復制到feign-api項目中

在這里插入圖片描述

??4.3.2 在order-service中使用feign-api

首先,刪除order-service中的UserClient、User、DefaultFeignConfiguration等類或接口。

在order-service的pom文件中中引入feign-api的依賴:

<!--feign-api的依賴 -->
<dependency><groupId>cn.itcast.demo</groupId><artifactId>feign-api</artifactId><version>1.0</version>
</dependency>

修改order-service中的所有與上述三個組件有關的導包部分,改成導入feign-api中的包

  • 刪除order-service中的User類
  • 更新依賴:cn.itcast.order.pojo.Order
  • 更新依賴:cn.itcast.order.client.UserClient
  • 更新依賴:cn.itcast.order.service.OrderService

以下調整均在啟動類中增加

方式一:

指定Feign應該掃描的包:

@EnableFeignClients(basePackages = "cn.itcast.feign.clients")

方式二:

指定需要加載的Client接口(注意引包是:feign-api下的別引錯了):

@EnableFeignClients(clients = {UserClient.class})
??4.3.3 重啟測試

在這里插入圖片描述


🚀感謝:給讀者的一封信

親愛的讀者,

我在這篇文章中投入了大量的心血和時間,希望為您提供有價值的內容。這篇文章包含了深入的研究和個人經驗,我相信這些信息對您非常有幫助。

如果您覺得這篇文章對您有所幫助,我誠懇地請求您考慮贊賞1元錢的支持。這個金額不會對您的財務狀況造成負擔,但它會對我繼續創作高質量的內容產生積極的影響。

我之所以寫這篇文章,是因為我熱愛分享有用的知識和見解。您的支持將幫助我繼續這個使命,也鼓勵我花更多的時間和精力創作更多有價值的內容。

如果您愿意支持我的創作,請掃描下面二維碼,您的支持將不勝感激。同時,如果您有任何反饋或建議,也歡迎與我分享。

在這里插入圖片描述

再次感謝您的閱讀和支持!

最誠摯的問候, “愚公搬代碼”

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

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

相關文章

如何通過寶塔面板搭建一個本地MySQL數據庫服務并實現遠程訪問

寶塔安裝MySQL數據庫&#xff0c;并內網穿透實現公網遠程訪問 文章目錄 寶塔安裝MySQL數據庫&#xff0c;并內網穿透實現公網遠程訪問前言1.Mysql服務安裝2.創建數據庫3.安裝cpolar3.2 創建HTTP隧道 4.遠程連接5.固定TCP地址5.1 保留一個固定的公網TCP端口地址5.2 配置固定公網…

浙江師范黃昌勤老師關于情感分析的講座

回放&#xff1a;https://share.weiyun.com/Wvaw4OoY 收獲很大&#xff1a; 寫幾點&#xff0c; 1&#xff1a;小二聚焦 精細更有用 2&#xff1a;高產的秘訣就是 專注一個領域&#xff0c;不斷延展。 3&#xff1a;好的文章技術不是本質&#xff0c;本質還是解決了什么教育問…

九、ffmpeg命令轉封裝

開了幾天小差&#xff0c;今天繼續學習ffmpeg。 準備測試使用的視頻&#xff0c;并查看其信息 # 查看視頻信息。使用Mediainfo也可以 ffprobe test.mp4 視頻格式的信息如下。 保持編碼格式&#xff1a;ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.tsffmpeg -i…

WordPress網站如何修復數千個帖子的SEO錯誤

在本教程中&#xff0c;我們將向您展示如何解決您經常犯的SEO錯誤。 最好的是您不必花費太多時間&#xff0c;因為您不需要打開并編輯每個帖子。 相反&#xff0c;我們將向您展示如何使用 WordPress 內的電子表格來修復 WordPress 帖子的 SEO。 在這里&#xff0c;我們為您提…

nint和Pattern matching介紹(C#)

nint 最近看C# 9.0時&#xff0c;發現一個有意思的關鍵詞&#xff0c;就是nint&#xff0c;第一次看到這個&#xff0c;于是好奇心爆棚&#xff0c;就去實際操作了一下。 nint i 1000; Console.WriteLine("i{0}", i);實際結果與int的結果是一樣的&#xff0c;那為什…

ARM裸機-19(NandFlash和iNand)

1、NandFlash的接口 1.1、Nand的型號與命名 (1)、Nand的型號命名都有含義&#xff0c;就拿K9F2G08來示例分析一下&#xff1a;K9F表示是三星公司的NandFlash系列。2G表示Nand的大小是2Gbit (256MB)。08表示Nand是8位的 (8位就是數據線有8根)。 (2)、Nand命名中可以看出&#x…

【2023.11.23】JDBC基本連接語法學習?

1.導入jar包依賴&#xff1a;mysql-connector-java-8.0.27.jar 2.連接數據庫&#xff01; 3.無法解析類->導入java.sql.*&#xff0c;&#xff08;將項目方言改為Mysql&#xff09; JDBC&#xff0c;啟動&#xff01;&#xff01; public class Main {public static voi…

如何下載OpenJDK及其源碼

如果想下載 OpenJDK&#xff0c;存在以下幾種辦法&#xff1a; 最簡單的辦法是去 OpenJDK 官網&#xff0c;這里能下載 JDK9 及其以上的版本&#xff0c;還有 JDK 源碼所在的 github 地址。 第二種方法是使用 IDEA 下載&#xff0c;位置在 File->Project Structure->SD…

【Vue】核心特性(響應式)

響應式&#xff1a; 數據變化&#xff0c;視圖自動更新 接下來使用一個例子來體現一下什么是響應式 案例一&#xff1a; 訪問數據&#xff0c;視圖自動更新 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

【人生苦短,我學 Python】(1)初識 Python

目錄 1. 簡述2. 什么是 Python&#xff1f;3. 面向對象簡述3.1 面向過程3.2 面向對象3.3 面向對象的主要優點3.4 面向對象的基本概念3.5 面向對象程序設計 4. Python語言的版本和解釋器5. Python 編程工具6. Python 的三種編程方式7. 簡單的 Python 程序8. 高級一點的 Python 程…

數據通信與計算機網絡(精煉知識點)

前言 該部分知識點不多,分值3分 知識點 TCP TCP采用可變大小的滑動窗口協議進行流量控制。在前向糾錯系統中,當接收端檢測到錯誤后就根據糾錯編碼的規律自行糾錯;在后向糾錯系統中,接收方會請求發送方重發出錯分組。IP協議不預先建立虛電路,而是對每個數據報獨立地選擇…

Linux快速顯示文件行號并跳轉

有時候&#xff0c;想要在線上直接查看日志文件&#xff0c;搜索到關鍵詞后&#xff0c;如果一直按n找下去&#xff0c;很麻煩&#xff0c;我們可以先顯示出行號&#xff0c;確定好我們要找內容對應的行號&#xff0c;直接跳轉過去。 esc進入命令模式&#xff0c;輸入:set nu命…

Cesium:CGCS2000坐標和WGS84坐標互相轉換

作者:CSDN @ _樂多_ 本文記錄了CGCS2000坐標和WGS84經緯度互相轉換的js代碼。封裝成了函數。 文章目錄 一、WGS84ToCGCS2000二、CGCS2000ToWGS84一、WGS84ToCGCS2000 import proj4 from "proj4";convertWGS84ToCGCS2000(wgs84X, wgs84Y, wgs84Z)

Amlogic方案遙控器配置(Android11)

配置路線 鍵值變化路徑&#xff1a; ScanCode --> Keycode Lable --> KeyCode Layout --> KeyLable --> Keycode – > KeyEvent 文件映射路徑&#xff1a; *.dtsi --> input-event-codes.h --> *.kl --> InputEventLable.h --> kecodes.h --> P…

通過這個簡單的技巧讓我們的 JavaScript 代碼變得異常快

通過這個簡單的技巧讓我們的 JavaScript 代碼變得異常快 秘訣&#xff1a;了解JavaScript 虛擬機(VM)的內部工作原理。 首先&#xff0c;我們來談談像 V8 這樣的JavaScript 虛擬機(VM)。可以把它想象成我們的操作的大腦 —— 它將我們簡潔的代碼變成計算機可以理解和執行的東…

免費圖書教材配套資料:Spark大數據技術與應用(第2版)

《Spark大數據技術與應用&#xff08;第2版&#xff09;》課程內容全面介紹了Spark大數據技術的相關知識&#xff0c;內容包含包括Spark概述、Scala基礎、Spark編程、Spark編程進階、Spark SQL結構化數據文件處理、Spark Streaming實時計算框架、Spark GraphX圖計算框架、Spark…

方法簽名【C#】

1條件&#xff1a; 簽名的作用&#xff1a;為了在眾多方法中找到匹配的方法。【自己想要的方法】類似明星的簽名。雖然2個人的名字一樣&#xff0c;但并不是同一個人&#xff0c;這就需要用到簽名的條件。 方法名稱&#xff1a;注意大小寫。 參數個數。 參數類型及順序&…

STL—next_permutation函數

目錄 1.next_permutation函數的定義 2.簡單使用 2.1普通數組全排列 2.2結構體全排列 2.3string 3.補充 1.next_permutation函數的定義 next_permutation函數會按照字母表順序生成給定序列的下一個較大的排列&#xff0c;直到整個序列為降序為止。與其相對的還有一個函數—…

實用工具推薦 | 在線制作電子書

?隨著互聯網的發展&#xff0c;越來越多的人開始關注知識的傳播和分享。而電子書作為一種方便攜帶、易于分享的形式&#xff0c;越來越受到人們的青睞。今天&#xff0c;就為大家推薦一款實用的工具——FLBOOK在線制作電子雜志平臺&#xff0c;讓你輕松在線制作電子書&#xf…

【python學習】基礎篇-常用模塊-re模塊:正則表達式高效操作字符串

在Python中&#xff0c;正則表達式主要通過re模塊來實現。以下是一些常用的正則表達式用法&#xff1a; 匹配值&#xff1a; pattern r\d # 匹配一個或多個數字 pattern r\b\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\b #匹配日期格式 pattern rhello # 匹配字符串“hello”\…