尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

解决Spring Cloud Gateway中使用CompletableFuture.supplyAsync()执行Feign调用报错

解决Spring Cloud Gateway中使用CompletableFuture.supplyAsync()执行Feign调用报错
📅 发布时间:2026/6/19 17:22:20

报错背景描述

组件版本信息:

  • Spring Cloud:2021.0.5
  • Spring Cloud Alibaba:2021.0.5.0
  • Nacos:2.2.3

项目采用基于Spring Cloud Alibaba + Nacos的微服务架构,生产环境部署时服务部署到阿里云ACK容器集群中,并使用阿里云MSE云原生网关作为接入层。
出于成本考虑,在测试环境并未直接采购阿里云ACK集群和MSE云原生网关,所以使用Spring Cloud Gateway作为测试环境的网关服务。生产环境部署时,在MSE云原生网关处对请求接口做了全局鉴权,因此也需要在Spring Cloud Gateway服务做相同的事情,如下所示:
接口请求流程

当网关接收到客户端请求服务A的接口时,先要到鉴权服务校验请求参数是否正确(如:对于需要登录才能访问的接口,必须携带正确的token参数)。如果鉴权失败,在网关处直接将错误信息响应给客户端;只有鉴权成功后,网关再将请求转发给服务A,并将服务A的响应结果返回给客户端。

由于网关和服务A都注册到了同一个Nacos注册中心,因此网关可以通过Feign框架发起基于HTTP协议的RPC调用,添加如下依赖配置:

<!--配置feign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency><!-- 为Feign提供负载均衡 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

另外,在发起对鉴权服务的HTTP接口调用时,还需要使用“异步转同步”的思路:

// 异步转同步:调用feign服务接口
RpcResult resultVO = this.syncInvoke(CompletableFuture.supplyAsync(() -> authRemoteClient.validateToken(os, token, appVersion)));/*** 将异步调用转换为同步调用* @param future {@link CompletableFuture}* @return 同步返回结果*/
private RpcResult syncInvoke(CompletableFuture<ResponseEntity<String>> future) {if (future == null) {return RpcResult.error();}try {ResponseEntity<String> response = future.get();String body = response.getBody();RpcResult result = JsonUtil.fromJson(body, RpcResult.class);if (result.isError()) {// 如果token校验不通过,直接返回校验失败的信息return result;}// 校验token通过,将用户uid返回HttpHeaders headers = response.getHeaders();String uid = headers.getFirst("uid");RpcResult rpcResult = RpcResult.success();rpcResult.setData(uid);return rpcResult;} catch (Exception e) {logger.info("同步调用执行出错:{}", e.getMessage(), e);throw new RuntimeException(e);}
}

运行时调用鉴权服务会发生如下报错:

Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [org.springframework.cloud.loadbalancer.annotation.LoadBalancerClientConfiguration]; nested exception is java.lang.IllegalArgumentException: Could not find class [org.springframework.boot.autoconfigure.condition.OnPropertyCondition]  

问题解决

经过检索后得知,这是一个已知的BUG,详见:Use classloader from class

解决办法:

将调用方法CompletableFuture.supplyAsync(Supplier<U> supplier)改为调用CompletableFuture.supplyAsync(Supplier<U> supplier,Executor executor),主动传递一个线程池参数即可。

// 异步执行线程池
private Executor asynchronousExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(EXECUTOR_QUEUE_SIZE),new AbortPolicy());// 异步转同步:调用feign服务接口
CompletableFuture future = CompletableFuture.supplyAsync(() -> authRemoteClient.validateToken(os, token, appVersion), asynchronousExecutor);
RpcResult resultVO = this.syncInvoke(future);

【参考】
Spring Cloud 疑难杂症之 CompletableFuture 与 Openfeign 一起使用的问题


作者:编程随笔
出处:http://www.cnblogs.com/nuccch/
声明:本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给出原文连接。

相关新闻

  • anything
  • 从vw/vh到clamp(),前端响应式设计的痛点与进化 - 实践
  • 10413_基于Springboot的智慧养老院管理系统

最新新闻

  • 黄金铂金白银回收门店整理,各区均有分店联系方式 - 三大殿
  • 盘锦市闲置黄金变现多少钱?本地5家回收门店最新报价参考 - 千叶啊
  • CurseBreaker未来路线图:插件管理器的发展方向与规划
  • 2026安徽省铜陵市电大中专会计二建报考前置学历最新发布 - cc江江
  • 承德市黄金回收实体店怎么选?这份清单帮你货比三家 - 开始就结束
  • 旧书店

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号