माइक्रोसर्विसेज आर्किटेक्चर में सागा पैटर्न का कार्यान्वयन

समस्याओं को खत्म करने के लिए हमारे साधन का प्रयास करें

माइक्रोसर्विसेज आर्किटेक्चर में सागा पैटर्न का कार्यान्वयन

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

  • क्या आपके पास अपनी सेवा का एक भी उदाहरण है?
  • क्या आपके पास एक ही डेटाबेस (या स्कीमा) है?
  • क्या सेवाओं के बीच संचार समकालिक है?

उत्तर देने के लिए बहुत सारे प्रश्न हैं, लेकिन इस पोस्ट में मैं आपको एक साधारण माइक्रोसर्विस आर्किटेक्चर दिखाऊंगा जो पुस्तक के आधार पर पैटर्न का अनुपालन करता है माइक्रोसर्विसेज पैटर्न द्वारा क्रिस रिचर्डसन .

मुख्य विचार, मेरे उदाहरण में, मैकपासाओ के लिए एक प्रबंधन सॉफ्टवेयर बनाना है, मेरा काल्पनिक फास्ट फूड :-D। निम्नलिखित, एक प्रारंभिक डोमेन आधारित विश्लेषण:



नेटगियर ac750 वाईफाई रेंज एक्सटेंडर सेटअप बिना wps
  • आदेश प्रबंधन
  • रसोई प्रबंधन
  • वितरण प्रबंधन

NS आदेश प्रबंधन हैमबर्गर ऑर्डर का प्रबंधन करता है, रसोई प्रबंधन रसोई के काम का प्रबंधन करता है (जैसे: हैमबर्गर खाना बनाना या फ्रिज प्रबंधन), वितरण प्रबंधन हैम्बर्गर की डिलीवरी का प्रबंधन करता है। इसलिए मुझे कम से कम तीन अलग-अलग सेवाओं की आवश्यकता है, प्रत्येक का अपना डेटाबेस है, फिर प्रत्येक सेवा को एक दूसरे के साथ संवाद करने की आवश्यकता है। इस परिदृश्य में अन्य पाँच घटकों की आवश्यकता है:

  • आदेश डेटाबेस
  • रसोई डेटाबेस
  • वितरण डेटाबेस
  • संदेश सेवा
  • गेटवे एपीआई

माइक्रोसर्विस आर्किटेक्चर में एपीआई गेटवे, मैसेजिंग सर्विस और डेटाबेस प्रति सेवा सामान्य पैटर्न हैं जिनका उपयोग बहुत सारी समस्याओं को हल करने के लिए किया जाता है, उदाहरण के लिए:

  • संदेश सेवा : सेवाएं अक्सर कई अनुरोधों को संभालने के लिए सहयोग करती हैं, इसलिए उन्हें एक अंतर-प्रक्रिया संचार प्रोटोकॉल का उपयोग करना चाहिए। अधिक विशेष रूप से एक अतुल्यकालिक संदेश प्रणाली।
  • प्रति सेवा डेटाबेस : सेवा का डेटाबेस ढीला युग्मन सुनिश्चित करने के लिए कार्यान्वयन का हिस्सा होना चाहिए ताकि इसे स्वतंत्र रूप से विकसित, तैनात और बढ़ाया जा सके।
  • गेटवे एपीआई : एक माइक्रोसर्विस आर्किटेक्चर में सेवाओं, प्रोटोकॉल, पते, बंदरगाहों, सुरक्षा नीतियों, अतिरेक नीतियों आदि के लिए बहुत सारे हैं, एपीआई गेटवे पैटर्न इस समस्या को हल करने की कोशिश करता है, यह ग्राहकों को सभी सूचीबद्ध पहलुओं का प्रबंधन करने के लिए एक एकल प्रवेश बिंदु देता है और अधिक।

यह छवि का शीर्षक है

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

यह छवि का शीर्षक है

मैं उपयोग की गई आंतरिक वास्तुकला की व्याख्या के लिए एकल माइक्रोसर्विस का विवरण दिखाऊंगा, वितरण सेवा . डिलीवरी की स्थिति की निगरानी के लिए इसमें एक एकल एपीआई है, यह परिभाषित करता है a इनबाउंड पोर्ट IDeliveryAPI :

public interface IDeliveryApi { @ApiOperation(value = 'View delivery status', response = DeliveryDTO.class,responseContainer = 'list') @RequestMapping(value = 'status', produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET) @ResponseBody List status(); }

कक्षा डिलिवरी एपीआई एक इनबाउंड एडेप्टर :

