এসইএসটিফুলের সাথে স্প্রিং বুট / এমভিসি / জাভা কনফিগের সাথে জিজেডআইপি সংক্ষেপণ ব্যবহার করা


97

আমরা সিরিজগুলির RESTfulপরিষেবার জন্য টীকা-ভিত্তিক জাভা-কনফিগারেশন সহ স্প্রিং বুট / এমভিসি ব্যবহার করি এবং আমরা HTTP GZIPকয়েকটি এপিআই প্রতিক্রিয়াগুলিতে নির্বাচিতভাবে স্ট্রিম সংক্ষেপণ সক্ষম করতে চাই ।

আমি জানি যে আমি নিজের কন্ট্রোলারে এটি ম্যানুয়ালি করতে পারি এবং এ byte[] @ResponseBody, তবে আমরা স্প্রিং এমভিসি অবকাঠামো (ফিল্টার / ইত্যাদি) এর উপর নির্ভর করতে পছন্দ করি এবং এটি স্বয়ংক্রিয়ভাবে JSON রূপান্তর এবং সংকোচন (যেমন পদ্ধতিটি একটি POJO প্রদান করে) করতে চাই।

আমি কীভাবে রেসপন্সবডি বা এমবেডড টমক্যাট উদাহরণটিতে জিজেপআইপি সংক্ষেপণ সক্ষম করতে পারি এবং একটি উপায়ে আমরা কেবলমাত্র কয়েকটি প্রতিক্রিয়া নির্বাচন করতে পারি?

ধন্যবাদ!

PS: বর্তমানে আমাদের কাছে কোনও এক্সএমএল ভিত্তিক কনফিগারেশন নেই।


আপনার GzipFilter পরীক্ষা করা উচিত ।
আনুমানিক

4
আপনি কী করছেন তা না জানলে এইচটিটিপিএসের সাথে এইচটিটিপি সংক্ষেপণ ব্যবহার করবেন না
নীল ম্যাকগুইগান

উত্তর:


191

এই উত্তরগুলির বাকিগুলি পুরানো এবং / অথবা সহজ আইএমও হওয়া উচিত এমন কিছু জটিলতার জন্য শীর্ষস্থানীয় (জাজিপ এখন থেকে কতকাল ধরে? জাভার চেয়ে দীর্ঘতর ...) ডক্স থেকে:

অ্যাপ্লিকেশন.প্রসারণসমূহে 1.3+

# 🗜️🗜️🗜️
server.compression.enabled=true
# opt in to content types
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css
# not worth the CPU cycles at some point, probably
server.compression.min-response-size=10240 

অ্যাপ্লিকেশন.প্রপার্টিগুলিতে 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");
  }
}

এছাড়াও আপনি যদি এমবেডড টমক্যাট চালাচ্ছেন তবে এটি কেবলমাত্র কাজ করবে তা নোট করুন:

আপনি server.xml এটি সক্ষম করতে হবে করতে হবে যদি আপনার নন হুল বিড়াল এমবেডেড যাও স্থাপন করার পরিকল্পনা করে থাকেন http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation

আইআরএল উত্পাদনের নোট:

এছাড়াও এগুলি এড়াতে nginx এবং / অথবা haproxy সহ টমকেটের সামনে একটি প্রক্সি / লোড ব্যালেন্সার সেটআপ ব্যবহার করার বিষয়টি বিবেচনা করুন বা অনুরূপ যেহেতু এটি স্ট্যাটিক সম্পদ হ্যান্ডেল এবং জাভা / হুল বিড়াল এর থ্রেডিং মডেল তুলনায় অনেক আরো দক্ষতার সঙ্গে এবং সহজেই gzip হবে।

