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

SpringCloud組件OpenFeign之?dāng)r截器解讀

 更新時(shí)間:2023年04月26日 10:29:06   作者:luffylv  
這篇文章主要介紹了SpringCloud組件OpenFeign之?dāng)r截器用法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SpringCloud組件OpenFeign之?dāng)r截器

OpenFeign組件中有這么一個(gè)接口——RequestInterceptor 。

我們來(lái)看一下源碼中關(guān)于這個(gè)接口的介紹。

package feign;
?
/**
?* 可以配置零個(gè)或多個(gè)請(qǐng)求攔截器,可以用于例如給所有請(qǐng)求添加請(qǐng)求頭信息.但是不能保證攔截器的應(yīng)用順?
?* 序。一旦攔截器被應(yīng)用,就會(huì)調(diào)用Target類中的apply(RequestTemplate)方法去創(chuàng)建不可變的http請(qǐng)?
?* 求,該請(qǐng)求通過(guò)Client類中的execute(Request, feign.Request.Options)發(fā)送。
?*
?* 攔截器是在設(shè)置rest模板參數(shù)后才被應(yīng)用的,因此不能再攔截器中添加參數(shù),比如不能再 ? ?
?* apply(RequestTemplate)方法中給/path/{foo}/bar中的foo設(shè)置參數(shù)。
?* 這個(gè)類類似于RequestInterceptor.intercept()方法,可以實(shí)現(xiàn)讀取、刪除或以其他方式改變請(qǐng)求模板?
?* 的任何部分。
?*/
public interface RequestInterceptor {
?
? /**
? ?* 可以被每個(gè)請(qǐng)求調(diào)用。使用RequestTemplate提供的這個(gè)方法可以添加數(shù)據(jù)。
? ?*/
? void apply(RequestTemplate template);
}

通過(guò)對(duì)該類及方法的注釋可以了解到RequestInterceptor接口的apply方法可以對(duì)請(qǐng)求進(jìn)行攔截,可以在該方法中添加請(qǐng)求頭信息。

實(shí)踐一下。

一、創(chuàng)建一個(gè)攔截器在請(qǐng)求頭中添加traceId信息

場(chǎng)景如下,使用攔截器在請(qǐng)求頭中添加traceId屬性,服務(wù)端可以獲取到該traceId,用于日志追蹤。

方式一:創(chuàng)建自定義攔截器+@Configuration

package com.example.rtbootconsumer.config.interceptor;
?
import com.example.rtbootconsumer.common.utils.TraceIdUtil;
import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Configuration;
?
/**
?* @Description Feign接口請(qǐng)求攔截器
?**/
@Configuration
public class FeignRequestInterceptor implements RequestInterceptor {
?
? ? /**
? ? ?* @description: 將traceId設(shè)置到請(qǐng)求頭
? ? ?*/
? ? @Override
? ? public void apply(RequestTemplate template) {
? ? ? ? String traceId = TraceIdUtil.getTraceId();
? ? ? ? if (StringUtils.isNotEmpty(traceId)) {
? ? ? ? ? ? template.header("traceId", traceId);
? ? ? ? }
? ? }
}

方式二:創(chuàng)建自定義攔截器+配置@FeignClient注解的configuration屬性

package com.example.rtbootconsumer.config.interceptor;
?
import com.example.rtbootconsumer.common.utils.TraceIdUtil;
import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Configuration;
?
/**
?* @Description Feign接口請(qǐng)求攔截器
?**/
public class FeignRequestInterceptor implements RequestInterceptor {
?
? ? /**
? ? ?* @description: 將traceId設(shè)置到請(qǐng)求頭
? ? ?*/
? ? @Override
? ? public void apply(RequestTemplate template) {
? ? ? ? String traceId = TraceIdUtil.getTraceId();
? ? ? ? if (StringUtils.isNotEmpty(traceId)) {
? ? ? ? ? ? template.header("traceId", traceId);
? ? ? ? }
? ? }
}
package com.example.rtbootconsumer.feignservice;
?
import com.example.rtbootconsumer.pojo.User;
import com.example.rtbootconsumer.vo.ResultBody;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
?
import java.util.List;
?
?
@FeignClient(name = "service-provider", path = "/testComm", url = "${addr.url}",configuration = FeignRequestInterceptor.class)
public interface UserFeignService {
?
? ? @PostMapping(value = "/getUser")
? ? public ResultBody<User> getUser(@RequestBody User user);
}

二、創(chuàng)建兩個(gè)攔截器

也可以同時(shí)創(chuàng)建多個(gè)攔截器實(shí)現(xiàn)攔截器鏈的功能。

此時(shí)再創(chuàng)建一個(gè)攔截器FeignRequestInterceptor2,用于在請(qǐng)求頭中設(shè)置屬性名為test,值為lalala信息。

方式一:同上

package com.example.rtbootconsumer.config.interceptor;
?
import com.example.rtbootconsumer.common.utils.TraceIdUtil;
import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Configuration;
?
/**
?* @Description Feign接口請(qǐng)求攔截器
?**/
@Configuration
public class FeignRequestInterceptor2 implements RequestInterceptor {
?
? ? /**
? ? ?* @description: 將test設(shè)置到請(qǐng)求頭
? ? ?*/
? ? @Override
? ? public void apply(RequestTemplate template) {
? ? ? ? String traceId = TraceIdUtil.getTraceId();
? ? ? ? if (StringUtils.isNotEmpty(traceId)) {
? ? ? ? ? ? template.header("test", "lalala");
? ? ? ? }
? ? }
}

方式二:同上,注意這里設(shè)置的@FeignClient注解的configuration屬性值是兩個(gè)攔截器的class數(shù)組。