@RestController @RequestMapping('/delivery/') @Api(tags = 'DeliveryServices') public class DeliveryApi implements IDeliveryApi { @Autowired private DeliveryService deliveryService; @Override public List status() { return deliveryService.getAll(); } }

कक्षा वितरण सेवा का प्रतिनिधित्व करता है व्यापार का तर्क :

@Service public class DeliveryService { @Autowired private DeliveryRepository deliveryRepository; @Autowired private DozerBeanMapper dozerBeanMapper; public List getAll() { List deliveryList =deliveryRepository.findAll(); List res=null; if(deliveryList!=null) { res=new ArrayList(); for(Delivery delivery:deliveryList) { DeliveryDTO deliveryDTO=dozerBeanMapper.map(delivery,DeliveryDTO.class); res.add(deliveryDTO); } } return res; } }

अंतरपटल आईडी डिलीवरी प्रकाशक एक आउटबाउंड पोर्ट :

मिनीक्राफ्ट अकाउंट कैसे रिकवर करें
public interface IDeliveryPublisher { void sendToOrderCallback(OrderDTO orderDTO) throws JsonProcessingException; }

कक्षा वितरण प्रकाशक एक आउटबाउंड एडाप्टर :

@Service public class DeliveryPublisher implements IDeliveryPublisher { @Autowired private ObjectMapper objectMapper; @Autowired private KafkaTemplate kafkaTemplate; @Override public void sendToOrderCallback(OrderDTO orderDTO) throws JsonProcessingException { kafkaTemplate.send(TOPIC_ORDER_CALLBACK,objectMapper.writeValueAsString(orderDTO)); } }

प्रत्येक माइक्रोसर्विस (मेरे उदाहरण में) में उच्च सुनिश्चित करने के लिए आंतरिक रूप से आर्किटेक्चर की यह शैली है ढीला युग्मन सॉफ्टवेयर परतों के बीच। लेकिन यह केवल एक एकल माइक्रोसर्विस की आंतरिक वास्तुकला है, यह संभव है कि अन्य माइक्रोसर्विसेज a . का उपयोग करें बहुस्तरीय उदाहरण के लिए, वास्तुकला शैली।

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

एक्रोपोलिस (एक्रो)

संपूर्ण आर्किटेक्चर देखने के लिए, मैं नीचे सूचीबद्ध docker-compose.yml (docker app) का उपयोग करता हूं:

version: '3.2' services: order-service: image: paspaola/order-service:0.0.1 ports: - 8090:8090 depends_on: - mongodb-order - kafkabroker networks: - mcpaspao kitchen-service: image: paspaola/kitchen-service:0.0.1 ports: - 8080:8080 depends_on: - mongodb-kitchen - kafkabroker networks: - mcpaspao delivery-service: image: paspaola/delivery-service:0.0.1 ports: - 8070:8070 depends_on: - mongodb-delivery - kafkabroker networks: - mcpaspao mongodb-delivery: image: mongo:3.4.22-xenial ports: - 27017:27017 networks: - mcpaspao mongodb-order: image: mongo:3.4.22-xenial ports: - 27018:27017 networks: - mcpaspao mongodb-kitchen: image: mongo:3.4.22-xenial ports: - 27019:27017 networks: - mcpaspao kafkabroker: image: paspaola/kafka-mcpaspao ports: - 2181:2181 - 9092:9092 environment: - KAFKA_ADVERTISED_LISTNERS=${advertised.addr} networks: - mcpaspao kong-mcpaspao: image: paspaola/kong-mcpaspao:0.0.1 ports: - 8000:8000 - 8443:8443 - 8001:8001 - 8444:8444 networks: - mcpaspao depends_on: - delivery-service - kitchen-service - order-service networks: mcpaspao:

ऊपर की बड़ी तस्वीर की तरह, तीन सेवाएं और तीन डेटाबेस हैं, फिर काफ्का ब्रोकर है, एक व्यक्तिगत छवि जो पहले से ही सभी आवश्यक विषयों पर है:

  • आदेश सेवा
  • आदेशसेवाकॉलबैक
  • रसोई सेवा
  • वितरण सेवा

काफ्का कंटेनर में ज़ूकीपर का एक उदाहरण भी है, जिसे काफ्का शुरू करने की आवश्यकता है, आप पढ़ सकते हैं कि इसे कैसे बनाया जाए यहां .

अंतिम घटक एपीआई गेटवे है, काँग : क्लासिक इंस्टॉलेशन जैसे डेटाबेस का उपयोग करता है पोस्टग्रेस्क्ल , लेकिन यह भी संभव है (विकास के उपयोग के लिए) कोंग के सरल विन्यास के बाद एक घोषणात्मक तरीके से कोंग शुरू करने के लिए कोंग.वाईएमएल :

