Feign远程调用的问题
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远程调用的问题相关推荐
- Feign-基于Feign远程调用
Feign远程调用 先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: •代码可读性差,编程体验不统一 •参数复杂URL难以维护 Feign是一个声明式的http客户端, ...
- day02 Nacos集群配置、Feign远程调用和统一网关Gateway
1.Nacos配置管理 Nacos除了可以做注册中心,同样可以做配置管理来使用. 统一配置管理 当微服务部署的实例越来越多,达到数十.数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错.我们需要一 ...
- Feign远程调用组件与Gateway网关组件
文章目录 1. Feign远程调用组件 1.1 Feign简介 1.2 Feign配置应用 1.3 Feign对负载均衡的支持 1.4 Feign对熔断器的支持 1.5 Feign对请求压缩和响应压缩 ...
- 微服务之Feign远程调用
微服务之Feign远程调用 1.微服务之间一般都是业务分离,会创建一个独立的模块来存放接口,方便以后调用,以及防止代码的冗余和降低耦合性 2.导入feign的依赖 <dependency> ...
- 微服务8 Feign远程调用
目录 1.问题 2.使用 2.1导入依赖 2.2添加注解 2.3编写Feign客户端 2.4修改OrderService 2.3访问 java.lang.AbstractMethodError: Re ...
- ruoyi(若依)微服务在多服务器上部署,feign远程调用不通的问题
情况: 分别将多个模块部署到不同的服务器上 出现不同模块之间调用不通 环境:阿里云服务器 框架:RuoYi-Cloud 容器引擎:Docker 前置条件 (这里默认已经完成打包,部署) 需要在阿里服务 ...
- 怎么用feign远程调用别人的接口_Feign远程接口调用
Feign远程接口调用 clouds234@163.com 2018-8-6 以下都是使用在springboot2.0.4内置启动插件基础上 Feign-only 不注册到eureka 单独使用fei ...
- 怎么用feign远程调用别人的接口_spring cloud-openFeign声明式远程调用
spring cloud-openFeign声明式远程调用 1.概述1.1.是什么Feign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上申明注解Git ...
- 怎么用feign远程调用别人的接口_Feign - HTTP接口调用- 单独使用 - 实战
目录 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -26[ 博客园 总入口 ] 写在前面 ? 大家好,我是作者尼恩.目前和几个小伙伴一起,组织了一个高并发的实战社群[疯狂创客圈].正在 ...
最新文章
- siwft 写时复制 Copy-On-Write
- 一道让你拍案叫绝的算法题
- php-fpm 进程管理
- 土拍熔断意味着什么_半小时3宗地接连熔断 今日长沙土拍关键字:“焱”
- MySQL常用语法记录
- 用python读取股票价格_Python读取文件并给出股票价格
- 使用Unoconv和LibreOffice进行格式转换实现在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件
- 0830通用问题解决
- nps browser0.95下载地址_飞兔跑腿app下载安装_飞兔跑腿软件最新版免费下载
- 分布式数据库架构及企业实践--基于Mycat中间件pdf
- python服务端处理post请求_使用JSON处理GET和POST请求的简单Python服务器
- linux夸分区软连接的作用,Linux 硬连接和软连接的原理 (in使用)
- 2021年高考成绩查询湖南电信,湖南省通信管理局关于开展2021年全省电信网码号资源年报和检查工作的通知...
- 报错:java.lang.NullPointerException 空指针异常
- 2020中北大学计算机调剂名额,2020年中北大学考研调剂信息
- CUPS学习二:CUPS概念介绍。
- 这就涉及到ABAQUS历史输出中各能量变量的意义
- 2014年至今参与的五个项目总结
- linux 参考文献格式转化,科学网-Endnote向Bibtex格式的转换-郑小宏的博文
- 荣耀android手机怎么截图,华为荣耀畅玩5C怎么截图/截屏方法教程