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

使用Feign調(diào)用時添加驗證信息token到請求頭方式

 更新時間:2022年03月04日 15:54:55   作者:木子人弋山  
這篇文章主要介紹了使用Feign調(diào)用時添加驗證信息token到請求頭方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Feign調(diào)用添加驗證信息token到請求頭

1、這是最簡單的一個方法

但是需要對每個調(diào)用都一一添加,就是使用@RequestHeader注解添加參數(shù)到請求頭中去

@FeignClient(name = "capability-register", fallback = ApiServiceClientFallBack.class )
public interface ApiServiceClient {?
? ? @GetMapping("/apiDebug/")
? ? Result debug(@RequestParam("url") String path,
? ? ? ? ? ? ? ? ?@RequestParam("param") String param,
? ? ? ? ? ? ? ? ?@RequestParam("method") String method,
? ? ? ? ? ? ? ? ?@RequestParam("appKey") String appKey,
? ? ? ? ? ? ? ? ?@RequestHeader(name = "Token",required = true) String Token);
}

這里需要注意,其他幾個參數(shù)都是調(diào)用debug接口需要的參數(shù),使用此接口時,直接獲取驗證信息放進token中,就可以了

2、這個方法是網(wǎng)上大多數(shù)人的用法

但是我看到一個大神的博客,說是這種方法有點不好,然后大神自定義了一個Hystrix的策略,這個第三種方法再講

這種方法是對所有的feign調(diào)用統(tǒng)一設(shè)置請求頭

package com.hiynn.provider.configuration;?
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;?
import javax.servlet.http.HttpServletRequest;
?
/**
?* @author lidai
?* @date 2019/2/27 16:14
?* <p>
?* Feign調(diào)用的時候添加請求頭Token
?*/
@Configuration
public class FeignConfiguration implements RequestInterceptor {
?
? ? @Override
? ? public void apply(RequestTemplate requestTemplate) {
? ? ? ? ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
? ? ? ? HttpServletRequest request = attributes.getRequest();
? ? ? ? requestTemplate.header("Token", request.getHeader("Token"));
? ? }
}

有了configuration之后還需要再feign添加configuration屬性

@FeignClient(name = "capability-register", fallback = ApiServiceClientFallBack.class ,configuration = FeignConfiguration.class)
public interface ApiServiceClient {
?
? ? @GetMapping("/apiDebug/")
? ? Result debug(@RequestParam("url") String path,
? ? ? ? ? ? ? ? ?@RequestParam("param") String param,
? ? ? ? ? ? ? ? ?@RequestParam("method") String method,
? ? ? ? ? ? ? ? ?@RequestParam("appKey") String appKey);
}

到這里的時候,如果你debug的話,會發(fā)現(xiàn)FeignConfiguration中的attributes獲取不到,需要再配置文件中添加如下配置就可以了

hystrix:
? command:
? ? default:
? ? ? execution:
? ? ? ? isolation:
? ? ? ? ? strategy: SEMAPHORE

3、第三種方法就是大神的方法了

和第二種方法的區(qū)別就是不需要添加配置文件,但是FeignConfiguration這個還是要的,不需要加配置文件就加一個自定義策略

