欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot Feign使用教程超全面講解

 更新時間:2022年11月29日 08:30:49   作者:程序一逸  
現(xiàn)在的微服務(wù)項目不少都使用的是springboot+Feign構(gòu)建的項目,微服務(wù)之間的調(diào)用都離不開feign來進(jìn)行遠(yuǎn)程調(diào)用,這篇文章主要介紹了SpringBoot Feign使用教程,需要的朋友可以參考下

開篇

Feign 是聲明式、模板化的 HTTP 客戶端, 可以幫助我們更快捷、優(yōu)雅地調(diào)用 HTTP API;Spring Cloud 為 Feign 添加了 Spring MVC 的注解支持,并整合了 Ribbon 和 Eureka 來為使用 Feign 時提供負(fù)載均衡;在 Spring Cloud 中使用 Feign 是非常容易的。

本篇主要介紹 SpringBoot 中要玩轉(zhuǎn) Feign 需要掌握的如添加 pom 依賴、客戶端注解啟用、切換底層 HttpClient、配置數(shù)據(jù)壓縮、調(diào)整日志級別、定制配置、配置的優(yōu)先級機(jī)制、增加攔截器以及攔截器的追加機(jī)制等知識。

一、使用 Feign 的示例

1.1 添加依賴

<dependencies>
  <!--openfein的依賴-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
      <version>2.1.3.RELEASE</version>
  </dependency>
</dependencies>

1.2 啟用 Feign

在 SpringBoot 的啟用類上添加注解@EnableFeignClients,@EnableFeignClients用于開啟 Feign,會自動掃描@FeignClient標(biāo)注的 FeignClient 接口。

@SpringBootApplication
@EnableFeignClients
@EnableWeb
public class FeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class,args);
    }
}

1.3 編寫 FeignClient 接口

