¿Qué tipo de compresión (es el filtro de servlets GZIP más popular) sugeriría?

Estoy buscando un filtro de servlet GZIP para ser utilizado en una aplicación web de gran volumen. No quiero usar las opciones específicas del contenedor.

Requisito

  1. Posibilidad de comprimir la carga de respuesta (XML)
  2. Más rápido
  3. Probado en producción para aplicaciones de alto volumen
  4. Debe configurar apropiadamente Content-Encoding
  5. portátil en contenedores
  6. Opcionalmente capaz de descomprimir solicitud

Gracias.

Por lo que he visto, la mayoría de la gente generalmente usa el filtro de compresión gzip. Típicamente de ehcache .

La implementación del filtro GZIP es: net.sf.ehcache.constructs.web.filter.GzipFilter

La coordinación de Maven para incluirlo en su proyecto es:

 net.sf.ehcache ehcache-web 2.0.4  

También deberá especificar un objective de registro SLF4J. Si no sabe qué es esto o no, slf4j-jdk14 o slf4j-simple funcionan:

  org.slf4j slf4j-jdk14 1.6.4  

El filtro GZIP que utilizo para comprimir recursos en mis webapps:

 public class CompressionFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; String acceptEncoding = httpRequest.getHeader(HttpHeaders.ACCEPT_ENCODING); if (acceptEncoding != null) { if (acceptEncoding.indexOf("gzip") >= 0) { GZIPHttpServletResponseWrapper gzipResponse = new GZIPHttpServletResponseWrapper(httpResponse); chain.doFilter(request, gzipResponse); gzipResponse.finish(); return; } } chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException { } } public class GZIPHttpServletResponseWrapper extends HttpServletResponseWrapper { private ServletResponseGZIPOutputStream gzipStream; private ServletOutputStream outputStream; private PrintWriter printWriter; public GZIPHttpServletResponseWrapper(HttpServletResponse response) throws IOException { super(response); response.addHeader(HttpHeaders.CONTENT_ENCODING, "gzip"); } public void finish() throws IOException { if (printWriter != null) { printWriter.close(); } if (outputStream != null) { outputStream.close(); } if (gzipStream != null) { gzipStream.close(); } } @Override public void flushBuffer() throws IOException { if (printWriter != null) { printWriter.flush(); } if (outputStream != null) { outputStream.flush(); } super.flushBuffer(); } @Override public ServletOutputStream getOutputStream() throws IOException { if (printWriter != null) { throw new IllegalStateException("printWriter already defined"); } if (outputStream == null) { initGzip(); outputStream = gzipStream; } return outputStream; } @Override public PrintWriter getWriter() throws IOException { if (outputStream != null) { throw new IllegalStateException("printWriter already defined"); } if (printWriter == null) { initGzip(); printWriter = new PrintWriter(new OutputStreamWriter(gzipStream, getResponse().getCharacterEncoding())); } return printWriter; } @Override public void setContentLength(int len) { } private void initGzip() throws IOException { gzipStream = new ServletResponseGZIPOutputStream(getResponse().getOutputStream()); } } public class ServletResponseGZIPOutputStream extends ServletOutputStream { GZIPOutputStream gzipStream; final AtomicBoolean open = new AtomicBoolean(true); OutputStream output; public ServletResponseGZIPOutputStream(OutputStream output) throws IOException { this.output = output; gzipStream = new GZIPOutputStream(output); } @Override public void close() throws IOException { if (open.compareAndSet(true, false)) { gzipStream.close(); } } @Override public void flush() throws IOException { gzipStream.flush(); } @Override public void write(byte[] b) throws IOException { write(b, 0, b.length); } @Override public void write(byte[] b, int off, int len) throws IOException { if (!open.get()) { throw new IOException("Stream closed!"); } gzipStream.write(b, off, len); } @Override public void write(int b) throws IOException { if (!open.get()) { throw new IOException("Stream closed!"); } gzipStream.write(b); } } 

También necesita definir la asignación en su web.xml:

  CompressionFilter com.my.company.CompressionFilter   CompressionFilter *.js   CompressionFilter *.css   CompressionFilter *.html   CompressionFilter *.jsp  

Echa un vistazo al filtro compresor pjl CompressingFilter:

http://sourceforge.net/projects/pjl-comp-filter/

Yo recomendaría que uses algo en frente de tomcat para descargar gzipping. Apache con mod_deflate funcionará bien. Tienes la opción de poner apache en el mismo cuadro o moverlo a un cuadro diferente, de esa manera la compresión no afecta en absoluto tu aplicación. mod_jk o mod_proxy funcionarán bien en esta configuración.

http://httpd.apache.org/docs/2.0/mod/mod_deflate.html

O si usa Nginx en el frente, consulte aquí: http://nginx.org/en/docs/http/ngx_http_gzip_module.html . Pero definitivamente, como dijo Zeki, es mejor mover esto al servidor web dedicado.