paint-brush
URL को छोटा कैसे करें: जावा और स्प्रिंग चरण-दर-चरण मार्गदर्शिकाद्वारा@marinsborg
3,997 रीडिंग
3,997 रीडिंग

URL को छोटा कैसे करें: जावा और स्प्रिंग चरण-दर-चरण मार्गदर्शिका

द्वारा marinsborg2022/06/06
Read on Terminal Reader
Read this story w/o Javascript

बहुत लंबा; पढ़ने के लिए

URL शॉर्टनर जावा और स्प्रिंग बूट के साथ लागू किया गया। ट्यूटोरियल सब कुछ शामिल करता है - कार्यात्मक और गैर-कार्यात्मक अनुरोध, बेस 64 रूपांतरण क्या है, एक नई परियोजना कैसे बनाएं, और यूआरएल शॉर्टनर के लिए सभी चरणों को कैसे कार्यान्वित करें। अंत में बताया गया है कि समाधान को कैसे डॉक किया जाए।

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - URL को छोटा कैसे करें: जावा और स्प्रिंग चरण-दर-चरण मार्गदर्शिका
marinsborg HackerNoon profile picture


URL शॉर्टिंग सेवा को लागू करना कोई जटिल कार्य नहीं है, और यह अक्सर सिस्टम डिज़ाइन साक्षात्कार का हिस्सा होता है। इस पोस्ट में, मैं सेवा को लागू करने की प्रक्रिया को समझाने की कोशिश करूंगा। URL शॉर्टनर एक ऐसी सेवा है जिसका उपयोग बहुत लंबे URL से छोटे लिंक बनाने के लिए किया जाता है।


आमतौर पर, छोटे लिंक का आकार मूल URL के एक-तिहाई या एक-चौथाई के बराबर होता है, जिससे उन्हें टाइप करना, प्रस्तुत करना या ट्वीट करना आसान हो जाता है। संक्षिप्त लिंक पर क्लिक करने से उपयोगकर्ता स्वतः मूल URL पर पुनर्निर्देशित हो जाएगा। कई यूआरएल शॉर्टिंग सेवाएं ऑनलाइन उपलब्ध हैं, जैसे कि tiny.cc, bitly.com, cutt.ly, आदि।


लिखित

कार्यान्वयन से पहले, यह लिखना हमेशा एक अच्छा विचार है कि कार्यात्मक और गैर-कार्यात्मक आवश्यकताओं के रूप में क्या करने की आवश्यकता है।


कार्यकारी आवश्यकताएं

  • उपयोगकर्ताओं को एक लंबा URL दर्ज करने में सक्षम होना चाहिए। हमारी सेवा को उस यूआरएल को सहेजना चाहिए और एक छोटा लिंक उत्पन्न करना चाहिए।
  • संक्षिप्त लिंक पर क्लिक करने से उपयोगकर्ता को मूल लंबे URL पर पुनर्निर्देशित करना चाहिए।
  • उपयोगकर्ताओं के पास समाप्ति तिथि दर्ज करने का विकल्प होना चाहिए। एक बार वह तिथि बीत जाने के बाद, संक्षिप्त लिंक अमान्य होना चाहिए।
  • उपयोगकर्ताओं को सेवा का उपयोग करने के लिए एक खाता बनाना चाहिए। सेवाओं की प्रति उपयोगकर्ता उपयोग सीमा हो सकती है (वैकल्पिक)
  • उपयोगकर्ता को अपना छोटा लिंक बनाने की अनुमति है- सेवा में मीट्रिक होना चाहिए, उदाहरण के लिए, सबसे अधिक देखे जाने वाले लिंक (वैकल्पिक)


गैर-कार्यात्मक आवश्यकताएं

  • सेवा 100% समय तक चालू और चालू होनी चाहिए
  • पुनर्निर्देशन दो सेकंड से अधिक नहीं चलना चाहिए


यूआरएल रूपांतरण

मान लें कि हम एक छोटा लिंक चाहते हैं जिसकी अधिकतम लंबाई 7 हो। URL शॉर्टनर में सबसे महत्वपूर्ण चीज रूपांतरण एल्गोरिथ्म है। URL रूपांतरण को कई अलग-अलग तरीकों से लागू किया जा सकता है, और प्रत्येक तरीके के अपने फायदे और नुकसान हैं।


