文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

微服务feign调用添加token的问题

2023-06-20 12:41

关注

小编给大家分享一下微服务feign调用添加token的问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

微服务feign调用添加token

1.一般情况是这么配置的

具体的怎么调用就不说了 如下配置,就可以在请求头中添加需要的请求头信息。

package localdate;import feign.RequestInterceptor;import feign.RequestTemplate;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestAttributes;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;import java.util.Collection;import java.util.Enumeration;import java.util.Iterator;import java.util.Map;@Configuration@Slf4jpublic class FeignTokenInterceptor implements RequestInterceptor {    @Override    public void apply(RequestTemplate requestTemplate) {        log.info("======上下文中获取原请求信息======");        String token = "without token";        HttpServletRequest request = ((ServletRequestAttributes)                RequestContextHolder.getRequestAttributes()).getRequest();        Enumeration<String> headerNames = request.getHeaderNames();        while (headerNames.hasMoreElements()) {            String headerName = headerNames.nextElement();            String HeadValue = request.getHeader(headerName);            log.info("===原请求头信息=== headName: {}, headValue: {}", headerName, HeadValue);            if (headerName.equals("X-Authorization-access_token")||headerName.equals("x-authorization-access_token")) {                token = HeadValue;            }        }        log.info("=======Feign添加头部信息start======");//        requestTemplate.header("X-Authorization-access_token", token);        requestTemplate.header("X-Authorization-access_token", "tron123456");        log.info("=======Feign添加头部信息end======");    }}

2 .但是,当熔断开启后,原先的这么配置就不起作用了

package localdate;import com.netflix.hystrix.HystrixThreadPoolKey;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 org.slf4j.Logger;import org.slf4j.LoggerFactory;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;//@Configurationpublic class FeignConfig extends HystrixConcurrencyStrategy {    private static final Logger log = LoggerFactory.getLogger(FeignConfig.class);    private HystrixConcurrencyStrategy delegate;    public FeignConfig() {        try {            this.delegate = HystrixPlugins.getInstance().getConcurrencyStrategy();            if (this.delegate instanceof FeignConfig) {                // 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 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();            }        }    }}

3 .feign和熔断的配置

feign:  client:    config:      default:        connectTimeout: 5000   #连接超时3秒,连接失败时直接调用降级方法        readTimeout: 100000     #连接成功,处理数据的时间限制10秒 100000   读取时间过短会抛异常java.net.SocketTimeoutException: Read timed out        loggerLevel: full      #日志输出等级  hystrix:    enabled: truehystrix:  command:    default:      execution:        isolation:          thread:            timeoutInMilliseconds: 5000  #服务连接成功,但是时间过长,降级方法调用时间   60000   5000

feign微服务的相互调用

我只是记录服务提供方、消费方的代码编写,配置什么的大家在网上搜,一大堆。

首先是服务提供方:

启动类上加上注解@EnableFeignClients,然后正常的写controller、service等业务逻辑

微服务feign调用添加token的问题

其次是服务的调用方:

首先启动类上加上注解@EnableFeignClients

微服务feign调用添加token的问题

编写服务调用接口

微服务feign调用添加token的问题

编写接口熔断处理方法

微服务feign调用添加token的问题

本人遇到的问题是需要用到调用方的请求头里面的信息,但是在提供方取不到,这时可以通过在调用方增加配置来解决

微服务feign调用添加token的问题

import feign.RequestInterceptor;import feign.RequestTemplate;import java.util.Enumeration;import javax.servlet.http.HttpServletRequest;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes; public class FeignBasicAuthRequestInterceptor implements RequestInterceptor {   @Override  public void apply(RequestTemplate requestTemplate) {    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);        requestTemplate.header(name, values);      }    }  }}

微服务feign调用添加token的问题

import com.jingling.netsign.applet.interceptor.FeignBasicAuthRequestInterceptor;import feign.RequestInterceptor;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration; @Configurationpublic class FeignSupportConfig {    @Bean  public RequestInterceptor requestInterceptor(){    return new FeignBasicAuthRequestInterceptor();  }}

看完了这篇文章,相信你对“微服务feign调用添加token的问题”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