一、出现问题
1、出现 非法字符串错误报错
Illegal character ((CTRL-CHAR, code 31)):
2、feign响应数据乱码
以上都可能是feign传输的数据过大导致,自动启用gzip压缩数据
二、解决办法
考虑更改feign配置,增加压缩阈值(未解决问题)
# 启用okhttp
feign.okhttp.enabled = true
feign.httpclient.enabled = false
feign.httpclient.max-connections-per-route = 100
feign.httpclient.max-connections = 1000
# 请求参数压缩配置
feign.compression.request.enabled = true
feign.compression.response.enabled = true
#配置请求参数压缩阈值(开发估算最大值7k,在此配置为8k)
feign.compression.request.min-request-size = 8192
feign.compression.request.mime-types = text/xml,application/xml,application/json
添加gzip解压过滤器,将gzip压缩的数据解压
1、添加gzip过滤器配置
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfiguration {
@Bean
public FilterRegistrationBean<GzipFilter> gzipFilter() {
FilterRegistrationBean<GzipFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new GzipFilter());
registration.addUrlPatterns("/api/*");
registration.setName("gzipFilter");
registration.setOrder(5); //值越小,Filter越靠前。
return registration;
}
}
2、gzip过滤器
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Slf4j
public class GzipFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
String contentEncoding = request.getHeader("Content-Encoding");
if(StringUtils.isNotBlank(contentEncoding) && contentEncoding.contains("gzip")){
request = new GzipRequestWrapper(request);
}
filterChain.doFilter(request, servletResponse);
}
}
3、将gzip拦截下来的请求数据进行解压
import lombok.extern.slf4j.Slf4j;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
@Slf4j
public class GzipRequestWrapper extends HttpServletRequestWrapper {
private HttpServletRequest request;
public GzipRequestWrapper(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public ServletInputStream getInputStream() throws IOException {
ServletInputStream inputStream = request.getInputStream();
try {
GZIPInputStream gzipInputStream = new GZIPInputStream(inputStream);
ServletInputStream newStream = new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return gzipInputStream.read();
}
};
return newStream;
} catch (Exception e) {
log.error("ungzip fail, ", e);
}
return inputStream;
}
}