问题描述
Spring Cloud 中通过 Feign 调用微服务时,报错:java.io.IOException: too many bytes written
问题来源
在 Feign 调用拦截器里,当传递头header时,写入的头数据内容过大
解决方法
主要是修改 Feign 拦截器:
- 可以只传递请求token,利用 request.getHeader(HttpHeaders.AUTHORIZATION) 判断接口认证token不为空才传递
- 去除 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();
}
}
}