छोटे लिंक बनाने का एक तरीका कुछ हैश फ़ंक्शन (उदाहरण के लिए MD5 या SHA-2 ) के साथ मूल URL को हैश करना होगा। हैश फ़ंक्शन का उपयोग करते समय, यह निश्चित है कि अलग-अलग इनपुट के परिणामस्वरूप अलग-अलग आउटपुट होंगे। हैश का परिणाम सात वर्णों से अधिक लंबा है, इसलिए हमें पहले सात वर्ण लेने होंगे। लेकिन, इस मामले में, टकराव हो सकता है क्योंकि पहले सात अक्षर पहले से ही एक छोटी कड़ी के रूप में उपयोग में हो सकते हैं। फिर, हम अगले सात अक्षर लेते हैं, जब तक कि हमें एक छोटा लिंक नहीं मिल जाता है जिसका उपयोग नहीं किया जाता है।


एक छोटा लिंक बनाने का दूसरा तरीका यूयूआईडी का उपयोग करना है। यूयूआईडी के डुप्लीकेट होने की संभावना शून्य नहीं है, लेकिन यह नगण्य होने के लिए शून्य के काफी करीब है। चूंकि UUID में 36 वर्ण होते हैं, इसका मतलब है कि हमें ऊपर की तरह ही समस्या है। हमें पहले सात अक्षर लेने चाहिए और जांच करनी चाहिए कि क्या वह संयोजन पहले से उपयोग में है।


तीसरा विकल्प संख्याओं को आधार 10 से आधार 62 में परिवर्तित करना होगा। आधार अंकों या वर्णों की एक संख्या है जिसका उपयोग किसी विशेष संख्या का प्रतिनिधित्व करने के लिए किया जा सकता है। आधार 10 अंक [0-9] हैं जिनका उपयोग हम रोजमर्रा की जिंदगी में करते हैं और आधार 62 [0-9] [एज़] [एजेड] हैं। इसका मतलब है कि, उदाहरण के लिए, आधार 10 में चार अंकों वाली एक संख्या आधार 62 में एक ही संख्या होगी, लेकिन दो वर्णों के साथ।


URL रूपांतरण में आधार 62 का अधिकतम सात वर्णों की लंबाई के साथ उपयोग करने से हम छोटे लिंक के लिए 62^7 अद्वितीय मान प्राप्त कर सकते हैं।


तो आधार 62 रूपांतरण कैसे काम करते हैं?

हमारे पास एक आधार 10 संख्या है जिसे हम आधार 62 में बदलना चाहते हैं। हम निम्नलिखित एल्गोरिथम का उपयोग करने जा रहे हैं:


 while(number > 0) remainder = number % 62 number = number / 62 attach remainder to start of result collection


उसके बाद, हमें परिणाम संग्रह से संख्याओं को आधार 62 वर्णमाला = [0,1,2,…,a,b,c…,A,B,C,…] पर मैप करने की आवश्यकता है।


आइए देखें कि यह एक वास्तविक उदाहरण के साथ कैसे काम करता है। इस उदाहरण में, आइए 1000 को आधार 10 से आधार 62 में बदलें।


 1st iteration: number = 1000 remainder = 1000 % 62 = 8 number = 1000 / 62 = 16 result list = [8] 2nd iteration: number = 16 remainder = 16 % 62 = 16 number = 16 / 62 = 0 result list = [16,8] There is no more iterations since number = 0 after 2nd iteration


[16,8] को आधार 62 में मैप करना g8 होगा। इसका मतलब है कि 1000base10 = g8base62.


आधार 62 से आधार 10 में परिवर्तित करना भी सरल है:


 i = 0 while(i < inputString lenght) counter = i + 1 mapped = base62alphabet.indexOf(inputString[i]) // map character to number based on its index in alphabet result = result + mapped * 62^(inputString lenght - counter) i++


वास्तविक उदाहरण:


 inputString = g8 inputString length = 2 i = 0 result = 0 1st iteration counter = 1 mapped = 16 // index of g in base62alphabet is 16 result = 0 + 16 * 62^1 = 992 2nd iteration counter = 2 mapped = 8 // index of 8 in base62alphabet is 8 result = 992 + 8 * 62^1 = 1000


कार्यान्वयन

नोट: संपूर्ण समाधान मेरे Github पर है। मैंने स्प्रिंग बूट और MySQL का उपयोग करके इस सेवा को लागू किया।


हम अपने डेटाबेस के ऑटो-इन्क्रीमेंट फीचर का उपयोग करने जा रहे हैं। आधार 62 रूपांतरण के लिए ऑटो-इंक्रीमेंटिंग नंबर का उपयोग किया जा रहा है। आप किसी अन्य डेटाबेस का उपयोग कर सकते हैं जिसमें ऑटो-इन्क्रीमेंट सुविधा हो।


