Usamos Spring Boot / MVC com java-config baseado em anotação para uma série de RESTful
serviços e queremos habilitar seletivamente a HTTP GZIP
compressão de fluxo em algumas respostas da API.
Eu sei que posso fazer isso manualmente no meu controlador e um byte[] @ResponseBody
, no entanto, preferimos contar com a infraestrutura SpringMVC (filtros / etc) e fazer com que ele faça a conversão e compactação JSON automaticamente (ou seja, o método retorna um POJO).
Como posso ativar a compactação GZIP no ResponseBody ou na instância incorporada do Tomcat e, de uma forma, podemos compactar seletivamente apenas algumas respostas?
Obrigado!
PS .: Atualmente não temos nenhuma configuração baseada em XML.
java
rest
spring-mvc
gzip
spring-java-config
user3182614
fonte
fonte
Respostas:
O restante dessas respostas está desatualizado e / ou excessivamente complicado para algo que deveria ser simples IMO (há quanto tempo o gzip existe agora? Há mais tempo do que o Java ...) Dos documentos:
Em application.properties 1.3+
Em application.properties 1.2.2 - <1.3
Anterior a 1.2.2:
Observe também que isso SÓ funcionará se você estiver executando o tomcat incorporado:
Se você planeja implantar em um tomcat não integrado, deverá habilitá-lo em server.xml http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation
Nota de produção IRL:
Além disso, para evitar tudo isso, considere o uso de uma configuração de proxy / balanceador de carga na frente do Tomcat com nginx e / ou haproxy ou similar, uma vez que ele manipulará ativos estáticos e gzip MUITO de forma mais eficiente e fácil do que o modelo de threading Java / Tomcat.
Você não quer jogar o gato na banheira porque ele está ocupado comprimindo coisas em vez de servir solicitações (ou mais provavelmente girando threads / comendo CPU / heap sentado esperando que o banco de dados IO ocorra enquanto aumenta sua conta da AWS, que é porque o Java / Tomcat tradicional pode não ser uma boa ideia para começar, dependendo do que você está fazendo, mas estou divagando ...)
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
fonte
TomcatConnectorCustomizer
instâncias no contexto do aplicativo; eles devem ser registrados programaticamente comTomcatEmbeddedServletContainerFactory
server.compression.min-response-size=10240
Em versões recentes na
application.yml
configuração:fonte
Esta é basicamente a mesma solução fornecida por @ andy-wilkinson, mas a partir do Spring Boot 1.0 o método customize (...) tem um parâmetro ConfigurableEmbeddedServletContainer .
Outra coisa que vale a pena mencionar é que o Tomcat compacta apenas os tipos de conteúdo de
text/html
,text/xml
etext/plain
por padrão. Abaixo está um exemplo que suporta compressão deapplication/json
:fonte
Accept-Encoding: gzip,deflate
cabeçalho, se você estiver usando curl:curl -i -H 'Accept-Encoding: gzip,deflate' http://url.to.your.server
Spring Boot 1.4 Use para todas as compressões Javascript HTML Json.
fonte
Content-Encoding
:gzip
Eu adicionei para isso:
Compressão de servidor
retirado de http://bisaga.com/blog/programming/web-compression-on-spring-boot-application/
fonte
A etiquetagem do GZip no Tomcat não funcionou no meu Spring Boot Project. Eu usei o CompressingFilter encontrado aqui .
fonte
Para habilitar a compactação GZIP, você precisa modificar a configuração da instância incorporada do Tomcat. Para fazer isso, você declara um
EmbeddedServletContainerCustomizer
bean em sua configuração Java e, a seguir, registra umTomcatConnectorCustomizer
com ele.Por exemplo:
Consulte a documentação do Tomcat para obter mais detalhes sobre as várias opções de configuração de compactação disponíveis.
Você diz que deseja ativar seletivamente a compactação. Dependendo dos seus critérios de seleção, a abordagem acima pode ser suficiente. Ele permite que você controle a compactação pelo agente do usuário da solicitação, o tamanho da resposta e o tipo MIME da resposta.
Se isso não atender às suas necessidades, acredito que você terá que realizar a compactação em seu controlador e retornar uma resposta byte [] com um cabeçalho de codificação de conteúdo gzip.
fonte
Tive o mesmo problema em meu projeto Spring Boot + Spring Data ao chamar a
@RepositoryRestResource
.O problema é o tipo MIME retornado; qual é
application/hal+json
. Adicioná-lo àserver.compression.mime-types
propriedade resolveu esse problema para mim.Espero que isso ajude outra pessoa!
fonte