আপনি বাথকে বিড়ালটিকে নিক্ষেপ করতে চান না কারণ এটি অনুরোধগুলি পরিবেশন করার পরিবর্তে স্টাফগুলি সংকুচিত করাতে ব্যস্ত (বা সম্ভবত আপনার AWS বিল চালানোর সময় ডাটাবেস IO হওয়ার অপেক্ষায় বসে থ্রেড কাটা / সিপিইউ / হিপ খাওয়ার আশেপাশে বসে) আপনি যা করছেন তার উপর ভিত্তি করে কেন ট্র্যাডিশনাল জাভা / টমক্যাটটি শুরু করা ভাল ধারণা হতে পারে না তবে আমি খনন করি ...)

রেফস: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/references/html/howto.html#how-to-enable-http-response-compression

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


স্প্রিং বুট TomcatConnectorCustomizerঅ্যাপ্লিকেশন প্রসঙ্গে উদাহরণগুলির সন্ধান না করায় 1.2.2 বছরের পুরানো সংস্করণগুলির জন্য আপনার পদ্ধতির কাজ হবে না ; তাদের অগ্রগতিতে নিবন্ধিত হতে হবেTomcatEmbeddedServletContainerFactory
অ্যান্ডি উইলকিনসন

সতর্ক থাকুন জন্য ধন্যবাদ। স্থির / গতিশীল / টমকাট / বনাম বুটটি এখনও একটি ইস্যু বলে মনে হয়েছিল বলে আমি এটি ছেড়ে দিয়ে শেষ করেছি। এটি হওয়া উচিত তার চেয়ে শক্ততর ... Nginx বিপরীতে প্রক্সি FTW!
জন কালভিনার

4
স্প্রিংবুটে নতুন বৈশিষ্ট্যগুলি হ'ল সার্ভার.ট্রেশন.এনএবলড
প্রিমেশন.মাইম

4
স্প্রিং বুটের জন্য যদি আমাদের একাধিক রেস্ট কন্ট্রোলার থাকে সমস্ত JSON প্রতিক্রিয়া ফেরত। আমরা কি কিছু নিয়ামকের উপর নির্বাচন করে জিপ প্রয়োগ করতে পারি?

4
সংক্ষেপণের জন্য আপনার ন্যূনতম প্রতিক্রিয়া আকারেরও উল্লেখ করা উচিত (উদা: 10 কেবি) অন্যথায় এটি সার্ভারের প্রতিটি অনুরোধ (উদাহরণস্বরূপ: 0.5 কেবি) কমপ্রেস করার জন্য ওভারহেড হয়ে যায়। server.compression.min-response-size=10240
উসামা আমজাদ 12

13

application.ymlকনফিগারেশনে রিটার্ন সংস্করণগুলিতে :

---

spring:
  profiles: dev

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

---

সম্পর্কিত বাগ রিপোর্ট এবং ঠিক কোথায় পরিবর্তন করা হয়েছে তা হ'ল github.com/spring-projects/spring-boot/issues/2737
ম্যাকলভিন

12

এটি মূলত @ অ্যান্ডি-উইলকিনসন প্রদত্ত একই সমাধান, তবে স্প্রিং বুট ১.০ অনুসারে কাস্টমাইজ (...) পদ্ধতিতে একটি কনফিগারযোগ্য এম্বেডড সার্ভেলকন্টেইনার প্যারামিটার রয়েছে।

আরেকটা জিনিস যে কহতব্য যে হুল বিড়াল শুধুমাত্র সামগ্রী প্রকার সংকোচন হয় text/html, text/xmlএবং text/plainডিফল্ট ভাবে। নীচে এমন একটি উদাহরণ দেওয়া আছে যা সংকোচনের পক্ষেও সমর্থন করে application/json:

@Bean
public EmbeddedServletContainerCustomizer servletContainerCustomizer() {
    return new EmbeddedServletContainerCustomizer() {
        @Override
        public void customize(ConfigurableEmbeddedServletContainer servletContainer) {
            ((TomcatEmbeddedServletContainerFactory) servletContainer).addConnectorCustomizers(
                    new TomcatConnectorCustomizer() {
                        @Override
                        public void customize(Connector connector) {
                            AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler();
                            httpProtocol.setCompression("on");
                            httpProtocol.setCompressionMinSize(256);
                            String mimeTypes = httpProtocol.getCompressableMimeTypes();
                            String mimeTypesWithJson = mimeTypes + "," + MediaType.APPLICATION_JSON_VALUE;
                            httpProtocol.setCompressableMimeTypes(mimeTypesWithJson);
                        }
                    }
            );
        }
    };
}

আমি এটি আমার জাভা কনফিগারেশনে যুক্ত করার চেষ্টা করেছি এবং দেখেছি যে সংক্ষেপণটি কোনওভাবেই কাজ করছে বলে মনে হচ্ছে না। আমি এম্বেড কনটেইনার হিসাবে টমক্যাট সহ স্প্রিং বুট ব্যবহার করছি এবং ভাবছি যে এই কনফিগারেশনটি ছাড়া অন্য কিছু সেট করার জন্য আমার অতিরিক্ত কোনও জিনিস দরকার ছিল কিনা?
মাইকেল কক্সন

4
Accept-Encoding: gzip,deflateশিরোনাম নির্দিষ্ট করে যাচাই করার চেষ্টা করুন , যদি আপনি কার্ল ব্যবহার করছেন:curl -i -H 'Accept-Encoding: gzip,deflate' http://url.to.your.server
ম্যাটসেভ

9

স্প্রিং বুট 1.4 জাভাস্ক্রিপ্ট এইচটিএমএল জসন সমস্ত সংকোচনের জন্য এটি ব্যবহার করুন।

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

আমরা কীভাবে এই সংক্ষেপণটি যাচাই করব?
ভড়গব

@ ভরগাভ আপনার এপিআই প্রতিক্রিয়ার প্রতিক্রিয়া শিরোনামটি দেখুন। Content-Encodinggzip
সুমিত ঝা


6

টমক্যাটে জিজেপ সক্ষম করা আমার স্প্রিং বুট প্রকল্পে কাজ করে না। আমি এখানে পাওয়া কমপ্রেসিং ফিল্টার ব্যবহার করেছি ।

@Bean
public Filter compressingFilter() {
    CompressingFilter compressingFilter = new CompressingFilter();
    return compressingFilter;
}

@ user1127860 tnx এটি কাজ করে তবে যাইহোক এই ফিল্টারটি আরও কনফিগার করতে চান? আমি স্প্রিং বুটটি ব্যবহার করি এবং কন্ট্রোলটি ওয়েব.এক্সএমএল অনুসারে ম্যানুয়াল হিসাবে থিম প্যারাম যুক্ত করতে পারে বলে মনে করে
স্প্রিং

5

GZIP সংক্ষেপণ সক্ষম করতে আপনাকে এমবেডড টমক্যাট উদাহরণটির কনফিগারেশনটি পরিবর্তন করতে হবে। এটি করার জন্য, আপনি EmbeddedServletContainerCustomizerআপনার জাভা কনফিগারেশনে একটি শিম ঘোষণা করুন এবং তারপরে একটি নিবন্ধ করুন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);
                }
            });
        }
    };
}

উপলব্ধ বিভিন্ন সংকোচনের কনফিগারেশন বিকল্পগুলির আরও বিশদের জন্য টমক্যাট ডকুমেন্টেশন দেখুন ।

আপনি বলেছিলেন যে আপনি নির্বাচনকে বেছে নিতে সক্ষম করতে চান। আপনার নির্বাচনের মানদণ্ডের উপর নির্ভর করে, তারপরে উপরের পদ্ধতিটি পর্যাপ্ত হতে পারে। এটি আপনাকে অনুরোধের ব্যবহারকারী-এজেন্ট, প্রতিক্রিয়ার আকার এবং প্রতিক্রিয়াটির মাইম টাইপের সাহায্যে সংক্ষেপণ নিয়ন্ত্রণ করতে সক্ষম করে।