सबसे पहले, स्प्रिंग इनिशियलाइज़र पर जाएँ और स्प्रिंग वेब और MySql ड्राइवर का चयन करें। इसके बाद Generate बटन पर क्लिक करें और जिप फाइल को डाउनलोड करें। फ़ाइल को अनज़िप करें और प्रोजेक्ट को अपने पसंदीदा IDE में खोलें। हर बार जब मैं एक नई परियोजना शुरू करता हूं, तो मैं अपने कोड को तार्किक रूप से विभाजित करने के लिए कुछ फ़ोल्डर बनाना पसंद करता हूं। इस मामले में मेरे फ़ोल्डर्स नियंत्रक, इकाई, सेवा, भंडार, डीटीओ, और कॉन्फ़िगरेशन हैं।


एंटिटी फोल्डर के अंदर, चार विशेषताओं के साथ एक Url.java क्लास बनाएं: id, longUrl, createDate, ExpireDate।


ध्यान दें कि कोई छोटा लिंक विशेषता नहीं है। हम छोटे लिंक सेव नहीं करेंगे। हम हर बार GET अनुरोध होने पर id विशेषता को आधार 10 से आधार 62 में बदलने जा रहे हैं। इस तरह, हम अपने डेटाबेस में जगह बचा रहे हैं।


LongUrl विशेषता वह URL है, जिस पर उपयोगकर्ता द्वारा किसी छोटे लिंक को एक्सेस करने के बाद हमें रीडायरेक्ट करना चाहिए। बनाई गई तिथि केवल यह देखने के लिए है कि लॉन्गयूआरएल कब सहेजा गया है (यह महत्वपूर्ण नहीं है) और यदि उपयोगकर्ता कुछ समय के बाद एक छोटा लिंक अनुपलब्ध बनाना चाहता है तो एक्सपायर डेट है।


इसके बाद, सर्विस फोल्डर में एक BaseService .java बनाते हैं । बेस सर्विस में बेस 10 से बेस 62 में बदलने की विधियाँ हैं और इसके विपरीत।


 private static final String allowedString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; private char[] allowedCharacters = allowedString.toCharArray(); private int base = allowedCharacters.length;


जैसा कि मैंने पहले उल्लेख किया है, यदि हम आधार 62 रूपांतरणों का उपयोग करना चाहते हैं, तो हमारे पास आधार 62 वर्णमाला होनी चाहिए, जिसे इस मामले में अनुमत वर्ण कहा जाता है। साथ ही, यदि हम अनुमत वर्णों को बदलना चाहते हैं, तो आधार चर के मान की गणना अनुमत वर्णों की लंबाई से की जाती है।


एन्कोड विधि इनपुट के रूप में एक संख्या लेती है और एक छोटा लिंक लौटाती है। डिकोड विधि एक इनपुट के रूप में एक स्ट्रिंग (लघु लिंक) लेती है और एक संख्या लौटाती है। एल्गोरिदम को ऊपर बताए अनुसार लागू किया जाना चाहिए।


उसके बाद, रिपोजिटरी फोल्डर के अंदर, चलिए UrlRepository .java फाइल बनाते हैं, जो कि JpaRepository का सिर्फ एक एक्सटेंशन है और यह हमें 'findById', 'save' इत्यादि जैसे कई तरीके देता है। हमें कुछ और जोड़ने की जरूरत नहीं है इसके लिए।


फिर, नियंत्रक फ़ोल्डर में एक UrlController.java फ़ाइल बनाएँ। छोटे लिंक बनाने के लिए नियंत्रक के पास एक POST विधि होनी चाहिए और मूल URL पर पुनर्निर्देशित करने के लिए एक GET विधि होनी चाहिए।


 @PostMapping("create-short") public String convertToShortUrl(@RequestBody UrlLongRequest request) { return urlService.convertToShortUrl(request); } @GetMapping(value = "{shortUrl}") public ResponseEntity<Void> getAndRedirect(@PathVariable String shortUrl) { var url = urlService.getOriginalUrl(shortUrl); return ResponseEntity.status(HttpStatus.FOUND) .location(URI.create(url)) .build(); }


POST विधि में इसके अनुरोध निकाय के रूप में UrlLongRequest है। यह केवल longUrl और समाप्ति दिनांक विशेषताओं वाला एक वर्ग है।


