原理啥的就不说了,不知道的自行百度、谷歌、AI,话不多说,直接上干货;resttemplate的gzip压缩口述其实很简单:用springboot的interceptor拦截器拦截resttemplate请求,然后把请求body通过gzip流进行压缩,请求header添加gzip压缩;
// 配置类
@Configuration
public class GzipRestTemplateConfig {
private static final int REQUEST_TIMEOUT = 240000;
private static final int CONNECT_TIMEOUT = 240000;
private static final int READ_TIMEOUT = 240000;
private static final int MAX_TOTAL = 300;
private static final int DEFAULT_MAX_PER_ROUTE = 300;
private static final String HTTP = "http";
private static final String HTTPS = "https";
private static final String[] SSL_ARR = new String[]{"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.2"};
@Bean(value = "gzipRestTemplate")
public RestTemplate getRestTemplate() throws KeyManagementException, NoSuchAlgorithmException {
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = gzipHttpComponentsClientHttpRequestFactory();
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);
restTemplate.getInterceptors().add(new CompressingClientHttpRequestInterceptor());
return restTemplate;
}
public HttpComponentsClientHttpRequestFactory gzipHttpComponentsClientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().build());
//单位为ms
clientHttpRequestFactory.setConnectionRequestTimeout(REQUEST_TIMEOUT);
clientHttpRequestFactory.setReadTimeout(READ_TIMEOUT);
//单位为ms
clientHttpRequestFactory.setConnectTimeout(CONNECT_TIMEOUT);
return clientHttpRequestFactory;
}
}
// 拦截器类
public class CompressingClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] bytes, ClientHttpRequestExecution clientHttpRequestExecution) throws IOException {
HttpHeaders headers = httpRequest.getHeaders();
headers.add(HttpHeaders.CONTENT_ENCODING, "gzip");
headers.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
headers.add(HttpHeaders.ACCEPT_ENCODING, "gzip");
return clientHttpRequestExecution.execute(httpRequest, compress(bytes));
}
protected byte[] compress(byte[] body) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream)) {
gzipOutputStream.write(body);
}
return outputStream.toByteArray();
}
}
当然我们的服务中有些调用接口没有支持gzip压缩,所以在此上注入到spring容器中是另一个resttemplate实体,这样可以和其他的不冲突,使用gzip压缩就注入这个gzipRestTemplate模板;
总结:gzip的整体压缩率是非常可观的,因为我们是跟电商平台对接,造成很多数据推送,采用了该技术后,有效的降低了我们的流量带宽,每年流量成本降低大概10W左右,相当可观,可惜这降低的成本没有给我,哈哈哈哈!!!