_format_version: '1.1' services: - name: order-service url: http://order-service:8090 routes: - name: order-service paths: - /order-service - name: kitchen-service url: http://kitchen-service:8080 routes: - name: kitchen-service paths: - /kitchen-service - name: delivery-service url: http://delivery-service:8070 routes: - name: delivery-service paths: - /delivery-service plugins: - name: request-transformer service: kitchen-service config: add: headers: - x-forwarded-prefix:/kitchen-service - name: request-transformer service: order-service config: add: headers: - x-forwarded-prefix:/order-service - name: request-transformer service: delivery-service config: add: headers: - x-forwarded-prefix:/delivery-service

इस उदाहरण में मैं मुख्य पहलू पर भ्रमित होने से बचने के लिए बिना किसी प्रमाणीकरण और प्राधिकरण सेवा या सेवा प्रतिकृति या सेवा खोज आदि के सबसे सरल तरीके से एपीआई गेटवे का उपयोग कर रहा हूं: का कार्यान्वयन कोरियोग्राफी सागा पैटर्न .

प्रोजेक्ट बनाने के लिए, आप उपयोग कर सकते हैं मावेन और फिर मैन्युअल रूप से हर सेवा शुरू करें, या आप मल्टीस्टेज डॉकरफाइल के साथ सब कुछ बना सकते हैं (आपको सक्षम करना होगा प्रायोगिक विशेषताएं डॉकर 19.x पर):

docker buildx build --target=order-service -t paspaola/order-service:0.0.1 --load . && docker buildx build --target=kitchen-service -t paspaola/kitchen-service:0.0.1 --load . && docker buildx build --target=delivery-service -t paspaola/delivery-service:0.0.1 --load . && docker buildx build --target=kong-mcpaspao -t paspaola/kong-mcpaspao:0.0.1 --load .

और फिर कमांड से शुरू करें:

docker app render -s advertised.addr='your docker host ip' mcpaspao.dockerapp| docker-compose -f - up

यह परीक्षण करने का समय है!

स्वैगर यूजर इंटरफेस का उपयोग करके आप सत्यापित कर सकते हैं कि प्रत्येक माइक्रोसर्विस चालू है:

अब मुझे हैमबर्गर चाहिए !!! किचन को कुछ हैमबर्गर चाहिए, फ्रिज खाली है, इसलिए (आपको इंस्टॉल करना होगा .) जेक्यू ):

curl -X POST 'http://localhost:8000/kitchen-service/kitchen/add?hamburgerType=KOBE&quantity=2' -H 'accept: application/json'|jq -C && curl -X GET 'http://localhost:8000/kitchen-service/kitchen/status' -H 'accept: application/json'|jq -C

मैंने दो हैमबर्गर जोड़े हैं, अब मैं दो हैम्बर्गर के साथ ऑर्डर के लिए अनुरोध करता हूं:

पोस्टफिक्स ट्रांसपोर्ट_मैप्स
printf ' --START-- ' && curl -X POST 'http://localhost:8000/order-service/order/create' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{ 'addressDTO': { 'number': 'string', 'street': 'string' }, 'cookingType': 'BLOOD', 'hamburgerList': [ { 'hamburgerType': 'KOBE', 'quantity': 2 } ], 'price': 10}' |jq -C && printf ' --------- ' && curl -X GET 'http://localhost:8000/order-service/order/view' -H 'accept: application/json'|jq -C && sleep 5 && printf ' --------- ' && curl -X GET 'http://localhost:8000/order-service/order/view' -H 'accept: application/json'|jq -C && sleep 5 && printf ' --------- ' && curl -X GET 'http://localhost:8000/order-service/order/view' -H 'accept: application/json'|jq -C && sleep 5 && printf ' --------- ' && curl -X GET 'http://localhost:8000/order-service/order/view' -H 'accept: application/json'|jq -C && printf ' --------- ' && curl -X GET 'http://localhost:8000/delivery-service/delivery/status' -H 'accept: application/json'|jq -C && printf ' --END-- '

पहले चरण में क्रम चलता है इंतज़ार कर रही स्थिति, फिर खाना बनाना , पैकेजिंग तथा पहुंचा दिया स्थिति। यदि आप स्क्रिप्ट को फिर से चलाते हैं, तो सिस्टम में पर्याप्त हैमबर्गर नहीं हैं और अगला क्रम स्थिति में होगा इंतज़ार कर रही और फिर निरस्त किया गया .

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

#माइक्रोसर्विसेज #स्प्रिंग-बूट #डॉकर #डेवोप्स

यह सभी देखें: