当前位置: 首页 > news >正文

[Day8] Contract-AI 的 bugfix 之路,疑难杂症大揭秘:GLM、Feign 及文件传递问题全攻克

后端技术实践:问题与解决方案

目录

  1. GLM接口链接文件获取问题
  2. Feign访问400问题排查与解决
  3. 接口文件传递问题及处理
  4. 总结与下期预告

GLM接口链接文件获取问题

在项目开发过程中,遇到了GLM接口无法获取链接文件的情况。尽管传递的格式正确,且链接本身在正常访问场景下可用,但无论是minio分享链接,还是其他形式的分享链接,模型均无法识别。

经过排查发现,并非文件本身存在问题,推测可能是链接被某种规则屏蔽。因为当把文件通过nginx反向代理到公网后,文件能够正常被访问。

阿里的百炼针对此类情况,提供了平台内部的oss存储供模型调用。然而,由于对接百炼调用成本对比原平台过高,最终并未采用此方案。

后来,采用了一种较为简单的上云解决方案:通过腾讯云赠送的OSS,然后使用腾讯云的OSS API开放一个有效期为一小时的链接给模型访问。这样既解决了安全性问题,也满足了存储需求。

在此过程中,为排查模型无法访问链接的原因耗费了好几天时间,但遗憾的是,最终也未明确具体原因。提工单没有得到有效解释,相关文档也无说明。若有大佬知晓原因,恳请在评论区留言或私信指点,不胜感激

Feign访问400问题排查与解决

一次访问400的排查

项目启动注册后,Feign访问各个接口均出现400错误。经过一个下午加半天的排查,最终将问题定位在配置类上(当时没有经验,实在是惭愧,现在写文章的时候回想起来,看到4开头的错误码就该想到是请求/配置本身的问题)。

通过在SynchronousMethodHandlertargetRequest设置断点,发现多个配置类重复设置了请求头。按照原本设计,不同的client应使用对应的configuration,但实际情况是这些配置类被重复使用,从而导致请求出现400错误。

问题核心

该问题的核心在于:Feign对客户端专属配置类的处理逻辑,和Spring全局的Bean管理机制是分开的。即便配置类没有被@Configuration(或@Component等)标记,Feign依然能通过特殊逻辑识别并使用其中的@Bean。具体原因如下:

1. Feign客户端的“专属上下文”机制

当在@FeignClient中通过configuration属性指定配置类(如DeepSeekConfiguration)时,Feign会为这个客户端创建一个独立的子上下文(Subcontext)。这个上下文专门用于管理当前客户端的配置,如拦截器、超时设置等,并不依赖Spring的全局容器。

这个“子上下文”具有以下作用:

  • 隔离配置:避免不同Feign客户端的配置相互干扰;
  • 专属加载:专门加载configuration属性指定的配置类中的Bean。

例如,想象一个小区有很多栋楼(不同的Feign客户端),每栋楼都有自己独立的水电管理系统(子上下文),互不干扰。

2. Feign如何识别配置类中的@Bean

即便配置类没有@Configuration注解,Feign依然能够解析其中的@Bean方法,原因如下:

  • Feign会通过SpringFeign的内部逻辑,显式扫描configuration指定的类;
  • 对于这些类中的@Bean方法,Feign会直接调用它们来创建实例,类似“手动实例化”,而非依赖Spring全局容器的自动扫描;
  • 这些通过@Bean创建的对象会被注册到当前Feign客户端的“子上下文”中,仅对该客户端可见。

打个比方,就好像在一个班级(Feign客户端)里,老师(Feign)专门挑选了几个同学(配置类)来完成特定任务(创建Bean),而不需要学校(Spring全局容器)统一安排。

3. 为什么不需要Spring全局管理这些Bean?
  • 若采用全局管理(加@Configuration),会导致Bean被注册到Spring主容器,所有Feign客户端都会共享这些Bean,这正是之前遇到的问题;
  • 而Feign客户端的“子上下文”仅需“临时”创建并使用这些Bean,用完后仅在当前客户端范围内生效。
4. 依赖注入(如@Value)为何依然有效?

在配置类中,@Value("${ai.strategy.deepseek.api - key:}")依然能获取配置,这是因为Feign的“子上下文”会委托Spring主容器解析依赖,如@Value@Autowired等。也就是说,配置类中的依赖,如配置项、其他Bean,会从主容器中获取,但配置类本身和其@Bean创建的对象不会被注册到主容器。

