最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud學(xué)習(xí)筆記之Feign遠(yuǎn)程調(diào)用

 更新時間:2021年12月23日 09:12:18   作者:LL.LEBRON  
Feign是一個聲明式的http客戶端。其作用就是幫助我們優(yōu)雅的實現(xiàn)http請求的發(fā)送。本文將具體為大家介紹一下Feign的遠(yuǎn)程調(diào)用,感興趣的可以了解一下

前言

為啥需要學(xué)Feign呢?我們先來回顧之前寫的代碼

先來看我們以前利用RestTemplate發(fā)起遠(yuǎn)程調(diào)用的代碼:

這里就有幾個問題:

  • 代碼可讀性差,編程體驗不統(tǒng)一
  • 參數(shù)復(fù)雜URL難以維護

而Feign是一個聲明式的http客戶端。其作用就是幫助我們優(yōu)雅的實現(xiàn)http請求的發(fā)送,解決上面提到的問題

1.Feign替代RestTemplate

1.1 引入依賴

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

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

1.2 添加注釋

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

1.3 編寫Feign的客戶端

在order-service中新建一個接口,內(nèi)容如下:

@FeignClient("userservice")
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

這個客戶端主要是基于SpringMVC的注解來聲明遠(yuǎn)程調(diào)用的信息,比如:

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

這樣,F(xiàn)eign就可以幫助我們發(fā)送http請求,無需自己使用RestTemplate來發(fā)送了

1.4 測試

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

1.5 總結(jié)

使用Feign的步驟:

① 引入依賴

② 添加@EnableFeignClients注解

③ 編寫FeignClient接口

④ 使用FeignClient中定義的方法代替RestTemplate

2.自定義配置

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

一般情況下,默認(rèn)值就能滿足我們使用,如果要自定義時,只需要創(chuàng)建自定義的@Bean覆蓋默認(rèn)Bean即可

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

2.1 配置文件方式

基于配置文件修改feign的日志級別可以針對單個服務(wù):

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

也可以針對所有服務(wù):

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

而日志的級別分為四種:

  • NONE:不記錄任何日志信息,這是默認(rèn)值
  • BASIC:僅記錄請求的方法,URL以及響應(yīng)狀態(tài)碼和執(zhí)行時間
  • HEADERS:在BASIC的基礎(chǔ)上,額外記錄了請求和響應(yīng)的頭信息
  • FULL:記錄所有請求和響應(yīng)的明細(xì),包括頭信息、請求體、元數(shù)據(jù)

2.2 Java代碼方式

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

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

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

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 

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

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

3.Feign使用優(yōu)化

Feign底層發(fā)起http請求,依賴于其它的框架。其底層客戶端實現(xiàn)包括:

  • URLConnection:默認(rèn)實現(xiàn),不支持連接池
  • Apache HttpClient :支持連接池
  • OKHttp:支持連接池

因此提高Feign的性能主要手段就是使用連接池代替默認(rèn)的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就是基本的請求和響應(yīng)信息
  httpclient:
    enabled: true # 開啟feign對HttpClient的支持
    max-connections: 200 # 最大的連接數(shù)
    max-connections-per-route: 50 # 每個路徑的最大連接數(shù)

總結(jié)Feign的優(yōu)化:

日志級別盡量用basic

使用HttpClient或OKHttp代替URLConnection

① 引入feign-httpClient依賴

② 配置文件開啟httpClient功能,設(shè)置連接池參數(shù)

4.最佳實踐

所謂最佳實踐,就是使用過程中總結(jié)的經(jīng)驗,最好的一種使用方式。

自習(xí)觀察可以發(fā)現(xiàn),F(xiàn)eign的客戶端與服務(wù)提供者的controller代碼非常相似:

feign客戶端:

UserController:

有沒有一種辦法簡化這種重復(fù)的代碼編寫呢?

4.1 繼承方式

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

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

2.Feign客戶端和Controller都集成改接口

優(yōu)點:

  • 簡單
  • 實現(xiàn)了代碼共享

缺點:

  • 服務(wù)提供方、服務(wù)消費方緊耦合
  • 參數(shù)列表中的注解映射并不會繼承,因此Controller中必須再次聲明方法、參數(shù)列表、注解

4.2 抽取方式

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

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

4.3 實現(xiàn)基于抽取的最佳實踐 抽取

首先創(chuàng)建一個module,命名為feign-api:

項目結(jié)構(gòu):

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

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

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

在order-service中使用 feign-api

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

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

<dependency>
    <groupId>com.xn2001.feign</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

修改order-service中的所有與上述三個組件有關(guān)的導(dǎo)包部分,改成導(dǎo)入feign-api中的包

重啟測試

重啟后,發(fā)現(xiàn)服務(wù)報錯了:

這是因為UserClient現(xiàn)在在cn.itcast.feign.clients包下,

而order-service的@EnableFeignClients注解是在cn.itcast.order包下,不在同一個包,無法掃描到UserClient。