package com.hiynn.provider.configuration;?
import com.netflix.hystrix.HystrixThreadPoolKey;
import com.netflix.hystrix.HystrixThreadPoolProperties;
import com.netflix.hystrix.strategy.HystrixPlugins;
import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy;
import com.netflix.hystrix.strategy.concurrency.HystrixRequestVariable;
import com.netflix.hystrix.strategy.concurrency.HystrixRequestVariableLifecycle;
import com.netflix.hystrix.strategy.eventnotifier.HystrixEventNotifier;
import com.netflix.hystrix.strategy.executionhook.HystrixCommandExecutionHook;
import com.netflix.hystrix.strategy.metrics.HystrixMetricsPublisher;
import com.netflix.hystrix.strategy.properties.HystrixPropertiesStrategy;
import com.netflix.hystrix.strategy.properties.HystrixProperty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
?
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
?
/**
?* @author lidai
?* @date 2019/3/18 10:09
?*/
@Slf4j
@Configuration
public class FeignHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {
? ? private HystrixConcurrencyStrategy delegate;
?
? ? public FeignHystrixConcurrencyStrategy() {
? ? ? ? try {
? ? ? ? ? ? this.delegate = HystrixPlugins.getInstance().getConcurrencyStrategy();
? ? ? ? ? ? if (this.delegate instanceof FeignHystrixConcurrencyStrategy) {
? ? ? ? ? ? ? ? // Welcome to singleton hell...
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? ? ? HystrixCommandExecutionHook commandExecutionHook =
? ? ? ? ? ? ? ? ? ? HystrixPlugins.getInstance().getCommandExecutionHook();
? ? ? ? ? ? HystrixEventNotifier eventNotifier = HystrixPlugins.getInstance().getEventNotifier();
? ? ? ? ? ? HystrixMetricsPublisher metricsPublisher = HystrixPlugins.getInstance().getMetricsPublisher();
? ? ? ? ? ? HystrixPropertiesStrategy propertiesStrategy =
? ? ? ? ? ? ? ? ? ? HystrixPlugins.getInstance().getPropertiesStrategy();
? ? ? ? ? ? this.logCurrentStateOfHystrixPlugins(eventNotifier, metricsPublisher, propertiesStrategy);
? ? ? ? ? ? HystrixPlugins.reset();
? ? ? ? ? ? HystrixPlugins.getInstance().registerConcurrencyStrategy(this);
? ? ? ? ? ? HystrixPlugins.getInstance().registerCommandExecutionHook(commandExecutionHook);
? ? ? ? ? ? HystrixPlugins.getInstance().registerEventNotifier(eventNotifier);
? ? ? ? ? ? HystrixPlugins.getInstance().registerMetricsPublisher(metricsPublisher);
? ? ? ? ? ? HystrixPlugins.getInstance().registerPropertiesStrategy(propertiesStrategy);
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? log.error("Failed to register Sleuth Hystrix Concurrency Strategy", e);
? ? ? ? }
? ? }
?
? ? private void logCurrentStateOfHystrixPlugins(HystrixEventNotifier eventNotifier,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?HystrixMetricsPublisher metricsPublisher, HystrixPropertiesStrategy propertiesStrategy) {
? ? ? ? if (log.isDebugEnabled()) {
? ? ? ? ? ? log.debug("Current Hystrix plugins configuration is [" + "concurrencyStrategy ["
? ? ? ? ? ? ? ? ? ? + this.delegate + "]," + "eventNotifier [" + eventNotifier + "]," + "metricPublisher ["
? ? ? ? ? ? ? ? ? ? + metricsPublisher + "]," + "propertiesStrategy [" + propertiesStrategy + "]," + "]");
? ? ? ? ? ? log.debug("Registering Sleuth Hystrix Concurrency Strategy.");
? ? ? ? }
? ? }
?
? ? @Override
? ? public <T> Callable<T> wrapCallable(Callable<T> callable) {
? ? ? ? RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
? ? ? ? return new WrappedCallable<>(callable, requestAttributes);
? ? }
?
? ? @Override
? ? public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? HystrixProperty<Integer> corePoolSize, HystrixProperty<Integer> maximumPoolSize,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? HystrixProperty<Integer> keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
? ? ? ? return this.delegate.getThreadPool(threadPoolKey, corePoolSize, maximumPoolSize, keepAliveTime,
? ? ? ? ? ? ? ? unit, workQueue);
? ? }
?
? ? @Override
? ? public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? HystrixThreadPoolProperties threadPoolProperties) {
? ? ? ? return this.delegate.getThreadPool(threadPoolKey, threadPoolProperties);
? ? }
?
? ? @Override
? ? public BlockingQueue<Runnable> getBlockingQueue(int maxQueueSize) {
? ? ? ? return this.delegate.getBlockingQueue(maxQueueSize);
? ? }
?
? ? @Override
? ? public <T> HystrixRequestVariable<T> getRequestVariable(HystrixRequestVariableLifecycle<T> rv) {
? ? ? ? return this.delegate.getRequestVariable(rv);
? ? }
?
? ? static class WrappedCallable<T> implements Callable<T> {
? ? ? ? private final Callable<T> target;
? ? ? ? private final RequestAttributes requestAttributes;
?
? ? ? ? public WrappedCallable(Callable<T> target, RequestAttributes requestAttributes) {
? ? ? ? ? ? this.target = target;
? ? ? ? ? ? this.requestAttributes = requestAttributes;
? ? ? ? }
?
? ? ? ? @Override
? ? ? ? public T call() throws Exception {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? RequestContextHolder.setRequestAttributes(requestAttributes);
? ? ? ? ? ? ? ? return target.call();
? ? ? ? ? ? } finally {
? ? ? ? ? ? ? ? RequestContextHolder.resetRequestAttributes();
? ? ? ? ? ? }
? ? ? ? }
? ? }??
}