जीईटी विधि पथ चर के रूप में एक छोटा यूआरएल लेती है और फिर मूल यूआरएल को प्राप्त करती है और रीडायरेक्ट करती है। नियंत्रक के शीर्ष पर, UrlService को एक निर्भरता के रूप में इंजेक्ट किया जाता है, जिसे आगे समझाया जाएगा।


UrlService .java वह जगह है जहां अधिकांश तर्क नियंत्रक द्वारा उपयोग की जाने वाली सेवा है।


ConvertToShortUrl का उपयोग नियंत्रक से POST विधि द्वारा किया जाता है। यह सिर्फ डेटाबेस में एक नया रिकॉर्ड बनाता है और एक आईडी प्राप्त करता है। आईडी को तब आधार 62 शॉर्ट लिंक में बदल दिया जाता है और नियंत्रक को वापस कर दिया जाता है।


GetOriginalUrl नियंत्रक से GET विधि द्वारा उपयोग की जाने वाली एक विधि है। यह पहले एक स्ट्रिंग को आधार 10 में परिवर्तित करता है, और इसका परिणाम एक आईडी है। फिर यह उस आईडी के साथ डेटाबेस से एक रिकॉर्ड प्राप्त करता है और यदि यह अस्तित्व में नहीं है तो अपवाद फेंकता है। उसके बाद, यह मूल URL को नियंत्रक को लौटाता है।


'उन्नत' विषय

इस भाग में, मैं स्वैगर डॉक्यूमेंटेशन, एप्लिकेशन के डॉकराइजेशन , एप्लिकेशन कैशे और MySql शेड्यूल्ड इवेंट के बारे में बात करूंगा।


स्वैगर यूआई

हर बार जब आप एक एपीआई विकसित करते हैं, तो इसे किसी तरह से दस्तावेज करना अच्छा होता है। प्रलेखन एपीआई को समझने और उपयोग करने में आसान बनाता है। इस परियोजना के लिए एपीआई को स्वैगर यूआई का उपयोग करके प्रलेखित किया गया है।

स्वैगर यूआई किसी को भी बिना किसी कार्यान्वयन तर्क के एपीआई के संसाधनों की कल्पना और बातचीत करने की अनुमति देता है।


यह स्वचालित रूप से उत्पन्न होता है, दृश्य प्रलेखन के साथ यह बैक-एंड कार्यान्वयन और क्लाइंट-साइड खपत के लिए आसान बनाता है।


स्वैगर यूआई को प्रोजेक्ट में शामिल करने के लिए हमें कई कदम उठाने होंगे।

सबसे पहले, हमें pom.xml फ़ाइल में मावेन निर्भरताएँ जोड़ने की आवश्यकता है:


 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>


आपके संदर्भ के लिए, आप यहाँ पूरी pom.xml फ़ाइल देख सकते हैं। मावेन निर्भरता जोड़ने के बाद, स्वैगर कॉन्फ़िगरेशन को जोड़ने का समय आ गया है। कॉन्फ़िगरेशन फ़ोल्डर के अंदर, हमें एक नया वर्ग बनाने की आवश्यकता है - SwaggerConfig .java


 @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket apiDocket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(metadata()) .select() .apis(RequestHandlerSelectors.basePackage("com.amarin")) .build(); } private ApiInfo metadata(){ return new ApiInfoBuilder() .title("Url shortener API") .description("API reference for developers") .version("1.0") .build(); } }


कक्षा के शीर्ष पर, हमें कुछ एनोटेशन जोड़ने होंगे।

@कॉन्फ़िगरेशन इंगित करता है कि एक वर्ग एक या अधिक @Beans विधियों की घोषणा करता है और रनटाइम पर उन बीन्स के लिए बीन परिभाषा और सेवा अनुरोध उत्पन्न करने के लिए स्प्रिंग कंटेनर द्वारा संसाधित किया जा सकता है।


@EnableSwagger2 इंगित करता है कि स्वैगर समर्थन सक्षम होना चाहिए।


इसके बाद, हमें डॉकेट बीन को जोड़ना चाहिए जो प्राथमिक एपीआई कॉन्फ़िगरेशन को समझदार डिफ़ॉल्ट और कॉन्फ़िगरेशन के लिए सुविधाजनक तरीके प्रदान करता है।


