1. Feign远程调用丢失请求头问题

问题:使用feign远程调用会创建一个新request,会丢失请求头。

解决:加上feign远程调用的请求拦截器。使用拦截器apply方法应用拦截器,使用 RequestContextHolder拿到之前请求数据并加上请求头。

new request -> 远程调用拦截器 -> 远程调用

@Configuration
public class GuliFeignConfig {@Bean("requestInterceptor")public RequestInterceptor requestInterceptor() {RequestInterceptor requestInterceptor = new RequestInterceptor() {@Overridepublic void apply(RequestTemplate template) {//1、使用RequestContextHolder拿到刚进来的请求数据ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (requestAttributes != null) {//老请求HttpServletRequest request = requestAttributes.getRequest();if (request != null) {//2、同步请求头的数据(主要是cookie)//把老请求的cookie值放到新请求上来,进行一个同步String cookie = request.getHeader("Cookie");template.header("Cookie", cookie);}}}};return requestInterceptor;}
}

2. Feign异步调用丢失请求头问题

//解决Feign异步调用丢失请求头问题//主线程获取当前线程请求头信息
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();//子线程都来共享之前的请求数据
RequestContextHolder.setRequestAttributes(requestAttributes);
    @Overridepublic OrderConfirmVo confirmOrder() throws ExecutionException, InterruptedException {//构建OrderConfirmVoOrderConfirmVo confirmVo = new OrderConfirmVo();//获取当前用户登录的信息MemberRespVo memberResponseVo = LoginUserInterceptor.loginUser.get();//TODO :获取当前线程请求头信息(解决Feign异步调用丢失请求头问题)RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();//开启第一个异步任务CompletableFuture<Void> addressFuture = CompletableFuture.runAsync(() -> {//每一个线程都来共享之前的请求数据RequestContextHolder.setRequestAttributes(requestAttributes);//1、远程查询所有的收获地址列表List<MemberAddressVo> address = memberFeignService.getAddress(memberResponseVo.getId());confirmVo.setMemberAddressVos(address);}, threadPoolExecutor);//开启第二个异步任务CompletableFuture<Void> cartInfoFuture = CompletableFuture.runAsync(() -> {//每一个线程都来共享之前的请求数据RequestContextHolder.setRequestAttributes(requestAttributes);//2、远程查询购物车所有选中的购物项List<OrderItemVo> currentCartItems = cartFeignService.getCurrentCartItems();confirmVo.setItems(currentCartItems);//feign在远程调用之前要构造请求,调用很多的拦截器}, threadPoolExecutor).thenRunAsync(() -> {List<OrderItemVo> items = confirmVo.getItems();//获取全部商品的idList<Long> skuIds = items.stream().map((itemVo -> itemVo.getSkuId())).collect(Collectors.toList());//远程查询商品库存信息R skuHasStock = wmsFeignService.getSkuHasStock(skuIds);List<SkuStockVo> skuStockVos = skuHasStock.getData("data", new TypeReference<List<SkuStockVo>>() {});if (skuStockVos != null && skuStockVos.size() > 0) {//将skuStockVos集合转换为mapMap<Long, Boolean> skuHasStockMap = skuStockVos.stream().collect(Collectors.toMap(SkuStockVo::getSkuId, SkuStockVo::getHasStock));confirmVo.setStocks(skuHasStockMap);}},threadPoolExecutor);//3、查询用户积分Integer integration = memberResponseVo.getIntegration();confirmVo.setIntegration(integration);//4、价格数据自动计算//TODO 5、防重令牌(防止表单重复提交)//为用户设置一个token,三十分钟过期时间(存在redis)String token = UUID.randomUUID().toString().replace("-", "");redisTemplate.opsForValue().set(USER_ORDER_TOKEN_PREFIX+memberResponseVo.getId(),token,30, TimeUnit.MINUTES);confirmVo.setOrderToken(token);CompletableFuture.allOf(addressFuture,cartInfoFuture).get();return confirmVo;}

Feign远程调用的问题相关推荐

  1. Feign-基于Feign远程调用

    Feign远程调用 先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: •代码可读性差,编程体验不统一 •参数复杂URL难以维护 Feign是一个声明式的http客户端, ...

  2. day02 Nacos集群配置、Feign远程调用和统一网关Gateway

    1.Nacos配置管理 Nacos除了可以做注册中心,同样可以做配置管理来使用. 统一配置管理 当微服务部署的实例越来越多,达到数十.数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错.我们需要一 ...

  3. Feign远程调用组件与Gateway网关组件

    文章目录 1. Feign远程调用组件 1.1 Feign简介 1.2 Feign配置应用 1.3 Feign对负载均衡的支持 1.4 Feign对熔断器的支持 1.5 Feign对请求压缩和响应压缩 ...

  4. 微服务之Feign远程调用

    微服务之Feign远程调用 1.微服务之间一般都是业务分离,会创建一个独立的模块来存放接口,方便以后调用,以及防止代码的冗余和降低耦合性 2.导入feign的依赖 <dependency> ...

  5. 微服务8 Feign远程调用

    目录 1.问题 2.使用 2.1导入依赖 2.2添加注解 2.3编写Feign客户端 2.4修改OrderService 2.3访问 java.lang.AbstractMethodError: Re ...

  6. ruoyi(若依)微服务在多服务器上部署,feign远程调用不通的问题

    情况: 分别将多个模块部署到不同的服务器上 出现不同模块之间调用不通 环境:阿里云服务器 框架:RuoYi-Cloud 容器引擎:Docker 前置条件 (这里默认已经完成打包,部署) 需要在阿里服务 ...

  7. 怎么用feign远程调用别人的接口_Feign远程接口调用

    Feign远程接口调用 clouds234@163.com 2018-8-6 以下都是使用在springboot2.0.4内置启动插件基础上 Feign-only 不注册到eureka 单独使用fei ...

  8. 怎么用feign远程调用别人的接口_spring cloud-openFeign声明式远程调用

    spring cloud-openFeign声明式远程调用 1.概述1.1.是什么Feign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上申明注解Git ...

  9. 怎么用feign远程调用别人的接口_Feign - HTTP接口调用- 单独使用 - 实战

    目录 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -26[ 博客园 总入口 ] 写在前面 ? 大家好,我是作者尼恩.目前和几个小伙伴一起,组织了一个高并发的实战社群[疯狂创客圈].正在 ...

最新文章

  1. siwft 写时复制 Copy-On-Write
  2. 一道让你拍案叫绝的算法题
  3. php-fpm 进程管理
  4. 土拍熔断意味着什么_半小时3宗地接连熔断 今日长沙土拍关键字:“焱”
  5. MySQL常用语法记录
  6. 用python读取股票价格_Python读取文件并给出股票价格
  7. 使用Unoconv和LibreOffice进行格式转换实现在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件
  8. 0830通用问题解决
  9. nps browser0.95下载地址_飞兔跑腿app下载安装_飞兔跑腿软件最新版免费下载
  10. 分布式数据库架构及企业实践--基于Mycat中间件pdf
  11. python服务端处理post请求_使用JSON处理GET和POST请求的简单Python服务器
  12. linux夸分区软连接的作用,Linux 硬连接和软连接的原理 (in使用)
  13. 2021年高考成绩查询湖南电信,湖南省通信管理局关于开展2021年全省电信网码号资源年报和检查工作的通知...
  14. 报错:java.lang.NullPointerException 空指针异常
  15. 2020中北大学计算机调剂名额,2020年中北大学考研调剂信息
  16. CUPS学习二:CUPS概念介绍。
  17. 这就涉及到ABAQUS历史输出中各能量变量的意义
  18. 2014年至今参与的五个项目总结
  19. linux 参考文献格式转化,科学网-Endnote向Bibtex格式的转换-郑小宏的博文
  20. 荣耀android手机怎么截图,华为荣耀畅玩5C怎么截图/截屏方法教程

热门文章

  1. Java面试手册(全)
  2. python asyncio原理_Asyncio 源码分析
  3. Reac.js入门Redux05
  4. 玩转「Wi-Fi」系列之应用程序(五)
  5. clique共识机制流程及#17620 bug修复理解
  6. 如何在 IDEA Intellij中打开数据库视图界面
  7. Vue iview 动态显示表头信息
  8. hexo主题—自定义样式
  9. jsp和severlet的区别
  10. 随手做一个响应式动画登录界面