聲明式調用 —— SpringCloud OpenFeign

来源:https://www.cnblogs.com/Yee-Q/archive/2023/09/30/17737823.html
-Advertisement-
Play Games

Feign 簡介 Spring Cloud Feign 是一個 HTTP 請求調用的輕量級框架,可以以 Java 介面註解的方式調用 HTTP 請求,而不用通過封裝 HTTP 請求報文的方式直接調用 Feign 通過處理註解,將請求模板化,當實際調用的時候傳入參數,根據參數再應用到請求上,進而轉化成 ...


Feign 簡介

Spring Cloud Feign 是一個 HTTP 請求調用的輕量級框架,可以以 Java 介面註解的方式調用 HTTP 請求,而不用通過封裝 HTTP 請求報文的方式直接調用

Feign 通過處理註解,將請求模板化,當實際調用的時候傳入參數,根據參數再應用到請求上,進而轉化成真正的請求


第一個 Feign 程式

本小節介紹如何通過 Nacos+Feign 實現服務之間的調用,新建 server-01、server-02 項目,並分別註冊 Nacos

server-01 引入依賴

<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>

新建 Server02FeignClient 介面,用於調用 server-02 提供的對外介面

// name:要調用的服務名
FeignClient(name = "server-02")
public interface Server02FeignClient {

    @GetMapping("/test/getConfig")
    void getConfig();
}

啟動類加上註解 @EnableFeignClients

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class Server01Application {

    public static void main(String[] args) {
        SpringApplication.run(Server01Application.class, args);
    }
}

使用 Server02FeignClient 調用 server-02 的介面

@Slf4j
@RestController
public class TestCon {
    
    @Autowired
    private Server02FeignClient server02FeignClient;

    @GetMapping("/test/getConfigByFeign")
    public void getConfigByFeign() {
        server02FeignClient.getConfig();
    }
}

在 server-02 創建介面

@Slf4j
@RestController
public class TestCon {

    @Value("${test.value}")
    private String testValue;

    @Value("${spring.application.name}")
    private String applicationName;

    @Value("${server.port}")
    private String port;

    @GetMapping("/test/getConfig")
    public void getConfig() {
        log.info("testValue: {} by {}-{}", testValue, applicationName, port);
    }
}

調用 server-01 的 /test/getConfigByFeign 介面,就會通過 Feign 調用 server-02 的 /test/getConfig 介面

@FeignClient 註解可作用在類、介面、枚舉上,主要包含如下屬性:

  • name/value:name 是 vaue 的別名,value 也是 name 的別名,兩者的作用是一致的,用指定 FeignClient 的名稱,如果配合註冊中心使用,則作為微服務的名稱,用於服務發現

  • url:主要用於調試,可以手動指定 @FeignClient 調用的地址

  • path:path 用於定義當前 FeignClient 的統一首碼

  • contextld:如果要創建多個具有相同名稱或 URL 的 Feign 客戶端,以便它們指向同一臺伺服器,但是每個客戶端具有不同的自定義配置,則必須使用 contextId 屬性,以避免這些配置的名稱衝突

@FeignClient(contextId = "fooClient", name = "stores", configuration=FooConfiguration.class)
public interface FooClient {...}

@FeignClient(contextId = "barClient", name = "stores", configuration=BarConfiguration.class)
public interface BarClient {...}
  • fallback/fallbackFactory:

  • fallback:定義容錯的處理類,當調用遠程介面失敗或超時時,就會調用對應介面的容錯邏輯,falback 指定的類必須實現 @FeignClient 標記的介面

  • fallbackFactory:工廠類,用於生成 fallback 類,通過該屬性可以實現每個介面通用的容錯邏輯,減少重覆的代碼

  • decode404:當發生 404 錯誤時,如果該欄位為 true,就會調用 decoder 進行解碼,否則拋出異常

  • Configuration:Feign 配置類可以自定義 Feign 的 Encoder、Decoder、LogLevel、Contract 等,OpenFeign 預設為 Feign 提供以下對象(bean 類型 bean 名稱 : 類名稱):

  • Decoder feignDecoder : ResponseEntityDecoder

  • Encoder feignEncoder : SpringEncoder

  • Logger feignLogger : Slf4jLogger

  • Contract feignContract : SpringMvcContract

  • FeignBuilder feignBuilder : HystrixFeignBuilder

spring-cloud-starter-openfeign 支持 spring-cloud-starter-netflix-ribbon 和 spring-cloud-starter.loadbalancer,如果 Ribbon 在類路徑中且已啟用,則 Client feignClient 是 LoadBalancerFeignClient,如果 SpringCloud LoadBalancer 在類路徑中,則使用 FeignBlockingLoadBalancerClient

預設情況下,Spring Cloud OpenFeign 不會為 Feign 提供以下 bean 對象,但是仍然會從應用程式上下文中查找這些類型的 bean 以創建 Feign 客戶端:

  • Logger.Level
  • Retryer
  • ErrorDecoder
  • Request.Options
  • Collection<RequestInterceptor>
  • SetterFactory
  • QueryMapEncoder

以上是通過註解 @FeignClient 的配置屬性進行配置的,我們也可以使用配置文件進行配置