apiInfo () विधि ApiInfo ऑब्जेक्ट लेती है जहां हम सभी आवश्यक API जानकारी को कॉन्फ़िगर कर सकते हैं - अन्यथा, यह कुछ डिफ़ॉल्ट मानों का उपयोग करता है। कोड को क्लीनर बनाने के लिए, हमें एक निजी विधि बनानी चाहिए जो ApiInfo ऑब्जेक्ट को कॉन्फ़िगर और वापस कर देगी और उस विधि को apiInfo () विधि के पैरामीटर के रूप में पास करेगी। इस मामले में, यह मेटाडेटा () विधि है।


एपिस () विधि हमें उन पैकेजों को फ़िल्टर करने की अनुमति देती है जिन्हें प्रलेखित किया जा रहा है।


स्वैगर यूआई कॉन्फ़िगर किया गया है और हम अपने एपीआई का दस्तावेजीकरण शुरू कर सकते हैं। UrlController के अंदर, प्रत्येक समापन बिंदु के ऊपर, हम विवरण जोड़ने के लिए @ApiOperation एनोटेशन का उपयोग कर सकते हैं। अपनी आवश्यकताओं के आधार पर आप कुछ अन्य एनोटेशन का उपयोग कर सकते हैं।


@ApiModelProperty का उपयोग करके डीटीओ का दस्तावेजीकरण करना भी संभव है जो आपको अनुमत मान, विवरण आदि जोड़ने की अनुमति देता है।


कैशिंग