总结:核心区别
场景@Configuration不加@Configuration(仅在@FeignClient.configuration中指定)
Bean注册位置Spring主容器(全局可见)Feign客户端专属“子上下文”(仅当前客户端可见)
生效范围所有Feign客户端共享仅指定的Feign客户端使用
依赖解析主容器自动处理子上下文委托主容器处理依赖

简单来讲,Feign通过“专属子上下文”机制,绕开了Spring全局Bean的管理,专门为每个客户端加载配置类中的@Bean,既保证了配置的隔离性,又能正常使用Spring的依赖注入能力。这就是去掉@Configuration后,Feign依然能使用这些@Bean的核心原因。

最终的解决方法是去掉这些配置类的@Component,仅依靠Feign的configuration配置来注册这些bean在Feign的上下文中。

接口无法正常传递文件

最初,接口直接使用inputstream作为返回值,然而这一做法导致Feign需要转换器才能正常工作。经过调整,将返回值换成byte数组后,接口便能正常传递文件。

总结与下期预告

在本次项目实践中,遇到了GLM接口链接文件获取、Feign访问400以及接口文件传递等问题,并通过各种排查与分析,找到了相应的解决方案。

下期将探讨management模块。目前基础模块已基本搭建完成,接下来将着手搭建上层模块,如同搭建积木一般,逐步完善整个项目架构。

http://www.jsqmd.com/news/206956/

相关文章:

  • 华为OD机试真题双机位C卷 【采购订单】C语言实现
  • 渗透测试该如何系统学习?一份从小白到实战的学习路径规划
  • 深度学习毕设项目:基于python的蔬菜识别基于CNN卷积网络的蔬菜识别
  • Agent全面爆发!一文搞懂Agent开发核心链路
  • 2026必备!8个AI论文平台,助你轻松搞定本科毕业论文!
  • 渗透测试和逆向工程,它们的区别是什么?当一名白帽黑客要学逆向吗?
  • 【课程设计/毕业设计】基于机器学习CNN卷积网络的蔬菜识别基于深度学习的蔬菜识别
  • 微服务架构下的高可用保障:RuoYi-Cloud中Sentinel与Feign的完美融合
  • 智能体迈入 Agent RL 新架构时代?
  • 深度学习毕设选题推荐:基于CNN深度学习的遥感图片识别沙漠湖泊和森林基于pythonCNN深度学习的遥感图片识别沙漠湖泊和森林
  • 渗透测试技术,从入门到精通,小白也能成为白帽黑客,最新的学习路线和方法都在这。
  • 一文彻底厘清:AI Agent、Agentic Workflow与Agentic AI
  • qsort-简单使用 · vs2022调试
  • 深度学习计算机毕设之基于深度学习卷积网络的蔬菜识别基于CNN卷积网络的蔬菜识别
  • 【毕业设计】基于CNN卷积网络的蔬菜识别基于python卷积网络的蔬菜识别
  • python基于django的基于微信小程序的校园资讯共享平台_ 校园表白墙系统c8463qc4
  • 吐血推荐8个AI论文平台,继续教育学生轻松搞定毕业论文!
  • 计算机深度学习毕设实战-基于pythonCNN深度学习的遥感图片识别沙漠湖泊和森林基于CNN深度学习的遥感图片识别沙漠湖泊和森林
  • IE浏览器正式退役,为何你依然需要它?这份启用ie浏览器恢复指南请收好
  • 深度学习计算机毕设之基于CNN深度学习的遥感图片识别沙漠湖泊和森林基于python的遥感图片识别沙漠湖泊和森林
  • 深度学习毕设选题推荐:人工智能基于深度学习的蔬菜识别基于CNN卷积网络的蔬菜识别
  • 深度学习毕设项目:基于CNN深度学习的遥感图片识别沙漠湖泊和森林基于机器学习的遥感图片识别沙漠湖泊和森林
  • 深度剖析 HashMap:从 JDK 1.7 死循环到 1.8 高低位映射优化
  • 半导体集成电路详解:数字IC、逻辑器件。
  • 【课程设计/毕业设计】python基于CNN机器学习的遥感图片识别沙漠湖泊和森林基于CNN深度学习的遥感图片识别沙漠湖泊和森林
  • 深度解析Apache RocketMQ:从核心原理到实战应用
  • 怎么查看Win10系统的内存(RAM)大小?
  • 一个http请求的过程
  • 虚拟磁盘存储方式:单个文件 Or 多个文件?
  • 【毕业设计】基于python的遥感图片识别沙漠湖泊和森林基于CNN深度学习的遥感图片识别沙漠湖泊和森林