যদি এটি আপনার প্রয়োজনগুলি পূরণ করে না তবে আমি বিশ্বাস করি যে আপনাকে আপনার নিয়ামকের মধ্যে সংক্ষেপণটি সম্পাদন করতে হবে এবং একটি গিজিপ সামগ্রী-এনকোডিং শিরোনাম দিয়ে একটি বাইট [] প্রতিক্রিয়া ফিরিয়ে আনতে হবে।


4
আপনার অ্যাপ্লিকেশন.প্রেপার্টিগুলিতে সেটিংটি রাখার বিকল্পটির উত্তরের মধ্যে পার্থক্য কী? server.compression.enabled = true server.compression.mime-ਕਿਸਮ = অ্যাপ্লিকেশন / জেএসন, অ্যাপ্লিকেশন / এক্সএমএল, পাঠ্য / এইচটিএমএল, পাঠ্য / এক্সএমএল, পাঠ্য / প্লেইন, অ্যাপ্লিকেশন / জাভাস্ক্রিপ্ট, পাঠ্য / সিএসএস
lukass77

এই উত্তরটি সম্পত্তি-ভিত্তিক সংক্ষেপণের কনফিগারেশন উপলব্ধ হওয়ার আগেই লেখা হয়েছিল written এগুলি সমতুল্য, তবে বৈশিষ্ট্য-ভিত্তিক পদ্ধতিটি আরও সহজ তাই আমি এটি ব্যবহার করার পরামর্শ দেব।
অ্যান্ডি উইলকিনসন

কেবলমাত্র এটিই ভাগ করে নিতে চাই যে আমার ক্ষেত্রে টোমকেট একটি লোড ব্যালেন্সারের পিছনে রয়েছে যা https পেয়ে যায় এবং HTTP হিসাবে টমকাট করার অনুরোধটি ফরওয়ার্ড করে। আমি যখন প্রয়োগ করি rop প্রপার্টি সমাধানের প্রতিক্রিয়াটি জিজিপ হয় না তবে যখন আমি সংযোগকারীটিতে প্রোগ্রামেটিক কনফিগার সমাধানটি ব্যবহার করি
জিপিএস

আমি অ্যাপ্লিকেশন.প্রপ্রেটিস সমাধানটি ব্যবহার করার ক্ষেত্রে আরেকটি প্রশ্ন .. এবং 8081 এবং 8082 বন্দরগুলিতে আরও 2 সংযোজক সংজ্ঞায়িত করি .. সমস্ত সংযোজকের কাছে কেবলমাত্র 8080 সংযোগকারীকে তুলনা করা যায়?
lukass77

আমি এটি যাচাই করে বলছি, আরও বেশি সংযোজকগুলি খোলার পরেও কেবল তুলনাটি 8080 বন্দরটিতে প্রয়োগ করা হবে .., আমি মনে করি যে এটিতে স্প্রিং বুট পর্যন্ত বাগ খোলা উচিত ?? .., সুতরাং আমার জন্য কেবল কাজের সমাধানটি প্রতিটি সংযোজকের জন্য প্রোগ্রামেটিক কনফিগারেশন ছিল, অ্যাপ্লিকেশন.প্রপ্রেটিস নয়
lukass77

0

আমি যখন অনুরোধ করছিলাম তখন আমার স্প্রিং বুট + স্প্রিং ডেটা প্রকল্পে একই সমস্যা ছিল @RepositoryRestResource

সমস্যাটি হল মাইম টাইম ফেরত; যা application/hal+json। এটি যুক্ত করা হচ্ছেserver.compression.mime-typesসম্পত্তিতে আমার জন্য এই সমস্যার সমাধান করে।

আশা করি এটি অন্য কাউকে সাহায্য করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.