विकिपीडिया के अनुसार, एक [cache](https://en.wikipedia.org/wiki/Cache_(computing) एक हार्डवेयर या सॉफ़्टवेयर घटक है जो डेटा संग्रहीत करता है ताकि उस डेटा के लिए भविष्य के अनुरोधों को तेज़ी से पूरा किया जा सके; इसमें संग्रहीत डेटा कैश पहले की गणना या कहीं और संग्रहीत डेटा की एक प्रति का परिणाम हो सकता है।


कैश का सबसे अधिक इस्तेमाल किया जाने वाला प्रकार एक इन-मेमोरी कैश है जो कैश्ड डेटा को रैम में स्टोर करता है। जब डेटा का अनुरोध किया जाता है और कैश में पाया जाता है, तो इसे डेटाबेस के बजाय रैम से परोसा जाता है। इस तरह, जब कोई उपयोगकर्ता डेटा का अनुरोध करता है तो हम महंगे बैकएंड को कॉल करने से बचते हैं।

URL शॉर्टनर एक प्रकार का एप्लिकेशन है जिसमें लिखने के अनुरोधों की तुलना में अधिक पढ़ने के अनुरोध होते हैं, जिसका अर्थ है कि यह कैश का उपयोग करने के लिए एक आदर्श एप्लिकेशन है।


स्प्रिंग बूट एप्लिकेशन में कैशिंग को सक्षम करने के लिए, हमें बस UrlShortenerApiApplication वर्ग में @EnableCaching एनोटेशन जोड़ने की आवश्यकता है।


उसके बाद, नियंत्रक में, हमें GET विधि के ऊपर @Cachable एनोटेशन सेट करने की आवश्यकता है। यह एनोटेशन स्वचालित रूप से कैश नामक विधि के परिणामों को संग्रहीत करता है। @Cachable एनोटेशन में, हम मान पैरामीटर सेट करते हैं जो कैश का नाम है, और कुंजी पैरामीटर जो कैश कुंजी है।


इस मामले में, कैश कुंजी के लिए, हम 'शॉर्टयूआरएल' का उपयोग करने जा रहे हैं क्योंकि हमें यकीन है कि यह अद्वितीय है। यह सुनिश्चित करने के लिए कि केवल एक थ्रेड कैश मान बना रहा है, सिंक पैरामीटर सही पर सेट हैं।


और वह यह है - हमारा कैश सेट हो गया है और जब हम पहली बार यूआरएल को कुछ छोटे लिंक के साथ लोड करते हैं, तो परिणाम कैश में सहेजा जाएगा और उसी शॉर्ट लिंक के साथ एंडपॉइंट पर कोई भी अतिरिक्त कॉल कैश से परिणाम पुनर्प्राप्त करेगा। डेटाबेस से।


डॉकराइजेशन

Dockerization एक [Docker](https://en.wikipedia.org/wiki/Docker_(software) कंटेनर में किसी एप्लिकेशन और उसकी निर्भरता की पैकेजिंग की प्रक्रिया है। एक बार जब हम Docker कंटेनर को कॉन्फ़िगर कर लेते हैं, तो हम आसानी से किसी भी एप्लिकेशन को चला सकते हैं। सर्वर या कंप्यूटर जो डॉकर का समर्थन करता है।

पहली चीज जो हमें करने की ज़रूरत है वह है डॉकरफाइल बनाना।


Dockerfile एक टेक्स्ट फ़ाइल है जिसमें वे सभी कमांड होते हैं जिन्हें उपयोगकर्ता किसी छवि को इकट्ठा करने के लिए कमांड लाइन पर कॉल कर सकता है।


 FROM openjdk:13-jdk-alpine COPY ./target/url-shortener-api-0.0.1-SNAPSHOT.jar /usr/src/app/url-shortener-api-0.0.1-SNAPSHOT.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/usr/src/app/url-shortener-api-0.0.1-SNAPSHOT.jar"]


FROM - यह वह जगह है जहां हम बिल्ड बेस के लिए बेस इमेज सेट करते हैं। हम OpenJDK v13 का उपयोग करने जा रहे हैं जो जावा का एक मुक्त और खुला स्रोत संस्करण है। आप डॉकर हब पर अपनी मूल छवि के लिए अन्य छवियां पा सकते हैं जो डॉकर छवियों को साझा करने का स्थान है।


कॉपी - यह कमांड स्थानीय फाइल सिस्टम (आपके कंप्यूटर) से हमारे द्वारा निर्दिष्ट पथ पर कंटेनर के फाइल सिस्टम में फाइलों की प्रतिलिपि बनाता है। हम लक्ष्य फ़ोल्डर से जार फ़ाइल को कंटेनर में /usr/src/app फ़ोल्डर में कॉपी करने जा रहे हैं। मैं थोड़ी देर बाद JAR फाइल बनाने के बारे में बताऊंगा।


एक्सपोज़ - निर्देश जो डॉकर को सूचित करता है कि कंटेनर रनटाइम पर निर्दिष्ट नेटवर्क पोर्ट को सुनता है। डिफ़ॉल्ट प्रोटोकॉल टीसीपी है और आप निर्दिष्ट कर सकते हैं कि क्या आप यूडीपी का उपयोग करना चाहते हैं।


ENTRYPOINT - यह निर्देश आपको एक कंटेनर को कॉन्फ़िगर करने की अनुमति देता है जो एक निष्पादन योग्य के रूप में चलेगा। यहां हमें यह निर्दिष्ट करने की आवश्यकता है कि डॉकर अनुप्रयोगों से कैसे बाहर निकलेगा।


.jar फ़ाइल से किसी एप्लिकेशन को चलाने का आदेश है


 java -jar <app_name>.jar


इसलिए हम उन 3 शब्दों को एक सरणी में रखते हैं और वह यह है।


अब जब हमारे पास Dockerfile है तो हमें इससे इमेज बनानी चाहिए। लेकिन जैसा कि मैंने पहले उल्लेख किया है, हमें पहले अपने प्रोजेक्ट से .jar फ़ाइल बनाने की आवश्यकता है ताकि Dockerfile में COPY कमांड ठीक से काम कर सके। निष्पादन योग्य .jar बनाने के लिए हम maven का उपयोग करने जा रहे हैं।


हमें यह सुनिश्चित करने की ज़रूरत है कि हमारे पोम .xml के अंदर मावेन है। यदि मावेन गायब है, तो हम इसे जोड़ सकते हैं


 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>


उसके बाद, हमें बस कमांड चलानी चाहिए


 mvn clean package


एक बार ऐसा करने के बाद, हम एक डॉकर छवि बना सकते हैं। हमें यह सुनिश्चित करने की आवश्यकता है कि हम उसी फ़ोल्डर में हैं जहाँ Dockerfile है, इसलिए हम इस कमांड को चला सकते हैं


 docker build -t url-shortener:latest .

-t का उपयोग किसी छवि को टैग करने के लिए किया जाता है। हमारे मामले में, इसका मतलब है कि रिपॉजिटरी का नाम url-shortener होगा और एक टैग नवीनतम होगा। टैगिंग का उपयोग छवियों के संस्करण बनाने के लिए किया जाता है। उसके बाद कमांड हो जाने के बाद, हम यह सुनिश्चित कर सकते हैं कि हमने कमांड के साथ एक इमेज बनाई है

 docker images

यह हमें कुछ इस तरह देगा

अंतिम चरण के लिए, हमें अपनी छवियों का निर्माण करना चाहिए। मैं छवियों को कहता हूं क्योंकि हम एक डॉकटर कंटेनर में MySQL सर्वर भी चलाएंगे। डेटाबेस कंटेनर को एप्लिकेशन कंटेनर से अलग किया जाएगा। डॉकर कंटेनर में MySQL सर्वर चलाने के लिए बस रन करें


 $ docker run --name shortener -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -p 3306:3306 mysql:8


आप डॉकर हब पर प्रलेखन देख सकते हैं।


जब हमारे पास एक कंटेनर के अंदर एक डेटाबेस चल रहा होता है, तो हमें उस MySQL सर्वर से कनेक्ट करने के लिए अपने एप्लिकेशन को कॉन्फ़िगर करने की आवश्यकता होती है। application.properties के अंदर 'शॉर्टनर' कंटेनर से कनेक्ट करने के लिए spring.datasource.url सेट करें।


चूंकि हमने अपनी परियोजना में कुछ बदलाव किए हैं, इसलिए हमें अपने प्रोजेक्ट को मावेन का उपयोग करके .jar फ़ाइल में पैक करना होगा और फिर से डॉकरफ़ाइल से डॉकर छवि बनाना होगा।


अब जब हमारे पास एक डॉकर छवि है, तो हमें अपना कंटेनर चलाने की आवश्यकता है। हम इसे कमांड के साथ करेंगे


 docker run -d --name url-shortener-api -p 8080:8080 --link shortener url-shortener


-d का अर्थ है कि एक डॉकटर कंटेनर आपके टर्मिनल की पृष्ठभूमि में चलता है। -नाम आपको अपने कंटेनर का नाम सेट करने देता है


-पी होस्ट-पोर्ट: डॉकर-पोर्ट - यह आपके स्थानीय कंप्यूटर पर कंटेनर के अंदर बंदरगाहों के लिए बंदरगाहों की मैपिंग कर रहा है। इस मामले में, हमने एक कंटेनर के अंदर पोर्ट 8080 को उजागर किया और इसे हमारे स्थानीय पोर्ट 8080 में मैप करने का निर्णय लिया।


-इसके साथ हम अपने एप्लिकेशन कंटेनर को डेटाबेस कंटेनर से लिंक करते हैं ताकि कंटेनर एक दूसरे को खोज सकें और एक कंटेनर के बारे में जानकारी को दूसरे कंटेनर में सुरक्षित रूप से स्थानांतरित कर सकें।

यह जानना महत्वपूर्ण है कि यह ध्वज अब एक विरासत है और निकट भविष्य में इसे हटा दिया जाएगा। लिंक के बजाय, हमें दो कंटेनरों के बीच संचार की सुविधा के लिए एक नेटवर्क बनाने की आवश्यकता होगी।


url-shortener - उस डॉकर छवि का नाम है जिसे हम चलाना चाहते हैं।


और इसके साथ, हम कर रहे हैं - ब्राउज़र में http://localhost:8080/swagger-ui.html . पर जाएं

अब आप अपनी छवियों को DockerHub पर प्रकाशित कर सकते हैं और आसानी से किसी भी कंप्यूटर या सर्वर पर अपना एप्लिकेशन चला सकते हैं।


दो और चीजें हैं जिनके बारे में मैं अपने डॉकर अनुभव को बेहतर बनाने के लिए बात करना चाहता हूं। एक मल्टी-स्टेज बिल्ड है और दूसरा डॉकर-कंपोज़ है।


मल्टी-स्टेज बिल्ड

मल्टी-स्टेज बिल्ड के साथ, आप अपने Dockerfile में कई FROM स्टेटमेंट्स का उपयोग कर सकते हैं। प्रत्येक FROM निर्देश एक अलग आधार का उपयोग कर सकता है, और उनमें से प्रत्येक निर्माण का एक नया चरण शुरू करता है। आप अंतिम छवि में वह सब कुछ छोड़ कर जो आप नहीं चाहते हैं, कलाकृतियों को एक चरण से दूसरे चरण में चुनिंदा रूप से कॉपी कर सकते हैं।


हर बार जब हम अपने कोड में कुछ बदलाव करते हैं तो मैन्युअल रूप से .jar फ़ाइलों को बनाने से बचने के लिए मल्टी-स्टेज बिल्ड हमारे लिए अच्छे होते हैं। मल्टी-स्टेज बिल्ड के साथ, हम बिल्ड के एक चरण को परिभाषित कर सकते हैं जो मावेन पैकेज कमांड करेगा और दूसरा चरण पहले बिल्ड से परिणाम को डॉकर कंटेनर के फाइल सिस्टम में कॉपी करेगा।


आप यहां पूरा डॉकरफाइल देख सकते हैं।


डोकर-लिखें

कंपोज़ मल्टी-कंटेनर डॉकर एप्लिकेशन को परिभाषित करने और चलाने के लिए एक उपकरण है। लिखें के साथ, आप अपने एप्लिकेशन की सेवाओं को कॉन्फ़िगर करने के लिए एक YAML फ़ाइल का उपयोग करते हैं। फिर, एक ही आदेश के साथ, आप अपने कॉन्फ़िगरेशन से सभी सेवाएं बनाते और प्रारंभ करते हैं।


डॉकर-कंपोज़ के साथ, हम अपने एप्लिकेशन और डेटाबेस को एक ही कॉन्फ़िगरेशन फ़ाइल में पैक करेंगे और फिर सब कुछ एक साथ चलाएंगे। इस तरह हम MySQL कंटेनर को चलाने और फिर उसे हर बार एप्लिकेशन कंटेनर से जोड़ने से बचते हैं।


Docker-compose .yml काफी आत्म -व्याख्यात्मक है - सबसे पहले, हम MySQL कंटेनर को MySQL सर्वर के लिए छवि mysql v8.0 और क्रेडेंशियल सेट करके कॉन्फ़िगर करते हैं। उसके बाद, हम बिल्ड पैरामीटर सेट करके एप्लिकेशन कंटेनर को कॉन्फ़िगर करते हैं क्योंकि हमें इसे खींचने के बजाय एक छवि बनाने की आवश्यकता होती है जैसा कि हमने MySQL के साथ किया था। साथ ही, हमें यह भी सेट करना होगा कि एप्लिकेशन कंटेनर MySQL कंटेनर पर निर्भर करता है।


अब हम पूरे प्रोजेक्ट को केवल एक कमांड से चला सकते हैं:


 docker-compose up


MySQL अनुसूचित घटना

यह हिस्सा वैकल्पिक है लेकिन मुझे लगता है कि किसी को भी यह उपयोगी लग सकता है। मैंने संक्षिप्त लिंक की समाप्ति तिथि के बारे में बात की जो उपयोगकर्ता द्वारा परिभाषित या कुछ डिफ़ॉल्ट मान हो सकती है। इस समस्या के लिए, हम अपने डेटाबेस के अंदर एक शेड्यूल्ड ईवेंट सेट कर सकते हैं। यह ईवेंट हर x मिनट में चलेगा और डेटाबेस से किसी भी पंक्ति को हटा देगा जहां समाप्ति तिथि वर्तमान समय से कम है। इतना ही आसान। यह डेटाबेस में कम मात्रा में डेटा पर अच्छी तरह से काम करता है।


अब मैं आपको इस समाधान के साथ कुछ मुद्दों के बारे में चेतावनी देना चाहता हूं।


  • पहला - यह इवेंट डेटाबेस से रिकॉर्ड हटा देगा लेकिन यह कैश से डेटा नहीं हटाएगा। जैसा कि हमने पहले कहा, कैश डेटाबेस के अंदर नहीं दिखेगा अगर वह वहां मिलान करने वाला डेटा ढूंढ सकता है। इसलिए भले ही डेटा अब डेटाबेस में मौजूद नहीं है क्योंकि हमने इसे हटा दिया है, फिर भी हम इसे कैशे से प्राप्त कर सकते हैं।
  • दूसरा - मेरी उदाहरण स्क्रिप्ट में, मैंने उस घटना को हर 2 मिनट में चलाने के लिए सेट किया है। यदि हमारा डेटाबेस बहुत बड़ा हो जाता है तो ऐसा हो सकता है कि ईवेंट अपने शेड्यूलिंग अंतराल के भीतर निष्पादन समाप्त नहीं करता है, परिणाम एक साथ निष्पादित होने वाले ईवेंट के कई उदाहरण हो सकते हैं।


निष्कर्ष

मुझे उम्मीद है कि इस पोस्ट ने आपको यूआरएल शॉर्टनर सेवा बनाने के बारे में सामान्य विचार प्राप्त करने में थोड़ी मदद की है। आप इस विचार को ले सकते हैं और इसे सुधार सकते हैं। कुछ नई कार्यात्मक आवश्यकताओं को लिखें और उन्हें लागू करने का प्रयास करें। यदि आपके कोई प्रश्न हैं, तो आप उन्हें इस पोस्ट के तहत पोस्ट कर सकते हैं।