일련의 RESTful
서비스에 대해 주석 기반 java-config와 함께 Spring Boot / MVC를 사용 HTTP GZIP
하고 일부 API 응답에서 스트림 압축 을 선택적으로 활성화하려고합니다 .
내 컨트롤러와에서 수동으로이 작업을 수행 할 수 byte[] @ResponseBody
있지만 SpringMVC 인프라 (필터 / 기타)에 의존하고 JSON 변환 및 압축을 자동으로 수행하는 것을 선호합니다 (즉, 메서드가 POJO를 반환 함).
ResponseBody 또는 임베디드 Tomcat 인스턴스에서 GZIP 압축을 활성화하려면 어떻게해야하며 일부 응답 만 선택적으로 압축 할 수 있습니까?
감사!
추신 : 현재 XML 기반 구성이 없습니다.
답변
이 답변의 나머지 부분은 구식이거나 단순한 IMO (현재 gzip이 얼마나 오래 있었습니까? Java보다 더 길다 …)에 대해 복잡합니다. 문서에서 :
application.properties 1.3 이상
# ?️?️?️
server.compression.enabled=true
# opt in to content types
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css
# not worth the CPU cycles at some point, probably
server.compression.min-response-size=10240
application.properties 1.2.2-<1.3
server.tomcat.compression=on
server.tomcat.compressableMimeTypes=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css
1.2.2 이전 :
@Component
public class TomcatCustomizer implements TomcatConnectorCustomizer {
@Override
public void customize(Connector connector) {
connector.setProperty("compression", "on");
// Add json and xml mime types, as they're not in the mimetype list by default
connector.setProperty("compressableMimeType", "text/html,text/xml,text/plain,application/json,application/xml");
}
}
또한 이것은 임베디드 바람둥이를 실행하는 경우에만 작동합니다.
포함되지 않은 Tomcat에 배포하려는 경우 server.xml http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation 에서 활성화해야합니다.
IRL 제작 참고 :
또한이 모든 것을 방지하려면 nginx 및 / 또는 haproxy 또는 이와 유사한 Tomcat 앞에 프록시 /로드 밸런서 설정을 사용하는 것이 좋습니다. 정적 자산을 처리하고 Java / Tomcat의 스레딩 모델보다 훨씬 효율적이고 쉽게 gzip을 처리 할 수 있기 때문입니다.
요청을 처리하는 대신 (또는 AWS 청구서를 실행하는 동안 데이터베이스 IO가 발생하기를 기다리는 동안 스레드 회전 / CPU / 힙을 먹고 있기 때문에 바쁘기 때문에 ‘고양이를 욕조에 넣고 싶지 않습니다. 왜 전통적인 Java / Tomcat이 당신이하는 일에 따라 시작하는 것이 좋은 생각이 아닐 수 있지만, 나는 탈선합니다 …)
참조 :
https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/howto.html#how-to-enable-http-response-compression
https://github.com/spring-projects/spring-boot/issues/2031
답변
application.yml
구성의 최신 버전 :
---
spring:
profiles: dev
server:
compression:
enabled: true
mime-types: text/html,text/css,application/javascript,application/json
---
답변
이것은 기본적으로 @ andy-wilkinson이 제공 한 것과 동일한 솔루션이지만 Spring Boot 1.0부터 customize (…) 메서드에는 ConfigurableEmbeddedServletContainer 매개 변수가 있습니다.
언급 할 가치가 또 다른 것은 톰캣 만의 콘텐츠 형식을 압축한다는 것입니다 text/html
, text/xml
그리고 text/plain
기본적으로. 다음은 압축도 지원하는 예입니다 application/json
.
@Bean
public EmbeddedServletContainerCustomizer servletContainerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer servletContainer) {
((TomcatEmbeddedServletContainerFactory) servletContainer).addConnectorCustomizers(
new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler();
httpProtocol.setCompression("on");
httpProtocol.setCompressionMinSize(256);
String mimeTypes = httpProtocol.getCompressableMimeTypes();
String mimeTypesWithJson = mimeTypes + "," + MediaType.APPLICATION_JSON_VALUE;
httpProtocol.setCompressableMimeTypes(mimeTypesWithJson);
}
}
);
}
};
}
답변
Spring Boot 1.4 Javascript HTML Json 모든 압축에 이것을 사용하십시오.
server.compression.enabled: true
server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript
답변
나는 이것을 위해 추가했다 :
서버 압축
server.compression.enabled=true
server.compression.min-response-size=2048
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
http://bisaga.com/blog/programming/web-compression-on-spring-boot-application/ 에서 가져온
답변
Tomcat에서 GZip을 Enabeling하는 것이 Spring Boot Project에서 작동하지 않습니다. 내가 사용 CompressingFilter가 발견 여기에 .
@Bean
public Filter compressingFilter() {
CompressingFilter compressingFilter = new CompressingFilter();
return compressingFilter;
}
답변
GZIP 압축을 사용하려면 포함 된 Tomcat 인스턴스의 구성을 수정해야합니다. 이를 위해 EmbeddedServletContainerCustomizer
Java 구성에서 Bean 을 선언 한 다음이를 등록 TomcatConnectorCustomizer
합니다.
예를 들면 :
@Bean
public EmbeddedServletContainerCustomizer servletContainerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainerFactory factory) {
((TomcatEmbeddedServletContainerFactory) factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler();
httpProtocol.setCompression("on");
httpProtocol.setCompressionMinSize(64);
}
});
}
};
}
사용 가능한 다양한 압축 구성 옵션에 대한 자세한 내용 은 Tomcat 문서 를 참조하십시오.
선택적으로 압축을 사용하고 싶다고 말합니다. 선택 기준에 따라 위의 방법으로 충분할 수 있습니다. 요청의 사용자 에이전트, 응답의 크기 및 응답의 MIME 유형별로 압축을 제어 할 수 있습니다.
이것이 당신의 필요를 충족시키지 못한다면 당신은 당신의 컨트롤러에서 압축을 수행하고 gzip 콘텐츠 인코딩 헤더와 함께 byte [] 응답을 반환해야 할 것이라고 믿습니다.