一連のRESTful
サービスに対して注釈ベースのJava構成でSpring Boot/MVCを使用し、一部のAPI応答でHTTP GZIP
ストリーム圧縮を選択的に有効にします。
私は自分のコントローラーとbyte[] @ResponseBody
で手動でこれを行うことができることを知っていますが、SpringMVCインフラストラクチャ(フィルターなど)に依存し、自動的にJSON変換と圧縮を行います(つまり、メソッドはPOJO)。
ResponseBodyまたは組み込みTomcatインスタンスでGZIP圧縮を有効にするにはどうすればよいですか?また、一部の応答のみを選択的に圧縮できるようにするにはどうすればよいですか?
ありがとう!
PS .:現在、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.
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
また、これをすべて回避するには、Tomcatの前でnginxおよび/またはでプロキシ/ロードバランサーのセットアップを使用することを検討してくださいhaproxyなど。静的アセットとgzip MUCHをJava/Tomcatのスレッドモデルよりも効率的かつ簡単に処理するため。
リクエストを処理するのではなく、物を圧縮するのに忙しいので(または、実行中にデータベースIOが発生するのを待ってスレッドを回転させる、CPUを食べる、ヒープを使用するなど) AWSの請求書を作成します。これが、従来のJava/Tomcatが何をしているのかによって最初から始めるのは得策ではないかもしれない理由ですが、私は脱線します...)
これは基本的に@ andy-wilkinsonが提供するソリューションと同じですが、Spring Boot 1.0では customize(...) メソッドに ConfigurableEmbeddedServletContainer パラメーターがあります。
言及する価値があるもう1つのことは、Tomcatはデフォルトで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);
}
}
);
}
};
}
application.yml
configの最近のバージョン:
---
spring:
profiles: dev
server:
compression:
enabled: true
mime-types: text/html,text/css,application/javascript,application/json
---
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
TomcatでGZipを有効にしても、Spring Boot Projectで機能しません。 CompressingFilter found here を使用しました。
@Bean
public Filter compressingFilter() {
CompressingFilter compressingFilter = new CompressingFilter();
return compressingFilter;
}
私はこれを追加しました:
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/ から取得
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 []応答を返す必要があると思います。
@RepositoryRestResource
を呼び出すときに、Spring Boot + Spring Dataプロジェクトで同じ問題が発生しました。
問題は、返されるMIMEタイプです。 application/hal+json
です。 server.compression.mime-types
プロパティに追加すると、この問題は解決しました。
これが他の誰かに役立つことを願っています!