加上這個就可以了,親測三種方法均可行。 

Feign中增加請求頭

最近遇到項目在調(diào)用

實現(xiàn)RequestInterceptor 接口,然后可以根據(jù)feignClient中的值加到請求頭中,使用時候在feignClient中配置,這樣就可以把參數(shù)傳入feign中

import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.commons.collections4.CollectionUtils;?
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
??
public class FeignConfiguration implements RequestInterceptor {??
? ? @Override
? ? public void apply(RequestTemplate template) {
?
? ? ? ? List<String> list = new ArrayList<>();
? ? ? ? if ("get".equalsIgnoreCase(template.method())){
? ? ? ? ? ? Map<String, Collection<String>> queries = template.queries();
? ? ? ? ? ? list = (List<String>) queries.get("key");
?
? ? ? ? } else if ("post".equalsIgnoreCase(template.method())){
? ? ? ? ? ? byte[] body = template.body();
? ? ? ? ? ? Map<String, Object> map = JSONObject.parseObject(body, Map.class);
? ? ? ? ? ? Object key = map.get("key");
? ? ? ? ? ? if (key != null){
? ? ? ? ? ? ? ? list.add(key.toString());
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? if (CollectionUtils.isNotEmpty(list)) {
? ? ? ? ? ? template.header("head", list);
? ? ? ? }
? ? }?
}
import com.hbasesoft.vcc.sgp.integral.goods.config.FeignConfiguration;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;?
?
@FeignClient(name = "test", path = "/test", configuration = FeignConfiguration.class)
public interface ErpGoodsCouponsExternalClient {
?
? ? @GetMapping("/url")
? ? Object getData(@RequestParam("key") String key);? ??
}

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

相關(guān)文章

  • 基于SpringBoot2.0版本與老版本的區(qū)別

    基于SpringBoot2.0版本與老版本的區(qū)別

    這篇文章主要介紹了SpringBoot2.0版本與老版本的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • IntelliJ?IDEA?2022.2?正式發(fā)布新功能體驗

    IntelliJ?IDEA?2022.2?正式發(fā)布新功能體驗

    IntelliJ?IDEA?2022.2為遠程開發(fā)功能帶來了多項質(zhì)量改進,使其更美觀、更穩(wěn)定,新版本還具有多項值得注意的升級和改進,下面跟隨小編一起看看IDEA?2022.2新版本吧
    2022-08-08
  • java+mysql實現(xiàn)圖書館管理系統(tǒng)實戰(zhàn)

    java+mysql實現(xiàn)圖書館管理系統(tǒng)實戰(zhàn)

    這篇文章主要為大家詳細介紹了java+mysql實現(xiàn)圖書館管理系統(tǒng)實戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • java file.renameTo返回false的原因及解決方案

    java file.renameTo返回false的原因及解決方案

    這篇文章主要介紹了java file.renameTo返回false的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java系統(tǒng)中拆分同步和異步詳解

    Java系統(tǒng)中拆分同步和異步詳解

    這篇文章主要給大家介紹了關(guān)于Java系統(tǒng)中拆分同步和異步的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Nacos負載均衡策略總結(jié)

    Nacos負載均衡策略總結(jié)

    Nacos 作為目前主流的微服務(wù)中間件,包含了兩個頂級的微服務(wù)功能:配置中心和注冊中心,本文給大家總結(jié)了幾種Nacos負載均衡策略,通過圖文結(jié)合介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • SpringBoot如何通過yml方式整合Mybatis

    SpringBoot如何通過yml方式整合Mybatis

    這篇文章主要介紹了SpringBoot如何通過yml方式整合Mybatis,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • java 動態(tài)生成bean的案例

    java 動態(tài)生成bean的案例

    這篇文章主要介紹了java 動態(tài)生成bean的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java8 對象轉(zhuǎn)Map時重復(fù) key Duplicate key xxxx的解決

    java8 對象轉(zhuǎn)Map時重復(fù) key Duplicate key xxxx的解決

    這篇文章主要介紹了java8 對象轉(zhuǎn)Map時重復(fù) key Duplicate key xxxx的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 詳解Java中的內(nèi)存屏障

    詳解Java中的內(nèi)存屏障

    這篇文章主要介紹了Java中的內(nèi)存屏障的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-05-05

最新評論