@FeignClient(
        name = "demo-service",
        url = "http://localhost:8080/feign/server/",
        configuration = FeignInterceptor.class,
        fallback = TestService.DefaultFallback.class
)
public interface TestService {
    @RequestMapping(value = "/getError/{id}", method = RequestMethod.GET)
    public String getError(@RequestParam("id") Integer id);
    @RequestMapping(value = "/get1", method = RequestMethod.GET)
    public String get1();
    @RequestMapping(value = "/get2/{param}", method = RequestMethod.GET)
    public String get2(@RequestParam("param") String param);
    @RequestMapping(value = "/post1", method = RequestMethod.POST)
    public FeignDemo post1(@RequestBody FeignDemo demo);

1.4 編寫對應(yīng)的服務(wù)端

@RestController
@RequestMapping("/feign/server")
public class FeignServerController {
    @GetMapping("/get1")
    public String get1() {
        return "get1";
    }
    @GetMapping("/get2/{para}")
    public String get2(@PathVariable("para") String para){
        return para;
    }
    @PostMapping("/post1")
    public FeignDemo  post1(@RequestBody FeignDemo demo) {
        return demo;
    }
}
public class FeignDemo {
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "FeignDemo{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}

1.5 調(diào)用 FeignClient

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {FeignApplication.class},webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("dev,feign")
public class FeignClientTest {
    @Autowired
    private TestService testService;
    @Test
    public void testFallback(){
        testService.getError(1);
    }
    @Test
    public void testGet1(){
        System.out.println(testService.get1());
        System.out.println(testService.get2("abc"));
        System.out.printf("..");
        FeignDemo feignDemo = new FeignDemo();
        feignDemo.setName("name");
        feignDemo.setAge(1);
        System.out.println(testService.post1(feignDemo));
    }
@Component
    public class DefaultFallback implements TestService {
        @Override
        public String getError(@RequestParam("id") Integer id){
            return "";
        }
        @Override
        public String get1() {
            return null;
        }
        @Override
        public String get2(String param) {
            return null;
        }
        @Override
        public FeignDemo post1(FeignDemo demo) {
            return null;
        }
    }
}

二、如何切換 Client

Feign 中自帶的是 HttpURLConnection,這個 client 健壯性差,可替換為成熟的 Apache HttpClient 或 OkHttp 來進(jìn)行網(wǎng)絡(luò)請求。

2.1 使用 Apache 的 HTTP Client

使用 Apache 的httpclient替換 Feign 中默認(rèn)的 client。

2.1.1 添加依賴

<!--httpclient的依賴,因為選擇了使用httpclient-->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
    <version>10.4.0</version>
</dependency>

2.1.2 配置啟用

配置中添加如下信息,表示啟用httpclient。

feign:
  httpclient:
    enabled: true

2.2 使用 OkHttp

2.2.1 添加依賴

在 Feign 中使用OkHttp作為網(wǎng)絡(luò)請求框架,則只需要在 pom 文件中加上feign-okhttp的依賴,代碼如下:

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
    <version>10.2.0</version>
</dependency>

2.2.2 配置啟用

feign:
  okhttp:
    enabled: true

三、如何修改日志級別

在發(fā)送和接收請求的時候,其內(nèi)部將日志的打印輸出定義成了四個等級,對應(yīng)的詳情如下:

級別說明
NONE不做任何記錄
BASIC僅記錄請求方法和 URL 以及響應(yīng)狀態(tài)代碼和執(zhí)行時間
HEADERS記錄基本信息以及請求和響應(yīng)標(biāo)頭
FULL記錄請求和響應(yīng)的標(biāo)題,正文和元數(shù)據(jù)

3.1 通過配置文件修改日志級別

注意需要指定接口的全限定名

logging:
  level:
    com.zto.titans.test.feign.service.TestService : DEBUG

3.2 通過配置類修改日志級別

@Configuration
public class FooConfiguration {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

這個一看即懂,不再廢話。

四、如何實現(xiàn)數(shù)據(jù)壓縮

可以分別對 HTTP 通信的requestresponse設(shè)置是否啟用 GZIP 壓縮,配置方法如下:

feign:
    compression:
        request:
            enabled: true
            mime-types: text/xml,application/xml,application/json # 配置壓縮支持的MIME TYPE
            min-request-size: 2048  # 配置壓縮數(shù)據(jù)大小的下限
        response:
            enabled: true # 配置響應(yīng)GZIP壓縮

五、FeignClient 的配置以及配置的優(yōu)先級機(jī)制

有 2 種途徑設(shè)置 FeignClient 的配置,通過自定義配置類來設(shè)置配置和在配置文件中設(shè)置,其中配置文件方式有點特殊,它里邊可以指定全局配置對所有 FeignClient 有效,也可以為特定名稱的 FeignClient 設(shè)置專屬的配置。

5.1 通過自定義配置類來定制配置

實現(xiàn)一個配置類

public class TestConfiguration {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

將配置類TestConfiguration指定給configuration

@FeignClient(
        name = "test-service",
        configuration = {FeignInterceptor2.class,TestConfiguration.class}
)

5.2 在配置文件中設(shè)置全局配置

feign.client.config.default.xxx ,這個default意為全局的配置屬性。

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

5.3 在配置文件中設(shè)置專屬配置

feign.client.config.feignName.xxx , 給名字為feignName的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

5.4 理解配置的優(yōu)先級與攔截器的追加原則

org.springframework.cloud.openfeign.FeignClientFactoryBean#configureFeign中可以確認(rèn)以上 3 種配置的優(yōu)先級:

configureUsingConfiguration(context, builder); // 1
configureUsingProperties(properties.getConfig().get(properties.getDefaultConfig()),builder); //2
configureUsingProperties(properties.getConfig().get(this.contextId),builder);//3
  • 第 1 類為通過自定義配置類來指定配置
  • 第 2 類為在配置文件中的feign.client.config.default.xxx設(shè)置全局配置
  • 第 3 類為在配置文件中的feign.client.config.feignName.xxx設(shè)置專屬配置

5.4.1 優(yōu)先級的效果

配置文件里的專屬配置-覆蓋->配置文件里的全局配置-覆蓋->配置類的配置

5.4.2 追加的原則

RequestInterceptor是攔截器,可以在發(fā)送前做一些處理,比如統(tǒng)一添加header信息。每一類中的requestInterceptors可以存儲多個攔截器,攔截器并非覆蓋的效果,而是鏈?zhǔn)阶芳拥男Ч粡膱?zhí)行順序來看優(yōu)先級是:1 > 2 > 3,即先執(zhí)行配置類中指定的攔截器,然后是配置文件中指定的全局?jǐn)r截器,最后是配置文件中指定的專屬攔截器。

需特別注意:RequestInterceptor的實現(xiàn)類(例如 RI-A,RI-B)上如果添加了@Component注解,就都會被掃描識別到,并被追加到第一類的requestInterceptors列表中;倘若不小心 RI-A 還在第 2 類中又被指定了,則還會將攔截器 RI-A 追加在第二類的requestInterceptors列表中,結(jié)果是會 RI-A 總計會執(zhí)行 2 次;若也在第三類中指定 RI-A,則 RI-A 也在其列表中追加,結(jié)果是 RI-A 總計會執(zhí)行 3 次。

5.4.3 攔截器的效果驗證

以一個實例來驗證說明效果

自定義三個 RequestInterceptor

class FeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("user", "myuser1");
        requestTemplate.header("password", "mypassword");
    }
}
class FeignInterceptor1 implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("user1", "myuser1");
        requestTemplate.header("password1", "mypassword1");
    }
}
class FeignInterceptor2 implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("user2", "myuser2");
        requestTemplate.header("password2", "mypassword2");
    }
}

