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();
    }
  }

}

猜你喜欢

转载自blog.csdn.net/qq_36737803/article/details/123259702