[java] RESTful과 함께 Spring Boot / MVC / JavaConfig와 함께 GZIP 압축 사용

일련의 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 인스턴스의 구성을 수정해야합니다. 이를 위해 EmbeddedServletContainerCustomizerJava 구성에서 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 [] 응답을 반환해야 할 것이라고 믿습니다.