En utilisant la compression GZIP avec Spring Boot/MVC/JavaConfig RESTful
Nous utilisons Printemps Boot/MVC avec l'annotation java-config pour la série de RESTful
services et nous voulons activer de manière sélective HTTP GZIP
de compression de flux sur certaines API réponses.
Je sais que je peux le faire manuellement dans mon contrôleur et un byte[] @ResponseBody
, toutefois, on préfère s'appuyer sur le spring mvc infrastructure (filtres, etc) et qu'automatiquement faire le JSON de conversion et la compression (c'est à dire la méthode retourne un POJO).
Comment puis-je activer la compression GZIP dans le ResponseBody ou Tomcat intégré exemple, et de façon sélective permet de comprimer seulement quelques réponses?
Merci!
PS.: Nous n'avons pas actuellement de base de XML de configuration.
- Vous devriez vérifier GzipFilter.
- ne pas utiliser la compression HTTP par HTTPS, sauf si vous savez ce que vous faites
Vous devez vous connecter pour publier un commentaire.
Le reste de ces réponses ne sont pas à jour et/ou sur le dessus compliqué pour quelque chose qui devrait être simple de l'OMI (combien de temps a gzip été autour pour l'instant? plus que Java...) à Partir de la documentation:
Dans l'application.propriétés 1.3+
Dans l'application.propriétés 1.2.2 - <1.3
De plus que 1.2.2:
Notez également que si vous utilisez tomcat intégré:
Si vous envisagez de déployer à un non tomcat intégré, vous devez l'activer dans server.xml http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation
IRL Production Note:
Aussi pour éviter tout cela envisager l'utilisation d'un proxy/équilibreur de charge de l'installation en face de Tomcat avec nginx et/ou haproxy ou semblables, car il prendra en charge statique actifs et gzip BEAUCOUP plus efficacement et plus facilement que Java/Tomcat le modèle de thread.
Vous ne voulez pas lancer de chat " dans la salle de bain parce qu'il est occupé à la compression des trucs au lieu de servir les demandes (ou, plus probablement, de le faire tourner fils/alimentation CPU/tas assis autour d'attente pour la base de données IO à se produire lors de l'exécution de votre AWS projet de loi qui est pourquoi traditionnels Java/Tomcat peut-être pas une bonne idée de commencer par en fonction de ce que vous faites, mais je m'égare...)
refs:
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
TomcatConnectorCustomizer
cas dans le contexte de l'application; ils doivent être par programme enregistré avecTomcatEmbeddedServletContainerFactory
server.compression.min-response-size=10240
C'est fondamentalement la même solution que @andy-wilkinson fourni, mais dès le Printemps de Démarrage 1.0 le personnaliser(...) méthode a un ConfigurableEmbeddedServletContainer paramètre.
Une autre chose qui vaut la peine de mentionner est que le serveur Tomcat comprime seulement les types de contenu de
text/html
,text/xml
ettext/plain
par défaut. Ci-dessous est un exemple qui prend en charge la compression deapplication/json
ainsi:Accept-Encoding: gzip,deflate
en-tête, si vous êtes à l'aide de curl:curl -i -H 'Accept-Encoding: gzip,deflate' http://url.to.your.server
Sur les récents versions dans
application.yml
config:Printemps de Démarrage 1.4 Utiliser pour Javascript, HTML, Json toutes les compressions.
Enabeling GZip dans Tomcat n'a pas fonctionné dans mon Printemps de Démarrage du Projet. J'ai utilisé CompressingFilter trouvé ici.
J'ai ajouté à cela:
Serveur de compression
prises de http://bisaga.com/blog/programming/web-compression-on-spring-boot-application/
Pour activer la compression GZIP, vous devez modifier la configuration de Tomcat intégré instance. Pour ce faire, vous devez déclarer une
EmbeddedServletContainerCustomizer
bean dans votre Java de configuration, puis d'enregistrer unTomcatConnectorCustomizer
avec elle.Par exemple:
Voir le La documentation de Tomcat pour plus de détails sur les différents compression options de configuration disponibles.
Vous dites que vous voulez activer la compression. Selon vos critères de sélection, puis de l'approche ci-dessus peut être suffisant. Il vous permet de contrôler la compression de la demande de l'agent utilisateur, la réponse de la taille, et la réponse est de type mime.
Si cela ne répond pas à vos besoins, alors je crois que vous aurez à effectuer la compression de votre contrôleur et le retour d'un byte[] réponse avec un gzip content-encoding-tête.
J'ai eu le même problème dans mon Printemps de Démarrage+Ressort des Données du projet lors de l'invocation d'une
@RepositoryRestResource
.Le problème, c'est le type MIME de retour; ce qui est
application/hal+json
. Ajouter à laserver.compression.mime-types
propriété résolu ce problème pour moi.Espère que cela aide à quelqu'un d'autre!