解決掃描包問題

方式一:

指定Feign應(yīng)該掃描的包:(不推薦)

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

方式二:

指定需要加載的Client接口:

@EnableFeignClients(clients = {UserClient.class}) 

到此這篇關(guān)于SpringCloud學(xué)習(xí)筆記之Feign遠(yuǎn)程調(diào)用的文章就介紹到這了,更多相關(guān)SpringCloud Feign遠(yuǎn)程調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實現(xiàn)全局異常的封裝和統(tǒng)一處理

    SpringBoot實現(xiàn)全局異常的封裝和統(tǒng)一處理

    在Spring Boot應(yīng)用中,全局異常的處理是一個非常重要的方面,本文主要為大家詳細(xì)介紹了如何在Spring Boot中進行全局異常的封裝和統(tǒng)一處理,需要的可以參考下
    2023-12-12
  • java使用JWT的方法

    java使用JWT的方法

    這篇文章主要介紹了java使用JWT的方法,JWT是token的一種,一個JWT字符串包含三個部分分別是Header、Payload和Signature,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Java實現(xiàn)WebSocket客戶端詳細(xì)步驟

    Java實現(xiàn)WebSocket客戶端詳細(xì)步驟

    這篇文章主要介紹了如何使用Java實現(xiàn)一個功能全面的WebSocket客戶端,包括引入依賴、創(chuàng)建客戶端類、實現(xiàn)連接、發(fā)送和接收消息、處理復(fù)雜消息、實現(xiàn)心跳機制、重連策略、異常處理、線程安全的隊列以及測試和調(diào)試,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • 使用JAVA實現(xiàn)郵件發(fā)送功能的圖文教程

    使用JAVA實現(xiàn)郵件發(fā)送功能的圖文教程

    郵件發(fā)送其實是一個非常常見的需求,用戶注冊,找回密碼等地方,都會用到,下面這篇文章主要給大家介紹了關(guān)于使用JAVA實現(xiàn)郵件發(fā)送功能的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Java中的Sentinel規(guī)則持久化詳解

    Java中的Sentinel規(guī)則持久化詳解

    這篇文章主要介紹了Java中的Sentinel規(guī)則持久化詳解,將限流配置規(guī)則持久化進Nacos保存,只要刷新8401某個rest地址,sentinel控制臺的流控規(guī)則就能看到,只要Nacos里面的配置不刪除,針對8401上sentinel上的流控規(guī)則持續(xù)有效,需要的朋友可以參考下
    2023-09-09
  • Spring MVC 處理一個請求的流程

    Spring MVC 處理一個請求的流程

    Spring MVC是Spring系列框架中使用頻率最高的部分。不管是Spring Boot還是傳統(tǒng)的Spring項目,只要是Web項目都會使用到Spring MVC部分。因此程序員一定要熟練掌握MVC部分。本篇博客簡要分析Spring MVC處理一個請求的流程。
    2021-02-02
  • 帶你用Java方法輕松實現(xiàn)樹的同構(gòu)

    帶你用Java方法輕松實現(xiàn)樹的同構(gòu)

    給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構(gòu)”的。例如圖1給出的兩棵樹就是同構(gòu)的,因為我們把其中一棵樹的結(jié)點A、B、G的左右孩子互換后,就得到另外一棵樹
    2021-06-06
  • Java多線程案例之阻塞隊列詳解

    Java多線程案例之阻塞隊列詳解

    阻塞隊列是一種特殊的隊列.?也遵守?“先進先出”?的原則.阻塞隊列能是一種線程安全的數(shù)據(jù)結(jié)構(gòu)。本文將通過一些示例為大家詳細(xì)講講阻塞隊列的原理與使用,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-10-10
  • maven多個plugin相同phase的執(zhí)行順序

    maven多個plugin相同phase的執(zhí)行順序

    這篇文章主要介紹了maven多個plugin相同phase的執(zhí)行順序,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • springboot中RestTemplate配置HttpClient連接池詳解

    springboot中RestTemplate配置HttpClient連接池詳解

    這篇文章主要介紹了springboot中RestTemplate配置HttpClient連接池詳解,這些Http連接工具,使用起來都比較復(fù)雜,如果項目中使用的是Spring框架,可以使用Spring自帶的RestTemplate來進行Http連接請求,需要的朋友可以參考下
    2023-11-11

最新評論

乌恰县| 南丹县| 颍上县| 西充县| 罗田县| 阿巴嘎旗| 枣阳市| 乌什县| 安西县| 潍坊市| 玉田县| 上思县| 五常市| 开远市| 顺义区| 伊川县| 阆中市| 兴安盟| 济阳县| 江永县| 黔西县| 陇西县| 涿州市| 什邡市| 石屏县| 乐东| 韶山市| 紫云| 菏泽市| 桓仁| 呼玛县| 铜陵市| 怀远县| 吉林省| 枣强县| 保定市| 南郑县| 富顺县| 台山市| 泰兴市| 长子县|