" />

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

SpringCloud Feign遠程調(diào)用實現(xiàn)詳解

 更新時間:2022年11月04日 17:22:06   作者:借東西的小人兒  
Feign是Netflix公司開發(fā)的一個聲明式的REST調(diào)用客戶端; Ribbon負載均衡、 Hystrⅸ服務熔斷是我們Spring Cloud中進行微服務開發(fā)非?;A(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時出現(xiàn)的,而且配置也都非常相似

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

存在下面的問題:

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

1. Feign遠程調(diào)用

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

其作用就是幫助我們優(yōu)雅的實現(xiàn)http請求的發(fā)送,解決上面提到的問題。

1.1.Feign替代RestTemplate

Fegin的使用步驟如下:

1)引入依賴

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

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

2)添加注解

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

3)編寫Feign的客戶端

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

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的注解來聲明遠程調(diào)用的信息,比如:

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

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

4)測試

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

5)總結(jié)

使用Feign的步驟:

① 引入依賴

② 添加@EnableFeignClients注解

③ 編寫FeignClient接口

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

1.2.自定義配置

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

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

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

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

1.2.1.配置文件方式

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

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

也可以針對所有服務:

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

而日志的級別分為四種:

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

1.2.2.Java代碼方式

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

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

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

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 

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

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

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

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

  • URLConnection:默認實現(xiàn),不支持連接池
  • 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 # 最大的連接數(shù)
    max-connections-per-route: 50 # 每個路徑的最大連接數(shù)

接下來,在FeignClientFactoryBean中的loadBalance方法中打斷點:

Debug方式啟動order-service服務,可以看到這里的client,底層就是Apache HttpClient:

總結(jié),F(xiàn)eign的優(yōu)化:

1.日志級別盡量用basic

2.使用HttpClient或OKHttp代替URLConnection

① 引入feign-httpClient依賴

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

3. 最佳實踐

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

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

feign客戶端:

UserController:

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

3.1.繼承方式

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

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

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

優(yōu)點:

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

缺點:

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

3.2.抽取方式

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

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

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

1)抽取

首先創(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都復制到feign-api項目中

2)在order-service中使用feign-api

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

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

<dependency>
    <groupId>cn.itcast.demo</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

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

3)重啟測試

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

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

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

4)解決掃描包問題

方式一:

指定Feign應該掃描的包:

@EnableFeignClients(basePackages = "xxx.xxx.xxx.clients")

方式二:

指定需要加載的Client接口:

@EnableFeignClients(clients = {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->UserClient.class})

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

相關(guān)文章

  • MyBatis查詢?、修改?、刪除操作示例代碼

    MyBatis查詢?、修改?、刪除操作示例代碼

    MyBatis?作為一款靈活的持久層框架,提供了直接編寫?SQL?語句的能力,避免了其他?ORM?框架可能帶來的性能和功能限制,本文介紹?MyBatis?中如何高效執(zhí)行這三種操作,并通過代碼示例展示最佳實踐,感興趣的朋友一起看看吧
    2024-08-08
  • Mybatis深度整合Mysql的Json字段問題

    Mybatis深度整合Mysql的Json字段問題

    這篇文章主要介紹了Mybatis深度整合Mysql的Json字段問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • iReport使用指南及常見功能示例詳解

    iReport使用指南及常見功能示例詳解

    這篇文章主要介紹了iReport使用指南及常見功能,本文以iReport 3.5.1為例,通過示例演示給大家介紹的非常詳細,需要的朋友可以參考下
    2021-10-10
  • Springboot 限制IP訪問指定的網(wǎng)址實現(xiàn)

    Springboot 限制IP訪問指定的網(wǎng)址實現(xiàn)

    本文主要介紹了Springboot 限制IP訪問指定的網(wǎng)址實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05
  • SpringBoot+MyBatisPlus對Map中Date格式轉(zhuǎn)換處理的方法詳解

    SpringBoot+MyBatisPlus對Map中Date格式轉(zhuǎn)換處理的方法詳解

    在?SpringBoot?項目中,?如何統(tǒng)一?JSON?格式化中的日期格式。本文將為大家介紹一種方法:利用MyBatisPlus實現(xiàn)對Map中Date格式轉(zhuǎn)換處理,需要的可以參考一下
    2022-10-10
  • java實現(xiàn)把對象數(shù)組通過excel方式導出的功能

    java實現(xiàn)把對象數(shù)組通過excel方式導出的功能

    本文主要介紹了java實現(xiàn)把對象數(shù)組通過excel方式導出的功能的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • java 中JDBC連接數(shù)據(jù)庫代碼和步驟詳解及實例代碼

    java 中JDBC連接數(shù)據(jù)庫代碼和步驟詳解及實例代碼

    這篇文章主要介紹了java 中JDBC連接數(shù)據(jù)庫代碼和步驟詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • JavaWeb項目中DLL文件動態(tài)加載方法

    JavaWeb項目中DLL文件動態(tài)加載方法

    在JavaWeb項目中,有時候我們需要在運行時動態(tài)加載DLL文件(在Windows中是DLL,在Linux中是SO文件),這通常用于實現(xiàn)一些特定的功能,比如調(diào)用本機代碼或者使用某些特定于操作系統(tǒng)的API,本文將介紹如何在JavaWeb項目中動態(tài)加載DLL文件,需要的朋友可以參考下
    2024-12-12
  • SpringCloud Alibaba 基本開發(fā)框架搭建過程

    SpringCloud Alibaba 基本開發(fā)框架搭建過程

    這篇文章主要介紹了SpringCloud Alibaba 基本開發(fā)框架搭建過程,開發(fā)工具選用的idea,本文通過圖文實例相結(jié)合給大家分享搭建全過程,需要的朋友可以參考下
    2021-06-06
  • 通過Spring Boot整合Mybatis分析自動配置詳解

    通過Spring Boot整合Mybatis分析自動配置詳解

    這篇文章主要給大家介紹了關(guān)于如何通過Spring Boot整合Mybatis分析自動配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07

最新評論

龙门县| 淮安市| 汶上县| 漯河市| 扬中市| 平度市| 满城县| 仙居县| 天全县| 扶绥县| 江陵县| 济源市| 闵行区| 凤翔县| 莲花县| 密云县| 闽清县| 威海市| 龙川县| 高尔夫| 罗平县| 元阳县| 临澧县| 太白县| 马山县| 五台县| 九台市| 三河市| 中阳县| 乌海市| 江口县| 陆丰市| 日土县| 娱乐| 灌阳县| 安平县| 将乐县| 静宁县| 赤城县| 青龙| 渭源县|