Feign客户端异常IOException: Incomplete output stream解决方案-程序员宅基地

技术标签: Spring Cloud2.x系列教程  Feign  

一. 前言

在开发SpringCloud项目架构的项目时,服务与服务之间的调用通过Feign客户端实现,在做一个从Feign客户端到service服务端的POST请求时,Feign客户端为服务消费者觉得,service服务端为服务提供者角色,提供者角色中service服务端Controller类中方法测试正常,但却在Feign客户端返回时报错,大致异常如下:

Caused by: java.io.IOException: Incomplete output stream
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1523)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
    at feign.Client$Default.convertResponse(Client.java:152)
    at feign.Client$Default.execute(Client.java:74)
    .........................................

二. 分析异常

关键异常: IOException: Incomplete output stream, 从表面意思看,是IO异常,异常信息也是从Feign客户端源码报出来的,这样一步一步锁定异常范围,根据异常调用链得知最终异常出现的地方是:sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1523)
HttpURLConnection.getInputStream0方法1523行。经过搜索资料,原来feign采用jdk原生HttpURLConnection向下游服务发起http请求(源码详见feign.Client.Default),先到getInputStream0方法看看:

 private synchronized InputStream getInputStream0() throws IOException {
    
        if(!this.doInput) {
    
            throw new ProtocolException("Cannot read from URLConnection if doInput=false (call setDoInput(true))");
        } else if(this.rememberedException != null) {
    
            if(this.rememberedException instanceof RuntimeException) {
    
                throw new RuntimeException(this.rememberedException);
            } else {
    
                throw this.getChainedException((IOException)this.rememberedException);
            }
        } else if(this.inputStream != null) {
    
            return this.inputStream;
        } else {
    
            if(this.streaming()) {
    
                if(this.strOutputStream == null) {
    
                    this.getOutputStream();
                }

                this.strOutputStream.close();
                if(!this.strOutputStream.writtenOK()) {
       
                    throw new IOException("Incomplete output stream"); // 1523行
                }
            }..........

        // this.strOutputStream.writtenOK()方法
        boolean writtenOK() {
    
            return this.closed && !this.error;
        }

看起来,this.error是true导致的,也就是说在OutputStream写入流时出错。

三. 解决方案

1. 加feign-httpclient依赖

没办法,只能用Apache HttpClient替换掉原生HttpURLConnection。加入依赖:

<!-- 使用Apache HttpClient替换Feign原生httpclient -->
<!-- feign-httpclient内含Apache HttpClient -->
        <dependency>
            <groupId>com.netflix.feign</groupId>
            <artifactId>feign-httpclient</artifactId>
            <version>8.17.0</version>
        </dependency>

2. 开启Feign支持httpclient

然后在application.yml中添加如下:

feign:
  httpclient:
    enabled: true

再次重新调用,一切恢复正常。

3. 补充

引入Apache HttpClient包时,需要注意指定Content-Type,不然会产生以下异常:

Caused by: java.lang.IllegalArgumentException: MIME type may not contain reserved characters

解决办法 :

@RequestMapping(value = "/getUser", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE) 

注解中指定: Content-Type 即 指定 consumes 的属性值

4. 其他异常情况

如果你又遇到了下面这个异常,可参考我对网友提出的问题回复的帖子,按照对应的依赖版本匹配上即可解决问题:openfeign里面配置httpclient出错。

异常日志如下:

Caused by: java.lang.NoSuchMethodError: feign.Response.create(ILjava/lang/String;Ljava/util/Map;Lfeign/Response$Body;)Lfeign/Response;

Caused by: java.lang.NoSuchMethodError: feign.Response.create(ILjava/lang/String;Ljava/util/Map;Lfeign/Response$Body;)Lfeign/Response;

网友的提问点醒了我:
在这里插入图片描述
然后我的解决方式:

在这里插入图片描述

四. 参考

参考: https://www.jianshu.com/p/6397e2cd1fae

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Thinkingcao/article/details/109161139

智能推荐

计算机二级桌面,2016计算机二级《MS OFFICE》模拟试题及答案-程序员宅基地

文章浏览阅读380次。2016计算机二级《MS OFFICE》模拟试题及答案1、在因特网浏览中,鼠标指针在网页链接上的形状是__C__A、左上箭头 B、左上箭头加上等待状态C、手型 D、手型加上拒绝浏览圆圈2、在用自己的计算机浏览WEB网的过程中,如果你发现自己喜欢的网页并希望以后多次访问,最好的方法是把这个页面地址__D__A、用Word文件保存下来 B、记忆下来C、用笔抄写到笔记本上 D、放到收藏夹中3、在桌面上创..._在资源管理器中文件排列不可以按()显示。a.名称b.类型c.文件大小d.图标大小d

Spring : 使用 jdbcTemplate_value="${jdbc.driver}-程序员宅基地

文章浏览阅读143次。1.jdbc.properteis : 参数配置文件jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql:///spring1jdbc.username=rootjdbc.password=root2. applicationContext.xml : 核心配置文件<?xml version="1.0"..._value="${jdbc.driver}

若依数据分页功能的实现_若依分页-程序员宅基地

文章浏览阅读1.6w次,点赞7次,收藏23次。分页的效果:分页处理一方面可以提高我们浏览数据的效率,符合我们浏览者的心理,减少了大量数据存在的杂乱问题;另一方面用sql进行数据查询时就实现分页,如mysql的limit,sql查询结果是第几页的数据,十分的效率;同时分页技术也可以,降低带宽使用,提高访问速度。分页的原理:前端采用参数pageNum 和pageSize;后端采用函数startPage 和getDataTable;后端分页原理的原理简析:先使用count(0)查询数据总数,再在查询语句之后加上LIMIT指令进行筛选。_若依分页

Qt Creator配置FreeImage库_qt freeimage-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏6次。第零步:前言根据官网介绍:FreeImage 是一个开源库项目,面向希望支持当今多媒体应用程序所需的流行图形图像格式(如 PNG,BMP,JPEG,TIFF 和其他格式)的开发人员。FreeImage 易于使用,快速,多线程安全,与 Windows 的所有 32 位或 64 位版本兼容以及跨平台(适用于 Linux 和 Mac OS X)。凭借其 ANSI C 接口,FreeImage 可用于多种语言,包括 C,C ++,VB,C#,Delphi,Java 和常见的脚本语言,如 Perl,Py_qt freeimage

JAVA Set 交集,差集,并集_set 交际-程序员宅基地

文章浏览阅读10w+次,点赞19次,收藏34次。/** * Created by yuhui on 2017/7/11 0011. */import java.util.HashSet;import java.util.Set;public class TestSet { public static void main(String[] args) { Set result = new HashSet<_set 交际

在linux中查找python第三方库的位置_linux python 查找第三方库位置 命令-程序员宅基地

文章浏览阅读2.7k次,点赞3次,收藏7次。问题:在linux中查找python第三方库的位置。有时候我们需要手动添加一些库。解决方案:python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"_linux python 查找第三方库位置 命令

随便推点

Flutter AnimatedIcon 了解一下-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏3次。AnimatedIcon官方介绍惯例官网查看介绍:Shows an animated icon at a given animationprogress[1].The ..._flutter animatedicon

登云X7系列彰显神州数码Oracle合作新格局_深圳中院登云一体机项目-程序员宅基地

文章浏览阅读930次。移动芯片/操作系统/云计算应对产业变局,从一开始,神州数码就一直坚持自身业务的创新。2018年,是神州数码与甲骨文精诚合作的第20年。前不久,“瓷婚”庆典上,被称为双方合作baby的“登云数据库一体机”推出新的型号——X7系列。与上一代“登云”相比,“登云X7”系列不仅在网络和IO性能上实现了翻倍提升,更首度实现了软硬件一体化,基于强大的数据库平台,可支持交易和分析两大类应用,同时引入机器学习和人..._深圳中院登云一体机项目

PAT-1010 一元多项式求导_python 一元多项式计算-程序员宅基地

文章浏览阅读702次,点赞4次,收藏6次。1010一元多项式求导(25分)设计函数求一元多项式的导数。(注:x​n​​(n为整数)的一阶导数为nx​n−1​​。)输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表..._python 一元多项式计算

Wordpress的Url优化_wp url-程序员宅基地

文章浏览阅读1.6k次。 从转为WP用户后,我就一直惦记着这个事,不久之前整了几下也算让自己满意了。也不知道是不是真的很好很SEO,记录下来,也分享给自己的朋友吧。  其实,相对于BLOG新版本里的URL优化,WP自身显得有些不足了。正如,没有插件没有模板的WP事很恶心的。呵呵,转入正题。进入WP后台,“永久链接”里“自定义结构”,填写“/%postname%.html”。在这,有些人建议把日期放入,有人建议把分类放_wp url

JSP和Thymeleaf-程序员宅基地

文章浏览阅读5.4k次,点赞11次,收藏13次。JSP和ThymeleafJSP已经存在了很长的时间,在Java Web服务器中无所不在,但是它存在一些缺陷。JSP最明显的问题在于它看起来像HTML或XML,但其实并不是。大多数JSP模板都是采用HTML的形式,但掺杂了各种JSP标签库的标签,使其变得很混乱。虽然这些标签库能够以很便利的方式为JSP带来动态渲染的强大功能,但是它也摧毁了我们想维持一个格式良好的文档的可能性。标签库和JSP缺乏良好格式的一个副作用就是它很少能够与其产生的HTML类似,在Web浏览器或HTML编辑其中查看未经渲染的JSP模

机器学习sklearn19.0——线性回归算法(应用案例)_家庭用电预测——时间与有功功率之间的关系-程序员宅基地

文章浏览阅读7.5k次,点赞6次,收藏39次。一、线性回归——家庭用电预测(时间与功率以及功率与电流之间的关系)_家庭用电预测——时间与有功功率之间的关系

推荐文章

热门文章

相关标签