SpringCloud中Feign进行服务调用 java.io.IOException: too many bytes written 问题解决

问题描述

Spring Cloud 中通过 Feign 调用微服务时,报错:java.io.IOException: too many bytes written
报错图

问题来源

在 Feign 调用拦截器里,当传递头header时,写入的头数据内容过大

解决方法

主要是修改 Feign 拦截器:

  1. 可以只传递请求token,利用 request.getHeader(HttpHeaders.AUTHORIZATION) 判断接口认证token不为空才传递
  2. 去除 content-length 的传递

这里我用的第二种方法,如下:

@Component
public class TokenFeignClientInterceptor implements RequestInterceptor {

  /**
   * 通过feign调用微服务之前都先检查下头文件,将请求头文件中的令牌数据再放入到header中,再调用其他微服务
   */
  @Override
  public void apply(RequestTemplate requestTemplate) {
    try {
      ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder
          .getRequestAttributes();
      if (null != servletRequestAttributes) {
        HttpServletRequest request = servletRequestAttributes.getRequest();
        // 获取所有头文件信息的key
        Enumeration<String> headerNames = request.getHeaderNames();
        if (null != headerNames) {
          while (headerNames.hasMoreElements()) {
            // 获取头文件的key和value
            String headerName = headerNames.nextElement();
            String headerValue = request.getHeader(headerName);
            // 跳过content-length,不然可能会报too many bites written问题
            if ("content-length".equalsIgnoreCase(headerName)) {
              continue;
            }
            // 将令牌数据添加到头文件中,当用feign调用的时候,会传递给下一个微服务
            requestTemplate.header(headerName, headerValue);
          }
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值