0
点赞
收藏
分享

微信扫一扫

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


一、背景

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

二、原因分析

从报错的截图可以看出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​​的条件装配信息如下:

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

对属性​​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​​的条件装配信息如下:

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

对属性​​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. …等等等


举报

相关推荐

0 条评论