استخدام ضغط GZIP مع Spring Boot/MVC/JavaConfig مع RESTful




spring-mvc spring-java-config (6)

نحن نستخدم Spring Boot / MVC مع java-config المبني على الشرح لسلسلة خدمات RESTful ونريد تمكين HTTP GZIP تدفق HTTP GZIP على بعض استجابات API.

أعلم أنه يمكنني القيام بذلك يدويًا في جهاز التحكم الخاص بي byte[] @ResponseBody ، ومع ذلك فإننا نفضل الاعتماد على البنية الأساسية SpringMVC (فلاتر / وما إلى ذلك) وجعلها تقوم تلقائيًا بتحويل JSON وضغطه (أي أن الطريقة تقوم بإرجاع POJO).

كيف يمكنني تمكين ضغط GZIP في ResponseBody أو نسخة Tomcat المضمنة ، وبطريقة يمكننا بشكل انتقائي لضغط بعض الاستجابات فقط؟

شكر!

ملاحظة: ليس لدينا حاليًا أي تكوين مستند إلى XML.


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

على إصدارات recents في التكوين application.yml :

---

spring:
  profiles: dev

server:
  compression:
    enabled: true
    mime-types: text/html,text/css,application/javascript,application/json

---

لتمكين ضغط GZIP ، تحتاج إلى تعديل تكوين نسخة Tomcat المضمنة. للقيام بذلك ، تقوم بتعريف حبة EmbeddedServletContainerCustomizer في تكوين Java الخاص بك ثم قم بتسجيل 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 للحصول على مزيد من التفاصيل حول خيارات تكوين الضغط المختلفة المتاحة.

أنت تقول أنك تريد تمكين الضغط بشكل انتقائي. اعتمادًا على معايير الاختيار الخاصة بك ، قد يكون النهج أعلاه كافيًا. يمكّنك من التحكم في الضغط بواسطة وكيل المستخدم للطلب ، وحجم الاستجابة ، ونوع mime للإجابة.

إذا كان هذا لا يلبي احتياجاتك ، أعتقد أنك ستضطر إلى تنفيذ الضغط في وحدة التحكم وإرجاع استجابة بايت [] باستخدام رأس ترميز محتوى gzip.



واجهت نفس المشكلة في مشروع Spring Boot + Spring Data عند التذرع بـ @RepositoryRestResource .

المشكلة هي نوع MIME إرجاع؛ وهو application/hal+json . server.compression.mime-types الخاصية server.compression.mime-types حل هذه المشكلة بالنسبة لي.

آمل أن يساعد هذا لشخص آخر!


بقية هذه الإجابات غير محدثة و / أو فوق القمة معقدة لشيء ينبغي أن يكون بسيطًا في المنظمة الدولية للأرصاد الجوية (ما مدى وجود gzip منذ الآن؟ أطول من جافا ...) من المستندات:

في application.properties 1.3+

server.compression.enabled=true
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css

في application.properties 1.2.2 - <1.3

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");
  }
}

لاحظ أيضًا أن هذا سيعمل فقط إذا كنت تقوم بتشغيل tom مضمن:

إذا كنت تخطط للنشر على tomcat غير مضمّن ، فيجب عليك تمكينه server.xml http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation

IRL Production Note:

ولتجنب كل ذلك ، يمكنك استخدام إعداد الموازن بالوكالة / التحميل أمام Tomcat مع nginx و / أو haproxy أو ما شابه ذلك حيث إنه سيتعامل مع الأصول الثابتة و gzip MUCH بشكل أكثر كفاءة وسهولة من طراز مؤشر الترابط في Java / Tomcat.

أنت لا تريد رمي "قطة في الحمام لأنها مشغولة بضغط الأشياء بدلاً من تقديم طلبات (أو على الأرجح غزل الخيوط / تناول وحدة المعالجة المركزية / كومة الانتظار حول انتظار قاعدة بيانات IO لتظهر أثناء تشغيل فاتورة AWS الخاصة بك لماذا قد لا تكون Java / Tomcat التقليدية فكرة جيدة للبدء بها اعتمادًا على ما تفعله ولكنني أقوم بالاستكشاف ...)

refs: http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#how-to-enable-http-response-compression

https://github.com/spring-projects/spring-boot/issues/2031







spring-java-config