nested exception is feign.RetryableException: Incomplete output stream executing POST http://

一、背景

SpringCloud微服务框架中使用OpenFeign做服务间调用时(入参为@ResponseBody标注的JavaBean,请求类型为POST),被调用方正常执行,调用方报错,报错信息如下:

nested exception is feign.RetryableException: Incomplete output stream executing POST http://SERVICE-A/user/] with root cause
在这里插入图片描述

二、原因分析

从报错的截图可以看出feign采用jdk原生HttpURLConnection向下游服务发起http请求,这里报错的原因是:执行POST的输出流不完整,即在OutputStream写入流时出错。

三、解决方案

1、使用Apache HttpClient替换掉原生的HttpURLConnection。

在服务调用方pom.xml文件中添加如下依赖:

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

不需要在application.yml中使用feign.httpclient.enabled=true指定使用HttpClient。

因为在将LoadBalancerFeignClient注入到Spring容器时,采用HttpClient方式的配置类HttpClientFeignLoadBalancedConfiguration的条件装配信息如下:

在这里插入图片描述

对属性feign.httpclient.enabled做评估时,如果未指定该属性,则默认为true,因此只需要可以找到feign.httpclient包的ApacheHttpClient类即会使用Apache的httpClient。

2、使用okClient替换掉原生的HttpURLConnection

在服务调用方pom.xml文件中添加如下依赖:

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
</dependency>

另外需要在application.yml中使用feign.okhttp.enabled=true指定使用OKHttpClient。

因为在将LoadBalancerFeignClient注入到Spring容器时,采用OKHttpClient方式的配置类OkHttpFeignLoadBalancedConfiguration的条件装配信息如下:

在这里插入图片描述

对属性feign.okhttp.enabled做评估时,如果未指定该属性(默认为false) 或指定为 false则当前配置类不符合条件装配的规则,则不会使用OKHttpClient;另外还需要引入feign.okhttp包的OkHttpClient类。

四、其他

想了解更多OpenFeign的知识点,可以看博主的OpenFeign系列文章:

  1. SpringCloud之Feign实现声明式客户端负载均衡详细案例
  2. SpringCloud之OpenFeign实现服务间请求头数据传递(OpenFeign拦截器RequestInterceptor的使用)
  3. SpringCloud之OpenFeign的常用配置(超时、数据压缩、日志)
  4. SpringCloud之OpenFeign的核心组件(Encoder、Decoder、Contract)
  5. SpringBoot启动流程中开启OpenFeign的入口(ImportBeanDefinitionRegistrar详解)
  6. 源码剖析OpenFeign如何扫描所有的FeignClient
  7. 源码剖析OpenFeign如何为FeignClient生成动态代理类
  8. …等等等
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃秃爱健身

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值