Kami menggunakan Spring Boot / MVC dengan java-config berbasis anotasi untuk rangkaian RESTful
layanan dan kami ingin mengaktifkan HTTP GZIP
kompresi aliran secara selektif pada beberapa respons API.
Saya tahu saya dapat melakukan ini secara manual di controller dan a byte[] @ResponseBody
, namun kami lebih suka mengandalkan infrastruktur SpringMVC (filter / dll) dan secara otomatis melakukan konversi dan kompresi JSON (yaitu metode mengembalikan POJO).
Bagaimana cara mengaktifkan kompresi GZIP di ResponseBody atau instans Tomcat yang disematkan, dan dengan cara yang kami dapat mengompresi hanya beberapa respons secara selektif?
Terima kasih!
NB: Saat ini kami tidak memiliki konfigurasi berbasis XML.
java
rest
spring-mvc
gzip
spring-java-config
pengguna3182614
sumber
sumber
Jawaban:
Sisa dari jawaban ini sudah ketinggalan zaman dan / atau terlalu rumit untuk sesuatu yang seharusnya IMO sederhana (berapa lama gzip telah ada sekarang? Lebih lama dari Java ...) Dari dokumen:
Dalam application.properties 1.3+
Dalam application.properties 1.2.2 - <1.3
Lebih tua dari 1.2.2:
Perhatikan juga ini HANYA akan berfungsi jika Anda menjalankan tomcat tertanam:
Jika Anda berencana untuk menerapkan ke kucing jantan yang tidak tertanam, Anda harus mengaktifkannya di server.xml http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation
Catatan Produksi IRL:
Juga untuk menghindari semua ini, pertimbangkan untuk menggunakan pengaturan proxy / load balancer di depan Tomcat dengan nginx dan / atau haproxy atau serupa karena ini akan menangani aset statis dan gzip JAUH lebih efisien dan mudah daripada model threading Java / Tomcat.
Anda tidak ingin melempar 'cat ke dalam bak mandi karena sibuk mengompresi barang alih-alih melayani permintaan (atau lebih mungkin memutar utas / memakan CPU / tumpukan duduk menunggu IO database terjadi saat menjalankan tagihan AWS Anda yang mengapa Java / Tomcat tradisional mungkin bukan ide yang baik untuk memulai tergantung pada apa yang Anda lakukan tetapi saya ngelantur ...)
referensi: 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
sumber
TomcatConnectorCustomizer
contoh dalam konteks aplikasi; mereka harus terdaftar secara terprogramTomcatEmbeddedServletContainerFactory
server.compression.min-response-size=10240
Tentang versi terbaru dalam
application.yml
konfigurasi:sumber
Ini pada dasarnya adalah solusi yang sama seperti yang disediakan @ andy-wilkinson, tetapi pada Spring Boot 1.0 metode customize (...) memiliki parameter ConfigurableEmbeddedServletContainer .
Hal lain yang perlu disebutkan adalah bahwa Tomcat hanya mengompresi jenis konten
text/html
,text/xml
dantext/plain
secara default. Di bawah ini adalah contoh yang mendukung kompresiapplication/json
juga:sumber
Accept-Encoding: gzip,deflate
header, jika Anda menggunakan curl:curl -i -H 'Accept-Encoding: gzip,deflate' http://url.to.your.server
Spring Boot 1.4 Gunakan ini untuk Javascript HTML Json semua kompresi.
sumber
Content-Encoding
::gzip
Saya telah menambahkan untuk ini:
Kompresi server
diambil dari http://bisaga.com/blog/programming/web-compression-on-spring-boot-application/
sumber
Mengaktifkan GZip di Tomcat tidak berfungsi di Proyek Spring Boot saya. Saya menggunakan CompressingFilter ditemukan di sini .
sumber
Untuk mengaktifkan kompresi GZIP, Anda perlu mengubah konfigurasi instance Tomcat yang disematkan. Untuk melakukannya, Anda mendeklarasikan sebuah
EmbeddedServletContainerCustomizer
bean dalam konfigurasi Java Anda dan kemudian mendaftarkan sebuah beanTomcatConnectorCustomizer
dengannya.Sebagai contoh:
Lihat dokumentasi Tomcat untuk detail lebih lanjut tentang berbagai opsi konfigurasi kompresi yang tersedia.
Anda mengatakan bahwa Anda ingin mengaktifkan kompresi secara selektif. Bergantung pada kriteria pemilihan Anda, maka pendekatan di atas mungkin cukup. Ini memungkinkan Anda untuk mengontrol kompresi oleh agen pengguna permintaan, ukuran respons, dan jenis mime respons.
Jika ini tidak memenuhi kebutuhan Anda maka saya yakin Anda harus melakukan kompresi di pengontrol Anda dan mengembalikan respons byte [] dengan header encoding konten gzip.
sumber
Saya mengalami masalah yang sama dengan proyek Spring Boot + Spring Data saya saat menjalankan file
@RepositoryRestResource
.Masalahnya adalah tipe MIME yang dikembalikan; yang mana
application/hal+json
. Menambahkannya keserver.compression.mime-types
properti memecahkan masalah ini bagi saya.Semoga ini bisa membantu orang lain!
sumber