feign:
    client:
        config:
            feignName:
                connectTimeout: 5000
                readTimeout:5000
                loggerLevel: full
                errorDecoder: com.example.SimpleErrorDecoder
                retryer: com.example,SimpleRetryer
                requestInterceptors:
                    - com.example.FooRequestInterceptor
                    - com.example,BarRequestInterceptor
                decode404: false
                encoder: com.example.SimpleEncoder
                decoder: com.example.SimpleDecoder
                contract: com.example.SimpleContract

可以在 @EnableFeignClients 屬性 defaultConfiguration 中指定預設配置,不同之處在於此配置將適用於所有 Feign 客戶端

如果希望使用配置文件來配置所有 @FeignClient,則可以使用預設 Feign 名稱創建配置屬性,例如:

feign:
    client:
        config:
            default:
                connectTimeout: 5000
                readTimeout: 5000
                loggerLevel: basic

如果同時創建 @Configuration bean 和配置文件,則配置文件將覆蓋 @Configuration 值,如果要將優先順序更改為 @Configuration,就可以將 feign.client.default-to-properties 更改為 false


Feign 傳參

以下服務端介面可通過 Get 或 Post 請求調用並接收參數

@RequestMapping("/test/testFeignWithParam")
public void testFeignWithParam(@RequestParam String name,
                               @RequestParam int age) {
    log.info("testFeignWithParam: name-{}, age-{}", name, age);
}

通過在 Url 拼接請求傳參如下:

@FeignClient(name = "server-02", path = "server-02")
public interface Server02FeignClient {

    @GetMapping("/test/testFeignWithParam?name=zhanghsan&age=66")
    //@PostMapping("/test/testFeignWithParam?name=zhanghsan&age=66")
    void testFeignWithParam();
}

使用 @RequestParam 傳參如下:

@FeignClient(name = "server-02", path = "server-02")
public interface Server02FeignClient {
    
    //@GetMapping("/test/testFeignWithParam")
    @PostMapping("/test/testFeignWithParam")
    void testFeignWithParam(@RequestParam("name") String name,
                            @RequestParam("age") int age);
}

也可以使用 OpenFeign 的 @QueryMap 將請求實體作為參數的映射,不過由於 @QueryMap 註解與 Spring 不相容,所以 OpenFeign 提供了等效的 @SpringQueryMap 註解

@FeignClient(name = "server-02", path = "server-02")
public interface Server02FeignClient {
    
    //@GetMapping("/test/testFeignWithQueryMap")
    @PostMapping("/test/testFeignWithQueryMap")
    void testFeignWithQueryMap(@SpringQueryMap FeignParam param);
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 蒼穹外賣項目介紹 1.1 項目介紹 1)管理端功能 員工登錄/退出 , 員工信息管理 , 分類管理 , 菜品管理 , 套餐管理 , 菜品口味管理 , 訂單管理 ,數據統計,來單提醒。 2)用戶端功能 微信登錄 , 收件人地址管理 , 用戶歷史訂單查詢 , 菜品規格查詢 , 購物車功能 , 下單 ...
  • 【中秋國慶不斷更】OpenHarmony定義可動畫屬性:@AnimatableExtend裝飾器 @AnimatableExtend裝飾器用於自定義可動畫的屬性方法,在這個屬性方法中修改組件不可動畫的屬性。在動畫執行過程時,通過逐幀回調函數修改不可動畫屬性值,讓不可動畫屬性也能實現動畫效果。 ​ ● ...
  • 一、XML解析 對於以XML作為載體傳遞的數據,實際使用中需要對相關的節點進行解析,一般包括解析XML標簽和標簽值、解析XML屬性和屬性值、解析XML事件類型和元素深度三類場景。 XML模塊提供XmlPullParser類對XML文件解析,輸入為含有XML文本的ArrayBuffer或DataVie ...
  • @Slf4j public class ImageUtils { @Test public void test1() throws IOException { //得到全部的圖片文件 Path path = Paths.get("D:\\Files\\CDN\\file\\_resources"); ...
  • 在記憶體管理中,::operator new()/::operator delete() 、delete/new、 placement new 是不同的: ::operator new():只是進行空間的申請而不調用構造函數,可以理解為只是對 malloc 的簡單封裝,返回 void* 。可以進行類內 ...
  • 在Java語言中,子類只能繼承extends單個父類,實現implements多個介面(即單繼承和多實現)。在Dart語言中,所有類型均是Object子類,它們也是單繼承和多實現,但Dart中有個Mixin的高級特性,它可以做到更多的代碼復用(單繼承、多實現、多Mixin代碼復用)…… ...
  • 魅族雲服務的相冊功能,沒有一鍵選擇所有的圖片,就挺噁心的。魅族不一直提供雲相冊的服務了,就需要將圖片全部下載。之前有大神寫過油潑猴的腳本。 今天拿來用,發現用不了。 又在網上查一下了,有npm的開源下載工具。附上碼雲地址,沒用過。https://gitee.com/moreant/mpcb 但是部署 ...
  • 我們在使用SpringMVC從前端接受傳遞過來的日期數據時,預設傳遞過來的數據是String類型,如果我們從前端傳遞過來的數據格式是yyyy/MM/dd,SpringMVC有內置類型轉化器會將String類型自動轉化成Date類型。但如果我們從前端傳遞過來的數據格式是yyyy-MM-dd,Sprin... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...