Feign报错feign.RetryableException: too many bytes written executing

标签: SpringCloud  java

Feign报错feign.RetryableException: too many bytes written executing

SpringCloud Feign调用报错feign.RetryableException: too many bytes written executing

版本:

SpringCloud : Greenwich.SR5

SpringBoot : 2.1.9.RELEASE

SpringCloudAlibaba : 2.1.0.RELEASE

看到这个错误第一时间我也是打开百度/Goole 但是搜出来的,无一例外 基本都是添加feign增强包 feign-httpclient 或者feign-okhttp 包;

无奈之下只好一步步debug 发现是把request.body 写入到流时发生的错误.java.io.IOException: insufficient data written

后面搜到body是跟Content-Length 有关系的… 附上博主链接 https://my.oschina.net/u/4410077/blog/3323588 看了之后 原来发生这个问题的原因跟我一样,因为服务之间调用需要携带一些用户信息之类的 所以实现了Feign的RequestInterceptor拦截器复制请求头,复制的时候是所有头都复制的,可能导致Content-length长度跟body不一致. 所以只需要判断如果是Content-length就跳过

原配置 :

/**
 * @author Joe
 * createTime 2020/06/10 18:13
 */
@Log4j2
@Configuration
public class FeignConfiguration implements RequestInterceptor {


    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                String values = request.getHeader(name);
                template.header(name, values);
            }
        } else {
            log.info("feign interceptor error header:{}", template);
        }
    }
}

修改之后:

/**
 * @author Joe
 * createTime 2020/06/10 18:13
 */
@Log4j2
@Configuration
public class FeignConfiguration implements RequestInterceptor {


    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                String values = request.getHeader(name);
                // 跳过 content-length
                if (name.equals("content-length")){
                    continue;
                }
                template.header(name, values);
            }
        } else {
            log.info("feign interceptor error header:{}", template);
        }
    }
}

content-length详解参考文章 :https://juejin.im/post/5d772cb4e51d453b5f1a0502

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

智能推荐

CSS3边框和圆角 学习打卡

课程介绍 1、CSS3圆角 2、CSS3盒阴影 3、CSS3边界图片 CSS3圆角 1、border-radius:一个最多可以指定四个border-*-radius属性的复合属性,为元素添加圆角边框 2、语法:border-radius:1-4 length|%/1-4 length|% 3、兼容:IE9+ firefox4+ chrome safari5+ opera CSS3指定每一个圆角 ...

(Java)反射的应用 - 取得类的结构

文章目录 一、基本概念 二、取得所实现的全部接口 三、取得父类 四、取得全部构造方法 五、取得全部方法 六、取得全部属性 一、基本概念 在反射机制中,还可以通过反射得到一个类的完整结构,这就需要使用 java.lang.reflect 包中的以下几个类: 这三个类都是 AccessibleObject 类的子类: 二、取得所实现的全部接口 要取得一个类所实现的全部接口,必须使用 Class 类中的...

ORM-外键关联基本使用

外键 在Mysql中,外键可以让表之间关系变得更加紧密, 在SQlAlchemy中, 通过ForeignKey类来实现,并且可以指定表的外键约束 FroeignKey的导入 在从表中条件一个模型类.字段(属性)即可 外键关联的代码和示例图 图说明 外键约束的删除 如果删除了主表中的数据, 从表的数据会怎么样? 需要设置 "RESTRICT" : 主表数据被删除, 会阻止删除 &...

放大镜效果

首先先写html样式 接下来是css部分 js部分 效果图...

Linux操作心得(1)

Ubuntu 16.04 (1)今天遇到一个蜜汁尴尬的情况,一本书上的示例,要求我建一个文件夹及子文件夹,然而明明创建的文件却没有显示 按书上此时应该出现一个文件夹,但并没有: 但可以进入,作为小白看不懂,后来发现是因为/XX指的是将文件建立在根目录了,因此不管怎样,就算用ls,或ll命令都查不到的,此时正确方法应该是去掉/backup前的/,如图就解决了文件夹的创建过程,还有一种傻瓜式方法就是直...

猜你喜欢

如何写出优美的 JavaScript 代码?

作者:尹锋 链接:https://www.zhihu.com/question/20635785/answer/223515216 1,避免使用 js 糟粕和鸡肋 这些年来,随着 HTML5 和 Node.js 的发展,JavaScript 在各个领域遍地开花,已经从“世界上最被误解的语言”变成了“世界上最流行的语言”。但是由于历史原因,JavaSc...

07-zookeeper的watcher机制原理

zookeeper的watcher机制原理 Watcher 的基本流程 zookeeper的watcher机制,总的来说可以分为三个过程: 客户端注册Watcher。 服务器处理Watcher。 客户端回调Watcher。 客户端注册 watcher有3种方式,getData、exists、getChildren。以如下代码为例,来分析整个触发机制的原理 基于zkclient客户端发起一个数据操作...

Linux搭建Nexus私服

Nexus是什么 Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。利用Nexus你可以只在一个地方就能够完全控制访问 和部署在你所维护仓库中的每个Artifact。Nexus是一套“开箱即用”的系统不需要数据库,它使用文件系统加Lucene来组织数据。简单来说,它就是我们自己维护管理的maven仓库,仅限本人或公司内部使用,他人...

【Elastic Stack上】Elastic Search快速入门,让你对ELK日志架构不再困惑

课程介绍 Elastic Stack简介 Elasticsearch的介绍与安装 Elasticsearch的快速入门 Elasticsearch的核心讲解中文分词 全文搜索 Elasticsearch集群 Java客户端讲解 1、Elastic Stack简介 如果你没有听说过Elastic Stack,那你一定听说过ELK,实际上ELK是三款软件的简称,分别是Elasticsearch、Log...

浅谈Java中==和equals()区别

Java基础 浅谈Java中==和equals()区别 == 运算符 equals(): 方法 浅谈Java中==和equals()区别 == 运算符 可以使用在基本数据类型变量和引用数据类型变量中 如果比较的是基本数据类型变量,比较两个变量保存的数据是否相等(不一定要类型相同) 如果比较的是引用类型变量,比较的是两个变量的地址值是否相同,即两个引用是否指向同一个对象实体 equals(): 方法...