web-dev-qa-db-ja.com

Spring Boot / MVC / JavaConfigとRESTfulでGZIP圧縮を使用する

一連のRESTfulサービスに対して注釈ベースのJava構成でSpring Boot/MVCを使用し、一部のAPI応答でHTTP GZIPストリーム圧縮を選択的に有効にします。

私は自分のコントローラーとbyte[] @ResponseBodyで手動でこれを行うことができることを知っていますが、SpringMVCインフラストラクチャ(フィルターなど)に依存し、自動的にJSON変換と圧縮を行います(つまり、メソッドはPOJO)。

ResponseBodyまたは組み込みTomcatインスタンスでGZIP圧縮を有効にするにはどうすればよいですか?また、一部の応答のみを選択的に圧縮できるようにするにはどうすればよいですか?

ありがとう!

PS .:現在、XMLベースの構成はありません。

85
user3182614

これらの答えの残りは時代遅れであり、および/または単純な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.

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を実行している場合にのみ機能することに注意してください。

非埋め込みTomcatにデプロイする場合は、server.xmlで有効にする必要があります http://Tomcat.Apache.org/Tomcat-9.0-doc/config/http.html#Standard_Implementation

IRLプロダクションノート:

また、これをすべて回避するには、Tomcatの前でnginxおよび/またはでプロキシ/ロードバランサーのセットアップを使用することを検討してくださいhaproxyなど。静的アセットとgzip MUCHをJava/Tomcatのスレッドモデルよりも効率的かつ簡単に処理するため。

リクエストを処理するのではなく、物を圧縮するのに忙しいので(または、実行中にデータベースIOが発生するのを待ってスレッドを回転させる、CPUを食べる、ヒープを使用するなど) AWSの請求書を作成します。これが、従来の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

174
John Culviner

これは基本的に@ andy-wilkinsonが提供するソリューションと同じですが、Spring Boot 1.0では customize(...) メソッドに ConfigurableEmbeddedServletContainer パラメーターがあります。

言及する価値があるもう1つのことは、Tomcatはデフォルトでtext/htmltext/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);
                        }
                    }
            );
        }
    };
}
12
matsev

application.yml configの最近のバージョン:

---

spring:
  profiles: dev

server:
  compression:
    enabled: true
    mime-types: text/html,text/css,application/javascript,application/json

---
11

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
9
Ronny Shibley

TomcatでGZipを有効にしても、Spring Boot Projectで機能しません。 CompressingFilter found here を使用しました。

@Bean
public Filter compressingFilter() {
    CompressingFilter compressingFilter = new CompressingFilter();
    return compressingFilter;
}
5
user1127860

私はこれを追加しました:

サーバー圧縮

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/ から取得

5

GZIP圧縮を有効にするには、組み込みTomcatインスタンスの構成を変更する必要があります。そのためには、Java構成でEmbeddedServletContainerCustomizer 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 documentation を参照してください。

圧縮を選択的に有効にしたいと言います。選択基準によっては、上記のアプローチで十分な場合があります。これにより、要求のユーザーエージェント、応答のサイズ、および応答のMIMEタイプによる圧縮を制御できます。

これがニーズに合わない場合は、コントローラーで圧縮を実行し、gzip content-encodingヘッダーでbyte []応答を返す必要があると思います。

4
Andy Wilkinson

@RepositoryRestResourceを呼び出すときに、Spring Boot + Spring Dataプロジェクトで同じ問題が発生しました。

問題は、返されるMIMEタイプです。 application/hal+jsonです。 server.compression.mime-typesプロパティに追加すると、この問題は解決しました。

これが他の誰かに役立つことを願っています!

0
Serginho