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

Feign調(diào)用中的兩種Header傳參方式小結(jié)

 更新時(shí)間:2023年01月01日 12:47:10   作者:愛(ài)琴孩  
這篇文章主要介紹了Feign調(diào)用中的兩種Header傳參方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Feign調(diào)用中的兩種Header傳參方式

在Spring Cloud Netflix棧中,各個(gè)微服務(wù)都是以HTTP接口的形式暴露自身服務(wù)的,因此在調(diào)用遠(yuǎn)程服務(wù)時(shí)就必須使用HTTP客戶端。

我們可以使用JDK原生的URLConnection、Apache的Http Client、Netty的異步HTTP Client, Spring的RestTemplate。公司目前使用的是Feign。

下面來(lái)和大家一起學(xué)習(xí)下feign調(diào)用中兩種Header傳參方式。

在請(qǐng)求攔截器中統(tǒng)一配置

每次Feign調(diào)用中,需要傳遞一些安全校驗(yàn)參數(shù),比如說(shuō)token,bizId啥的,如果單獨(dú)在每次調(diào)用的時(shí)候去配置這些重復(fù)的邏輯,顯然不合適。所以我們可以在Feign的攔截器中統(tǒng)一配置這些權(quán)限參數(shù)。

如何配置呢?其實(shí)很簡(jiǎn)單。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
?
@Configuration
public class FeignConfiguration implements RequestInterceptor {
? ? @Override
? ? public void apply(RequestTemplate template) {
? ? ? ? ServletRequestAttributes attributes = (ServletRequestAttributes)
? ? ? ? ? ? ? ? RequestContextHolder.getRequestAttributes();
? ? ? ? HttpServletRequest request = attributes.getRequest();
? ? ? ? Enumeration<String> headerNames = request.getHeaderNames();
? ? ? ? if (headerNames != null) {
? ? ? ? ? ? while (headerNames.hasMoreElements()) {
? ? ? ? ? ? ? ? String name = headerNames.nextElement();
? ? ? ? ? ? ? ? String values = request.getHeader(name);
? ? ? ? ? ? ? ? template.header(name, values);
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

然后再feignClient中配置自定義的配置類,覆蓋默認(rèn)的配置

@Component
@FeignClient(value = "feignTest" ,configuration = FeignConfiguration.class)
public interface FeignTestService {
}

這樣就所有的Feign調(diào)用都會(huì)在Header調(diào)用中加上request中傳遞過(guò)來(lái)的參數(shù)。不需要單獨(dú)在每次Feign調(diào)用重復(fù)添加參數(shù)。

通過(guò)@RequestHeader注解

上面也說(shuō)到,我們?cè)跀r截器中獲取request傳遞過(guò)來(lái)的參數(shù),然后再放到header中。在攔截器中配置的一般都是公用的一些參數(shù)。

但是如果一個(gè)服務(wù)接口,需要一些特殊參數(shù)。但是其他服務(wù)不需要這個(gè)參數(shù),這時(shí)候我們不必在攔截器中配置其他服務(wù)不需要的參數(shù),只需在需要的服務(wù)接口上加上@RequestHeader注解,然后在feign調(diào)用的時(shí)候把參數(shù)傳過(guò)來(lái)就ok了。

@PostMapping(value = "/orderDetails")
public ReturnInfo getOrderDetail(@RequestHeader(name = "id") String orderId);

比如說(shuō)之前在quartz中通過(guò)Feign調(diào)用其他服務(wù)獲取優(yōu)惠券信息,項(xiàng)目中封裝的方法獲取的attributes 是空的。

ServletRequestAttributes attributes = (ServletRequestAttributes)
? ? ? ? ? ? ? ? RequestContextHolder.getRequestAttributes();

這時(shí)候就不用攔截器了,直接在方法入?yún)⑸霞由?@RequestHeader注解。

這里簡(jiǎn)單介紹下Feign調(diào)用的傳參,實(shí)際在項(xiàng)目中,大家對(duì)Feign調(diào)用方法都有自己的封裝,代碼和上面的可能不一樣,但是原理都是差不多的。

調(diào)用feign接口時(shí),如何往header中添加參數(shù)

Controller接收到請(qǐng)求后,我們可以在service中通過(guò)feign直接調(diào)用其它服務(wù)的接口,但是,controller接收到的請(qǐng)求和通過(guò)feign調(diào)用其它服務(wù),其它服務(wù)接收到的請(qǐng)求,是不一樣的。例如我們往往習(xí)慣于在header中放入用戶的token信息,在不做處理的情況下,其它服務(wù)接收到的請(qǐng)求,可能就是無(wú)用戶信息狀態(tài),這種請(qǐng)求應(yīng)該判定為無(wú)效狀態(tài)。

在服務(wù)的提供方或者調(diào)用方定義一個(gè)攔截器,將當(dāng)前請(qǐng)求的token信息手動(dòng)添加到feign請(qǐng)求的header中。

@Configuration
public class FeignRequestInterceptorConfig implements RequestInterceptor {
	@Bean
	public RequestContextListener requestContextListener() {
		return new RequestContextListener();
	}

	@Override
	public void apply(RequestTemplate requestTemplate) {
		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		if (ObjectUtils.isEmpty(attributes)) {
			return;
		}
		HttpServletRequest request = attributes.getRequest();
		String token = request.getHeader("token");
		requestTemplate.header("token", token);
	}
}

在使用過(guò)程中,可能會(huì)涉及到在請(qǐng)求方獲取自己的token信息都是為空的,查看一下是否是Hystrix策略導(dǎo)致的,如下配置可以解決該問(wèn)題。

hystrix:
  command:
    default:
      execution:
        timeout:
          #如果enabled設(shè)置為false,則請(qǐng)求超時(shí)交給ribbon控制
          enabled: true
        isolation:
          # 隔離策略
          strategy: SEMAPHORE
          thread:
            timeoutInMilliseconds: 100000

總結(jié)

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

相關(guān)文章

  • java 日期各種格式之間的相互轉(zhuǎn)換實(shí)例代碼

    java 日期各種格式之間的相互轉(zhuǎn)換實(shí)例代碼

    這篇文章主要介紹了java 日期各種格式之間的相互轉(zhuǎn)換實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Mybatis中通過(guò)generator生成mapper、Dao、mapper.xml的方法

    Mybatis中通過(guò)generator生成mapper、Dao、mapper.xml的方法

    這篇文章主要介紹了Mybatis中通過(guò)generator生成mapper、Dao、mapper.xml的方法,需要的朋友可以參考下
    2017-01-01
  • JAVA 統(tǒng)計(jì)字符串中中文,英文,數(shù)字,空格,特殊字符的個(gè)數(shù)

    JAVA 統(tǒng)計(jì)字符串中中文,英文,數(shù)字,空格,特殊字符的個(gè)數(shù)

    這篇文章主要介紹了JAVA 統(tǒng)計(jì)字符串中中文,英文,數(shù)字,空格,特殊字符的個(gè)數(shù) ,本文通過(guò)一段代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • java多線程編程制作電子時(shí)鐘

    java多線程編程制作電子時(shí)鐘

    本文給大家匯總了幾個(gè)使用java多線程編程實(shí)現(xiàn)的電子時(shí)鐘的代碼,思路非常的巧妙,也都很實(shí)用,有需要的小伙伴可以參考下。
    2015-11-11
  • 如何在springMVC的controller中獲取request

    如何在springMVC的controller中獲取request

    這篇文章主要介紹了如何在springMVC的controller中獲取request,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java抽象類的概念講解

    Java抽象類的概念講解

    今天小編就為大家分享一篇關(guān)于Java抽象類的概念講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • 基于SpringBoot使用MyBatis插件的問(wèn)題

    基于SpringBoot使用MyBatis插件的問(wèn)題

    MyBatis-Plus并不能為我們解決所有問(wèn)題,例如一些復(fù)雜的SQL,多表聯(lián)查,我們就需要自己去編寫代碼和SQL語(yǔ)句,我們?cè)撊绾慰焖俚慕鉀Q這個(gè)問(wèn)題呢,這個(gè)時(shí)候可以使用MyBatisX插件,今天小編給大家?guī)?lái)了SpringBoot使用MyBatis插件問(wèn)題,感興趣的朋友一起看看吧
    2022-03-03
  • Java設(shè)計(jì)模式的事件模型詳解

    Java設(shè)計(jì)模式的事件模型詳解

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式的事件模型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 一文掌握SpringSecurity?BCrypt密碼加密和解密

    一文掌握SpringSecurity?BCrypt密碼加密和解密

    BCrypt就是一款加密工具,可以比較方便地實(shí)現(xiàn)數(shù)據(jù)的加密工作。也可以簡(jiǎn)單理解為它內(nèi)部自己實(shí)現(xiàn)了隨機(jī)加鹽處理,這篇文章主要介紹了SpringSecurity?BCrypt密碼加密和解密,一文學(xué)會(huì)使用BCryptPasswordEncoder的方法,需要的朋友可以參考下
    2023-04-04
  • Java?中的5個(gè)代碼性能提升技巧

    Java?中的5個(gè)代碼性能提升技巧

    這篇文章主要給大家分享了Java的5個(gè)代碼性能提升的技巧,雖然大多數(shù)情況下極致優(yōu)化代碼是沒(méi)有必要的,但是作為一名技術(shù)開(kāi)發(fā)者,我們還是想追求代碼的更小、更快,更強(qiáng)。如果哪天發(fā)現(xiàn)程序的運(yùn)行速度不盡人意,就需要這樣的文章了,需要的朋友可以參考一下
    2021-12-12

最新評(píng)論

长顺县| 大埔区| 平谷区| 汉源县| 太谷县| 闵行区| 土默特右旗| 赤壁市| 潢川县| 海宁市| 扬中市| 井陉县| 巩留县| 遂宁市| 伊川县| 农安县| 永德县| 仪陇县| 大丰市| 深水埗区| 双江| 临武县| 松原市| 红河县| 台东市| 定日县| 桐城市| 达孜县| 界首市| 安国市| 莱州市| 乌拉特前旗| 香港 | 庆阳市| 贵州省| 南平市| 广河县| 霞浦县| 元朗区| 鸡西市| 南雄市|