package com.example.rtbootconsumer.feignservice;
?
import com.example.rtbootconsumer.pojo.User;
import com.example.rtbootconsumer.vo.ResultBody;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
?
import java.util.List;
?
?
@FeignClient(name = "service-provider", path = "/testComm", url = "${addr.url}",configuration = {FeignRequestInterceptor.class,FeignRequestInterceptor2.class})
public interface UserFeignService {
?
? ? @PostMapping(value = "/getUser")
? ? public ResultBody<User> getUser(@RequestBody User user);
?
? ? @PostMapping(value = "/testList")
? ? public ResultBody<List<User>> testList(@RequestBody List<User> list);
}

三、注意

在創(chuàng)建并配置攔截器時(shí)有兩點(diǎn)需要特別注意。

1.在使用方式一去創(chuàng)建攔截器時(shí)

會(huì)攔截所有請(qǐng)求。用方式二時(shí)若@FeignClient注解的configuration屬性未設(shè)置攔截器,那么并不會(huì)攔截該接口下所有方法的請(qǐng)求。攔截器只會(huì)攔截所有configuration屬性值設(shè)置了攔截器的接口下所有方法的請(qǐng)求。因此使用方式二更靈活。

2.攔截器執(zhí)行順序

若使用方式一去創(chuàng)建多個(gè)攔截器時(shí),正如前面注釋所講,不能保證攔截器的執(zhí)行順序。

但是使用方式二則可以控制攔截器的執(zhí)行順序,攔截器的執(zhí)行順序和@FeignClient注解中configuration屬性中攔截器的配置順序有關(guān)。

若配置為 {FeignRequestInterceptor.class,FeignRequestInterceptor2.class}),則會(huì)先執(zhí)行FeignRequestInterceptor中的攔截,再執(zhí)行FeignRequestInterceptor2中的攔截。

若配置為 {FeignRequestInterceptor2.class,FeignRequestInterceptor.class}),則會(huì)先執(zhí)行FeignRequestInterceptor2中的攔截,再執(zhí)行FeignRequestInterceptor中的攔截。有興趣的可以試一下。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis傳遞多個(gè)參數(shù)的三種實(shí)現(xiàn)方法

    Mybatis傳遞多個(gè)參數(shù)的三種實(shí)現(xiàn)方法

    這篇文章主要介紹了Mybatis傳遞多個(gè)參數(shù)的三種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 深入學(xué)習(xí)Java 動(dòng)態(tài)代理

    深入學(xué)習(xí)Java 動(dòng)態(tài)代理

    Java 動(dòng)態(tài)代理機(jī)制的出現(xiàn),使得 Java 開(kāi)發(fā)人員不用手工編寫代理類,只要簡(jiǎn)單地指定一組接口及委托類對(duì)象,便能動(dòng)態(tài)地獲得代理類。下面小編和大家來(lái)一起學(xué)習(xí)一下吧
    2019-05-05
  • SpringBoot整合WebService的實(shí)現(xiàn)示例

    SpringBoot整合WebService的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot整合WebService,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 劍指Offer之Java算法習(xí)題精講數(shù)組與字符和等差數(shù)列

    劍指Offer之Java算法習(xí)題精講數(shù)組與字符和等差數(shù)列

    跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • 關(guān)于Spring Boot對(duì)jdbc的支持問(wèn)題

    關(guān)于Spring Boot對(duì)jdbc的支持問(wèn)題

    這篇文章主要介紹了關(guān)于Spring Boot對(duì)jdbc的支持問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • mybatis快速上手并運(yùn)行程序

    mybatis快速上手并運(yùn)行程序

    MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過(guò)簡(jiǎn)單的 XML 或注解來(lái)配置和映射原始類型、接口和 Java POJO為數(shù)據(jù)庫(kù)中的記錄
    2022-01-01
  • Java設(shè)計(jì)模式之責(zé)任鏈模式的示例詳解

    Java設(shè)計(jì)模式之責(zé)任鏈模式的示例詳解

    責(zé)任鏈模式是將鏈中的每一個(gè)節(jié)點(diǎn)看做是一個(gè)對(duì)象,每個(gè)節(jié)點(diǎn)處理的請(qǐng)求均不相同,且內(nèi)部自動(dòng)維護(hù)下一個(gè)節(jié)點(diǎn)對(duì)象,當(dāng)一個(gè)請(qǐng)求從鏈?zhǔn)降氖锥伟l(fā)出時(shí),會(huì)沿著鏈的路徑依次傳遞給每一個(gè)節(jié)點(diǎn)對(duì)象。本文將通過(guò)示例和大家詳細(xì)聊聊責(zé)任鏈模式,需要的可以參考一下
    2022-11-11
  • Spring中@PropertySource和@Value注解詳解

    Spring中@PropertySource和@Value注解詳解

    這篇文章主要介紹了Spring中@PropertySource和@Value注解詳解,@PropertySource注解可以方便和靈活的向Spring的環(huán)境容器(org.springframework.core.env.Environment Environment)中注入一些屬性,這些屬性可以在Bean中使用,需要的朋友可以參考下
    2023-11-11
  • java使用RandomAccessFile類基于指針讀寫文件實(shí)例代碼

    java使用RandomAccessFile類基于指針讀寫文件實(shí)例代碼

    這篇文章主要介紹了java使用RandomAccessFile類基于指針讀寫文件實(shí)例代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • java多線程文件下載器的實(shí)現(xiàn)

    java多線程文件下載器的實(shí)現(xiàn)

    本文主要介紹了java多線程文件下載器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11

最新評(píng)論