使用Feign調(diào)用時(shí)添加驗(yàn)證信息token到請(qǐng)求頭方式
Feign調(diào)用添加驗(yàn)證信息token到請(qǐng)求頭
1、這是最簡(jiǎn)單的一個(gè)方法
但是需要對(duì)每個(gè)調(diào)用都一一添加,就是使用@RequestHeader注解添加參數(shù)到請(qǐng)求頭中去
@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); }
這里需要注意,其他幾個(gè)參數(shù)都是調(diào)用debug接口需要的參數(shù),使用此接口時(shí),直接獲取驗(yàn)證信息放進(jìn)token中,就可以了
2、這個(gè)方法是網(wǎng)上大多數(shù)人的用法
但是我看到一個(gè)大神的博客,說(shuō)是這種方法有點(diǎn)不好,然后大神自定義了一個(gè)Hystrix的策略,這個(gè)第三種方法再講
這種方法是對(duì)所有的feign調(diào)用統(tǒng)一設(shè)置請(qǐng)求頭
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)用的時(shí)候添加請(qǐng)求頭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); }
到這里的時(shí)候,如果你debug的話(huà),會(huì)發(fā)現(xiàn)FeignConfiguration中的attributes獲取不到,需要再配置文件中添加如下配置就可以了
hystrix: ? command: ? ? default: ? ? ? execution: ? ? ? ? isolation: ? ? ? ? ? strategy: SEMAPHORE
3、第三種方法就是大神的方法了
和第二種方法的區(qū)別就是不需要添加配置文件,但是FeignConfiguration這個(gè)還是要的,不需要加配置文件就加一個(gè)自定義策略
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(); ? ? ? ? ? ? } ? ? ? ? } ? ? }?? }
加上這個(gè)就可以了,親測(cè)三種方法均可行。
Feign中增加請(qǐng)求頭
最近遇到項(xiàng)目在調(diào)用
實(shí)現(xiàn)RequestInterceptor 接口,然后可以根據(jù)feignClient中的值加到請(qǐng)求頭中,使用時(shí)候在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);? ?? }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IntelliJ?IDEA?2022.2?正式發(fā)布新功能體驗(yàn)
IntelliJ?IDEA?2022.2為遠(yuǎn)程開(kāi)發(fā)功能帶來(lái)了多項(xiàng)質(zhì)量改進(jìn),使其更美觀、更穩(wěn)定,新版本還具有多項(xiàng)值得注意的升級(jí)和改進(jìn),下面跟隨小編一起看看IDEA?2022.2新版本吧2022-08-08java+mysql實(shí)現(xiàn)圖書(shū)館管理系統(tǒng)實(shí)戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了java+mysql實(shí)現(xiàn)圖書(shū)館管理系統(tǒng)實(shí)戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12java file.renameTo返回false的原因及解決方案
這篇文章主要介紹了java file.renameTo返回false的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot如何通過(guò)yml方式整合Mybatis
這篇文章主要介紹了SpringBoot如何通過(guò)yml方式整合Mybatis,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04java8 對(duì)象轉(zhuǎn)Map時(shí)重復(fù) key Duplicate key xxxx的解決
這篇文章主要介紹了java8 對(duì)象轉(zhuǎn)Map時(shí)重復(fù) key Duplicate key xxxx的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09