@FeignClient 中指定一個

@FeignClient(
        name = "test-service",
        url = "http://localhost:8080/feign/server/",
        configuration = {FeignInterceptor.class,TestConfiguration.class},
        fallback = TestService.DefaultFallback.class
)

配置中指定 2 個

default指定了一個,test-service里指定一個

feign:
  httpclient:
    enabled: true
  okhttp:
    enabled: true
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        #loggerLevel: none
        requestInterceptors:
          - com.zto.titans.test.feign.service.FeignInterceptor1
      test-service:
        #loggerLevel: basic
        requestInterceptors:
          - com.zto.titans.test.feign.service.FeignInterceptor2
logging:
  level:
    com.zto.titans.test.feign.service.TestService : DEBUG

根據(jù)追加邏輯,最終執(zhí)行的順序是:

  • FeignInterceptor
  • FeignInterceptor1
  • FeignInterceptor2

總結(jié)

本篇主要介紹 SpringBoot 中要玩轉(zhuǎn) Feign 需要掌握的如添加 pom 依賴、客戶端注解啟用、切換底層 HttpClient、配置數(shù)據(jù)壓縮、調(diào)整日志級別、定制配置、配置的優(yōu)先級機(jī)制、增加攔截器以及攔截器的追加機(jī)制等知識,以實例 + 效果的方式幫讀者高效全面并深入的理解它們。

到此這篇關(guān)于SpringBoot Feign使用教程超全面講解的文章就介紹到這了,更多相關(guān)SpringBoot Feign內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 多個java泛型示例分享

    多個java泛型示例分享

    這篇文章主要介紹了多個java泛型示例,需要的朋友可以參考下
    2014-04-04
  • Java使用pulsar-flink-connector讀取pulsar catalog元數(shù)據(jù)代碼剖析

    Java使用pulsar-flink-connector讀取pulsar catalog元數(shù)據(jù)代碼剖析

    這篇文章主要介紹了Java使用pulsar-flink-connector讀取pulsar catalog元數(shù)據(jù)代碼剖析,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Java反射中java.beans包學(xué)習(xí)總結(jié)

    Java反射中java.beans包學(xué)習(xí)總結(jié)

    本篇文章通過學(xué)習(xí)Java反射中java.beans包,吧知識點做了總結(jié),并把相關(guān)內(nèi)容做了關(guān)聯(lián),對此有需要的朋友可以學(xué)習(xí)參考下。
    2018-02-02
  • 使用mockito編寫測試用例教程

    使用mockito編寫測試用例教程

    這篇文章主要為大家介紹了使用mockito編寫測試用例教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Spring Boot集成MyBatis的方法

    Spring Boot集成MyBatis的方法

    今天小編就為大家分享一篇關(guān)于Spring Boot集成MyBatis的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java可重入鎖reentrantLock解析

    Java可重入鎖reentrantLock解析

    這篇文章主要介紹了Java可重入鎖reentrantLock解析,reentrantLock跟synchronized代碼結(jié)構(gòu)差不多,只是多了一個lock和unlock的過程,需要的朋友可以參考下
    2023-12-12
  • 淺談Java三大框架與應(yīng)用

    淺談Java三大框架與應(yīng)用

    這篇文章主要介紹了淺談Java三大框架與應(yīng)用,需要的朋友可以參考下
    2015-05-05
  • eclipse 安裝lombok插件

    eclipse 安裝lombok插件

    這篇文章主要介紹了eclipse 安裝lombok插件的詳細(xì)步驟,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • Spring Boot集成Quartz注入Spring管理的類的方法

    Spring Boot集成Quartz注入Spring管理的類的方法

    本篇文章主要介紹了Spring Boot集成Quartz注入Spring管理的類的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • SpringSecurity6自定義JSON登錄的實現(xiàn)

    SpringSecurity6自定義JSON登錄的實現(xiàn)

    目前最新版的Spring Boot已經(jīng)到了3.0.5了,隨之而來Spring Security 目前的版本也到了6.0.2了,Spring Security寫法的變化特別多,本文就來介紹下,感興趣的可以了解一下
    2023-12-12

最新評論