Architektura mikrousług - szybki przewodnik

Mikrousługi to metodologia tworzenia aplikacji oparta na usługach. W tej metodyce duże aplikacje zostaną podzielone na najmniejsze niezależne jednostki usługowe. Mikrousługi to proces wdrażania architektury zorientowanej na usługi (SOA) polegający na podzieleniu całej aplikacji na zbiór połączonych ze sobą usług, gdzie każda usługa będzie służyć tylko jednej potrzebie biznesowej.

Koncepcja Going Micro

W architekturze zorientowanej na usługi całe pakiety oprogramowania zostaną podzielone na małe, wzajemnie połączone jednostki biznesowe. Każda z tych małych jednostek biznesowych będzie komunikować się ze sobą za pomocą różnych protokołów, aby zapewnić klientowi sukces biznesowy. Teraz pytanie brzmi, czym różni się architektura mikrousług (MSA) od architektury SOA? Jednym słowem, SOA jest wzorcem projektowym, a Microservice to metodologia implementacji implementacji SOA lub możemy powiedzieć, że Microservice to typ SOA.

Poniżej znajduje się kilka zasad, o których musimy pamiętać podczas tworzenia aplikacji zorientowanej na mikrousługi.

  • Independent - Każda mikrousługa powinna być wdrażana niezależnie.

  • Coupling - Wszystkie mikrousługi powinny być luźno powiązane ze sobą tak, aby zmiany w jednej nie wpływały na inne.

  • Business Goal - Każda jednostka usługowa całej aplikacji powinna być najmniejsza i zdolna do realizacji jednego konkretnego celu biznesowego.

Rozważmy przykład portalu zakupów online, aby dogłębnie zrozumieć mikrousługę. Teraz podzielmy cały portal handlu elektronicznego na małe jednostki biznesowe, takie jak zarządzanie użytkownikami, zarządzanie zamówieniami, odprawa, zarządzanie płatnościami, zarządzanie dostawami itp. Jedno udane zamówienie musi przejść przez wszystkie te moduły w określonym czasie. rama. Poniżej przedstawiono skonsolidowany obraz różnych jednostek biznesowych powiązanych z jednym systemem handlu elektronicznego.

Każdy z tych modułów biznesowych powinien mieć własną logikę biznesową i interesariuszy. Komunikują się z oprogramowaniem innych dostawców w przypadku określonych potrzeb, a także między sobą. Na przykład zarządzanie zamówieniami może komunikować się z zarządzaniem użytkownikami, aby uzyskać informacje o użytkowniku.

Biorąc pod uwagę, że prowadzisz portal zakupów online ze wszystkimi wspomnianymi wcześniej jednostkami biznesowymi, potrzebujesz aplikacji na poziomie przedsiębiorstwa składającej się z różnych warstw, takich jak front-end, back-end, baza danych itp. Jeśli Twoja aplikacja nie jest skalowana i całkowicie opracowany w jednym pliku wojennym, będzie nazywany typową monolityczną aplikacją. Według IBM typowa aplikacja monolityczna powinna mieć wewnętrznie następującą strukturę modułową, w której tylko jeden punkt końcowy lub aplikacja będzie odpowiedzialna za obsługę wszystkich żądań użytkowników.

Na powyższym obrazku można zobaczyć różne moduły, takie jak Baza danych do przechowywania różnych użytkowników i danych biznesowych. Na froncie mamy inne urządzenie, na którym zwykle renderujemy dane użytkownika lub dane biznesowe. W środku mamy jeden pakiet, który może być plikiem EAR lub WAR, który można wdrożyć, który akceptuje żądanie od użytkowników końcowych, przetwarza je za pomocą zasobów i przekazuje je z powrotem użytkownikom. Wszystko będzie dobrze, dopóki biznes nie zażąda zmian w powyższym przykładzie.

Rozważ następujące scenariusze, w których musisz zmienić aplikację zgodnie z potrzebami biznesowymi.

Jednostka biznesowa wymaga pewnych zmian w module „Wyszukiwanie”. Następnie musisz zmienić cały proces wyszukiwania i ponownie wdrożyć aplikację. W takim przypadku przerzucasz swoje pozostałe jednostki bez żadnych zmian.

Teraz znowu Twoja jednostka biznesowa potrzebuje pewnych zmian w module „Check out”, aby uwzględnić opcję „wallet”. Musisz teraz zmienić swój moduł „Wyewidencjonuj” i ponownie wdrożyć go na serwerze. Zwróć uwagę, że wdrażasz ponownie różne moduły pakietów oprogramowania, a my nie wprowadziliśmy w nich żadnych zmian. Oto koncepcja architektury zorientowanej na usługi, bardziej specyficzna dla architektury mikrousług. Możemy rozwijać naszą monolityczną aplikację w taki sposób, aby każdy moduł oprogramowania zachowywał się jak niezależna jednostka, zdolna do samodzielnej obsługi pojedynczego zadania biznesowego.

Rozważmy następujący przykład.

W powyższej architekturze nie tworzymy żadnego pliku do ucha z kompaktową usługą end-to-end. Zamiast tego dzielimy różne części oprogramowania, udostępniając je jako usługę. Każda część oprogramowania może łatwo komunikować się ze sobą, korzystając z odpowiednich usług. Właśnie dlatego mikrousługi odgrywają wielką rolę w nowoczesnych aplikacjach internetowych.

Porównajmy nasz przykład koszyka w linii mikrousług. Możemy podzielić nasz koszyk na różne moduły, takie jak „Szukaj”, „Filtr”, „Kasa”, „Koszyk”, „Rekomendacja” itp. Jeśli chcemy zbudować portal koszyka, musimy zbudować wyżej wymienione moduły w taki sposób, że mogą się ze sobą łączyć, aby zapewnić Ci dobre wrażenia z zakupów 24x7.

Zalety wady

Poniżej przedstawiono kilka punktów dotyczących zalet korzystania z mikrousług zamiast korzystania z aplikacji monolitycznej.

Zalety

  • Small in size- Mikrousługi to implementacja wzorca projektowego SOA. Zaleca się, aby Twoja usługa była jak najdłuższa. Zasadniczo usługa nie powinna wykonywać więcej niż jednego zadania biznesowego, dlatego będzie oczywiście niewielka i łatwa w utrzymaniu niż jakakolwiek inna monolityczna aplikacja.

  • Focused- Jak wspomniano wcześniej, każda mikrousługa jest zaprojektowana do realizacji tylko jednego zadania biznesowego. Projektując mikrousługę, architekt powinien zwracać uwagę na centralny punkt usługi, czyli o jej dostarczanie. Z definicji jedna mikrousługa powinna mieć charakter pełnego stosu i powinna dostarczać tylko jedną właściwość biznesową.

  • Autonomous- Każda mikrousługa powinna być autonomiczną jednostką biznesową całej aplikacji. W związku z tym aplikacja staje się luźniej powiązana, co pomaga obniżyć koszty utrzymania.

  • Technology heterogeneity- Microservice obsługuje różne technologie do komunikowania się ze sobą w jednej jednostce biznesowej, co pomaga programistom w korzystaniu z właściwej technologii we właściwym miejscu. Wdrażając heterogeniczny system, można uzyskać maksymalne bezpieczeństwo, szybkość i skalowalność systemu.

  • Resilience- Odporność to właściwość izolowania jednostki oprogramowania. Microservice podąża za wysokim poziomem odporności w metodyce budowania, stąd każde niepowodzenie jednej jednostki nie wpływa na cały biznes. Odporność to kolejna właściwość, która wdraża wysoce skalowalny i mniej powiązany system.

  • Ease of deployment- Ponieważ cała aplikacja jest podzielona na małe części, każdy element powinien mieć charakter pełnego stosu. Wszystkie z nich można bardzo łatwo wdrożyć w dowolnym środowisku przy mniejszej złożoności czasowej, w przeciwieństwie do innych monolitycznych aplikacji tego samego rodzaju.

Poniżej przedstawiono kilka punktów dotyczących wad architektury mikrousług.

Niedogodności

  • Distributed system- Ze względu na niejednorodność techniczną, różne technologie będą wykorzystywane do tworzenia różnych części mikrousługi. Do obsługi tego dużego, heterogenicznego rozproszonego oprogramowania potrzebny jest ogromny zestaw wykwalifikowanych specjalistów. Stąd rozproszenie i heterogeniczność jest główną wadą korzystania z mikrousług.

  • Cost - Mikrousługi są kosztowne, ponieważ do różnych zadań biznesowych trzeba utrzymywać różne miejsca na serwerze.

  • Enterprise readiness- Architekturę mikrousług można uznać za konglomerat różnych technologii, ponieważ technologia ewoluuje z dnia na dzień. W związku z tym dość trudno jest przygotować przedsiębiorstwo wykorzystujące mikrousługi do porównania z konwencjonalnym modelem tworzenia oprogramowania.

Mikrousługa przez SOA

W poniższej tabeli wymieniono niektóre funkcje architektury SOA i mikrousług, zwracając uwagę na znaczenie korzystania z mikrousług zamiast architektury SOA.

Składnik SOA Mikrousługi
Wzorzec projektowy SOA to paradygmat projektowania oprogramowania komputerowego, w którym komponenty oprogramowania są wystawiane na zewnątrz w celu wykorzystania w postaci usług. Usługa Micro Service jest częścią architektury SOA. Jest to wyspecjalizowana implementacja SOA.
Zależność Jednostki biznesowe są od siebie zależne. Wszystkie jednostki biznesowe są od siebie niezależne.
Rozmiar Rozmiar oprogramowania jest większy niż oprogramowanie konwencjonalne. Rozmiar oprogramowania jest mały.
Technologia Stos technologii jest mniejszy niż Microservice. Mikrousługi mają niejednorodny charakter, ponieważ do wykonania określonego zadania używane są dokładne technologie. Mikrousługi można uznać za konglomerat wielu technologii.
Autonomia i skupienie Aplikacje SOA są zbudowane do wykonywania wielu zadań biznesowych. Aplikacje mikrousług są zbudowane do wykonywania pojedynczego zadania biznesowego.
Natura Charakter monolityczny. Pełen stos w naturze.
Rozlokowanie Wdrożenie jest czasochłonne. Wdrożenie jest bardzo łatwe. Dzięki temu będzie to mniej czasochłonne.
Opłacalność Bardziej opłacalne. Mniej opłacalne.
Skalowalność Mniej w porównaniu do mikrousług. W pełni skalowane.
Przykład Rozważmy jedną aplikację do rezerwacji CAB online. Jeśli chcemy zbudować tę aplikację przy użyciu SOA, jej jednostki oprogramowania będą -
  • GetPayments And DriverInformation And MappingDataAPI
  • AuthenticateUsersAnd DriversAPI
Jeśli ta sama aplikacja jest zbudowana przy użyciu architektury mikrousług, jej interfejsy API będą -
  • SubmitPaymentsService
  • GetDriverInfoService
  • GetMappingDataService
  • AuthenticateUserService
  • AuthenticateDriverService

Skalowanie to proces dzielenia oprogramowania na różne jednostki. Skalowanie definiuje również pod względem skalowalności. Skalowalność to potencjał umożliwiający wdrożenie bardziej zaawansowanych funkcji aplikacji. Pomaga poprawić bezpieczeństwo, trwałość i łatwość konserwacji aplikacji. Mamy trzy rodzaje procedur skalowania, które są stosowane w branżach. Poniżej przedstawiono różne metodologie skalowania wraz z odpowiadającymi im przykładami z życia wziętymi.

Skalowanie osi X.

Skalowanie w osi X jest również nazywane skalowaniem poziomym. W tej procedurze cała aplikacja jest podzielona na różne części poziome. Zwykle każda aplikacja serwera WWW może mieć ten typ skalowania. Rozważmy normalną architekturę MVC, która jest zgodna ze skalowaniem poziomym, jak pokazano na poniższym rysunku.

Jako przykład możemy rozważyć dowolną aplikację serwletu JSP. W tej aplikacji kontroler kontroluje każde żądanie i generuje widok, komunikując się z modelem w razie potrzeby. Zwykle aplikacje monolityczne stosują tę metodę skalowania. Skalowanie osi X ma bardzo podstawowy charakter i jest bardzo mniej czasochłonne. W tej metodologii jedno oprogramowanie będzie skalowane w zależności od różnych zadań, za które odpowiada jednostka. Np. Kontroler odpowiada za sterowanie przychodzącym i wychodzącym żądaniem, widok odpowiada za reprezentowanie funkcjonalności biznesowej użytkownikom w przeglądarce, natomiast model odpowiada za przechowywanie naszych danych i działa jako baza danych.

Skalowanie osi Y.

Skalowanie osi Y jest również nazywane skalowaniem pionowym, które obejmuje skalowanie na poziomie zasobów. Każdy system DBaaS lub Hadoop można uznać za skalowany w osi Y. W tego typu skalowaniu żądanie użytkowników jest przekierowywane i ograniczane przez implementację pewnej logiki.

Weźmy jako przykład Facebooka. Facebook musi obsłużyć 1,79 miliona użytkowników w każdej sekundzie; stąd kontrolowanie ruchu jest ogromną odpowiedzialnością inżynierów sieci Facebooka. Aby przezwyciężyć jakiekolwiek zagrożenie, stosują skalowanie w osi Y, które obejmuje jednoczesne uruchamianie wielu serwerów z tą samą aplikacją. Teraz, aby kontrolować ten ogromny ruch, Facebook przekierowuje cały ruch z jednego regionu na określony serwer, jak pokazano na obrazku. To przenoszenie ruchu w oparciu o region nazywa się równoważeniem obciążenia w języku architektonicznym.

Ta metoda dzielenia zasobów na małe niezależne jednostki biznesowe jest znana jako skalowanie osi Y.

Skalowanie osi Z.

Skalowanie osi X i Y jest znacznie łatwiejsze do zrozumienia. Jednak jedną aplikację można również skalować na poziomie biznesowym, co nazywa się skalowaniem w osi Z. Poniżej przedstawiono przykład skalowania aplikacji usług taksówkowych w różnych pionach jednostek biznesowych.

Zalety skalowania

  • Cost - Odpowiednie skalowanie oprogramowania zmniejszy koszty utrzymania.

  • Performance - Ze względu na luźne powiązania wydajność odpowiednio skalowanego oprogramowania jest zawsze lepsza niż oprogramowania nieskalowanego.

  • Load distribution - Korzystając z różnych technologii, możemy łatwo utrzymać obciążenie naszego serwera.

  • Reuse - Skalowalność oprogramowania zwiększa również użyteczność oprogramowania.

Microservice wewnętrznie implementuje architekturę SOA. W szerszym sensie możemy go traktować jako podzbiór jednej aplikacji SOA.

Reguła i przepływ pracy

Poniżej przedstawiono zasady, o które należy zadbać przy tworzeniu mikrousługi.

  • High Cohesion- Wszystkie modele biznesowe należy w jak największym stopniu podzielić na najmniejszą część biznesową. Każda usługa powinna być skoncentrowana na wykonywaniu tylko jednego zadania biznesowego.

  • Independent - Wszystkie usługi powinny mieć charakter pełnego stosu i być od siebie niezależne.

  • Business Domain Centric - Oprogramowanie będzie ulegać modularyzacji zgodnie z jednostką biznesową i nie jest oparte na warstwach.

  • Automation- Wdrażanie testów zostanie zautomatyzowane. Spróbuj wprowadzić minimalną interakcję międzyludzką.

  • Observable - Każda usługa będzie miała charakter pełnego stosu i powinna być niezależnie wdrażana i obserwowalna, jak aplikacja korporacyjna.

Zarządzanie zespołem

„Dwie reguły pizzy” to rodzaj reguły, która ogranicza liczbę uczestników w zespole programistów mikrousług. Zgodnie z tą zasadą liczba członków zespołu jednej aplikacji powinna być na tyle mała, aby można było je karmić dwiema pizzami. Ogólnie liczba ta nie powinna być większa niż 8. Ponieważ mikrousługa ma charakter pełnego stosu, zespół ma również charakter pełnego stosu. Aby zwiększyć produktywność, musimy stworzyć jeden zespół składający się maksymalnie z 8 osób, dysponujący wszelkimi rodzajami wiedzy wymaganymi do wykonania usługi.

Zarządzanie zadaniami

Zadanie odgrywa ważną rolę w cyklu życia oprogramowania. Tworzenie aplikacji na dużą skalę można podzielić na kilka małych jednostek zadań. Rozważmy, że musimy stworzyć jedną aplikację, taką jak Facebook. Następnie funkcjonalność „Zaloguj się” można traktować jako zadanie całego procesu kompilacji. Postęp w każdym z tych zadań musi być odpowiednio monitorowany przez wysoko wykwalifikowanych specjalistów. Agile to dobrze znana struktura procesów stosowana w branżach, która zapewnia dobre zarządzanie zadaniami.

Do tej pory dowiedzieliśmy się, czym jest Microservice i jakie są jego podstawowe potrzeby ponad nowoczesną architekturą MVC. W tym rozdziale poznamy różne elementy tej architektury, które są równie ważne dla usługi.

Kategorie usług

Pod nazwą Microservice zakładamy, że będzie to usługa, z której można korzystać za pośrednictwem protokołów HTTP, jednak musimy wiedzieć, jakie usługi można zbudować przy użyciu tej architektury. Poniżej znajduje się lista usług, które można zaimplementować przy użyciu architektury Microservice.

Platform as a Service [PaaS]- W tej architekturze zorientowanej na usługi platforma jest narzędziem, które można dostosować do potrzeb biznesowych. PaaS odgrywa ważną rolę w tworzeniu aplikacji mobilnych. Najlepszym przykładem PaaS jest silnik Google App, w którym Google zapewnia różne przydatne platformy do tworzenia aplikacji. PaaS pierwotnie rozwijał się, aby zapewnić programistom wbudowaną architekturę lub infrastrukturę. Zmniejsza złożoność programowania wyższego poziomu w radykalnie krótszym czasie. Poniżej znajduje się migawka PaaS dostarczonego przez Google.

Software as a Service [SaaS]- Oprogramowanie jako usługa to firma zajmująca się licencjonowaniem oprogramowania, w ramach której oprogramowanie jest hostowane centralnie i licencjonowane na zasadzie subskrypcji. Dostęp do SaaS można uzyskać głównie przez przeglądarkę i jest to bardzo powszechny wzorzec architektury w wielu pionach biznesowych, takich jak zarządzanie zasobami ludzkimi (HRM), planowanie zasobów przedsiębiorstwa (ERP), zarządzanie relacjami z klientami (CRM) itp. Poniższy zrzut ekranu przedstawia przykłady różne SaaS dostarczane przez Oracle.

Infrastructure as a Service [IaaS]- Infrastruktura odgrywa dużą rolę w branży IT. Korzystając z chmury obliczeniowej, niektóre organizacje udostępniają infrastrukturę wirtualną jako swoje usługi. IaaS jest bardzo pomocny w zapewnianiu elastyczności, opłacalności, bezpieczeństwa, wydajności, produktywności itp. W tworzeniu oprogramowania. Amazon EC2 i Microsoft Azure to największe przykłady IaaS. Poniższy obraz przedstawia przykład AWS, w którym centrum danych jest dostarczane jako IaaS.

Data as a Service [DaaS]- Informatyka zajmuje się danymi, a niektórzy czołowi liderzy branży uważają, że dane będą nowym pożywieniem społeczeństwa. DaaS to rodzaj usługi, w której dane są udostępniane konglomeratom biznesowym w celu prowadzenia badań i analiz. DaaS zapewnia prostotę, elastyczność i bezpieczeństwo w warstwie dostępu do danych. Poniżej znajduje się przykład chmury Oracle Data, do której można uzyskać dostęp lub uzyskać licencję na potrzeby własnych potrzeb biznesowych.

Back End as a Service [BaaS]- BaaS jest również znany jako MBaaS, co oznacza mobilne zaplecze jako usługę. W tego typu usługach zaplecze aplikacji zostanie udostępnione jednostkom biznesowym na potrzeby ich własnych przedsięwzięć biznesowych. Wszystkie powiadomienia push, serwisy społecznościowe należą do tego typu usług. Facebook i Twitter to przykłady znanego dostawcy usług BaaS.

Bezpieczeństwo

Jeśli chodzi o obsługę ton danych klientów, bezpieczeństwo odgrywa ważną rolę. Kwestia bezpieczeństwa jest związana z wszelkiego rodzaju usługami dostępnymi na rynku. Niezależnie od używanej chmury - prywatnej, publicznej, hybrydowej itp., Bezpieczeństwo powinno być utrzymywane na wszystkich poziomach. Cały problem dotyczący bezpieczeństwa można ogólnie podzielić na następujące części -

  • Security issue faced by service providers - Z tego typu problemem bezpieczeństwa borykają się dostawcy usług, tacy jak Google, Amazon itp. W celu zapewnienia ochrony bezpieczeństwa konieczne jest sprawdzenie danych klienta, zwłaszcza tych, którzy mają bezpośredni dostęp do podstawowej części chmury.

  • Security issue faced by consumers- Chmura jest przyjazna dla kosztów, dlatego jest szeroko stosowana w różnych branżach. Niektóre organizacje przechowują dane użytkowników w centrach danych innych firm i pobierają je, gdy jest to wymagane. Dlatego obowiązkowe jest utrzymywanie takich poziomów bezpieczeństwa, aby żadne prywatne dane jednego klienta nie były widoczne dla innych użytkowników.

Aby zapobiec wyżej wymienionym problemom związanym z bezpieczeństwem, poniżej przedstawiono niektóre z mechanizmów obronnych stosowanych przez organizacje.

  • Deterrent Control - Poznaj potencjalne zagrożenie w celu ograniczenia cyberataku.

  • Preventive Control - Utrzymuj zasady uwierzytelniania wysokiego poziomu, aby uzyskać dostęp do chmury.

  • Detective Control - Monitoruj swoich użytkowników i wykrywaj potencjalne ryzyko.

  • Corrective Control - Ściśle współpracuj z różnymi zespołami i rozwiąż problemy, które pojawiają się na etapie kontroli detektywa.

Kompozycja oprogramowania oznacza sposób tworzenia oprogramowania. Zasadniczo dotyczy diagramu architektury oprogramowania wysokiego poziomu, w którym różne moduły oprogramowania będą komunikować się dla określonych celów biznesowych. W tym rozdziale poznamy różne wzorce kompozycji oprogramowania, które są szeroko stosowane w organizacjach. W mikrousługach dzielimy każdą funkcję na jeden proces. Każda z tych usług będzie miała charakter niezależny i pełny stos.

Dekompozycja funkcjonalna odgrywa ważną rolę w budowaniu mikrousług. Zapewnia sprawność, elastyczność i skalowalność Twojej aplikacji.

Wzorzec agregatora

Wzorzec agregatora to najprostszy wzorzec sieci Web, który można zaimplementować podczas opracowywania mikrousługi. W tym wzorcu kompozycji prosty moduł sieciowy będzie działał jako moduł równoważenia obciążenia, co oznacza, że ​​będzie wywoływał różne usługi zgodnie z wymaganiami. Poniżej znajduje się diagram przedstawiający prostą aplikację internetową mikrousług z projektem agregatora. Jak widać na poniższej ilustracji, „Agregator” jest odpowiedzialny za wywoływanie różnych usług jedna po drugiej. Jeśli musimy zastosować jakąkolwiek logikę biznesową do wyników usługi A, B i C, możemy zaimplementować logikę biznesową w samym agregatorze.

Agregator może być ponownie wystawiony jako kolejna usługa dla świata zewnętrznego, która może być skonsumowana przez innych w razie potrzeby. Tworząc usługę sieciową wzorców agregatora, musimy pamiętać, że każda z naszych usług A, B i C powinna mieć własne warstwy pamięci podręcznej i powinna mieć charakter pełnego stosu.

Wzorzec proxy

Wzorzec mikrousług proxy to odmiana modelu agregatora. W tym modelu zamiast modułu agregacji użyjemy modułu proxy. Serwis proxy może dzwonić do różnych usług indywidualnie.

We wzorcu proxy możemy zbudować jeden poziom dodatkowego bezpieczeństwa, zapewniając zrzutową warstwę proxy. Ta warstwa działa podobnie do interfejsu.

Łańcuchowy wzór

Jak sama nazwa wskazuje, ten typ wzoru kompozycji będzie podążał za strukturą łańcuchową. Tutaj nie będziemy używać niczego pomiędzy warstwą klienta a usługą. Zamiast tego pozwolimy klientowi komunikować się bezpośrednio z usługami, a wszystkie usługi zostaną połączone w taki sposób, że dane wyjściowe jednej usługi będą danymi wejściowymi następnej usługi. Poniższy obraz przedstawia typową mikrousługę połączonego wzorca.

Jedną z głównych wad tej architektury jest to, że klient będzie blokowany do zakończenia całego procesu. Dlatego zaleca się, aby łańcuch był jak najkrótszy.

Wzorzec mikrousług gałęzi

Mikrousługa gałęzi to rozszerzona wersja wzorca agregatora i wzorca łańcucha. W tym wzorcu projektowym klient może bezpośrednio komunikować się z usługą. Ponadto jedna usługa może jednocześnie komunikować się z więcej niż jedną usługą. Poniżej przedstawiono schematyczne przedstawienie Branch Microservice.

Wzorzec mikrousług rozgałęzienia umożliwia deweloperowi dynamiczne konfigurowanie wywołań usług. Wszystkie zgłoszenia serwisowe będą odbywać się równolegle, co oznacza, że ​​serwis A może wezwać serwis B i C jednocześnie.

Wzorzec współdzielonych zasobów

Wzorzec współdzielonych zasobów jest w rzeczywistości konglomeratem wszystkich typów wzorców wspomnianych wcześniej. W tym wzorcu klient lub moduł równoważenia obciążenia będą bezpośrednio komunikować się z każdą usługą, gdy zajdzie taka potrzeba. Jest to najbardziej efektywny wzorzec projektowy stosowany powszechnie w większości organizacji. Poniżej przedstawiono schematyczną reprezentację wzorca projektowego zasobów współużytkowanych.

W tym rozdziale opracujemy aplikację opartą na CRUD z architekturą SOA. W dalszej części kolejnych rozdziałów podzielimy tę usługę na mikrousługi i poznamy podstawową różnicę między architekturą SOA a mikrousługą.

Konfiguracja i instalacja systemu

W tej sekcji zbudujemy przykładową aplikację CRUD, która zwróci obiekt JSON jako odpowiedź za każdym razem, gdy wywołasz naszą usługę. Wykorzystamy ramy Jersey, aby opracować to samo. Poniżej przedstawiono kroki konfiguracji lokalnego środowiska systemowego.

Tworzenie aplikacji CRUD

Step 1- Będziemy używać NetBeans jako środowiska programistycznego. Pobierz i zainstaluj najnowszą wersję dostępną na oficjalnej stronie NetBeanshttps://netbeans.org/downloads/.

Step 2- Otwórz swoje NetBeans IDE. Przejdź do „Plik -> Nowy projekt”. Pojawi się następujący zrzut ekranu. Wybierz „Maven” jako kategorię i wybierz „Projekt z ArchType” jako projekt i naciśnij Dalej.

Spowoduje to pobranie wszystkich plików jar wymaganych do utworzenia pierwszego projektu Maven i usługi sieci Web RESTful.

Step 3- Po naciśnięciu przycisku Dalej w poprzednim kroku pojawia się następujący zrzut ekranu. Tutaj będziesz musiał określić Archetyp Mavena.

W polu wyszukiwania wyszukaj „Jersey-archType-Webapp (2.16)” i zaznacz pole wyboru „Pokaż starsze”.

Step 4- Po wybraniu tego samego nastąpi przekierowanie do następnego ekranu. Wybierz preferowany słoik z listy i naciśnij Dalej, aby kontynuować.

Step 5- Na tym etapie musisz podać nazwę swojego projektu i jego identyfikator grupy, a także szczegóły pakietu. Po podaniu wszystkich tych informacji naciśnij Zakończ, aby kontynuować.

Step 6- Konfiguracja obszaru roboczego została zakończona. Katalog projektu będzie wyglądał następująco.

Sprawdź folder „Zależności”, a zobaczysz, że Maven automatycznie pobrał wszystkie wymagane pliki jar dla tego projektu.

Step 7- Twój obszar roboczy jest skonfigurowany i możesz zacząć od kodowania. Śmiało i utwórz cztery klasy i pakiety, jak wspomniano na poniższym zrzucie ekranu. Możesz stwierdzić, że MyResource.java jest już utworzony przez Mavena, ponieważ Maven jest wystarczająco inteligentny, aby wykryć, że zamierzasz zbudować własną usługę internetową.

Step 8 - Po wykonaniu powyższego kroku skonstruujemy naszą klasę POJO, czyli UserProfile.java, w następujący sposób.

package com.tutorialspoint.userprofile.Model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class UserProfile {
   private long ProId;
   private String FName;
   private String LName;
   private String Add;
   public UserProfile(){}
   
   public UserProfile(long Proid, String Fname, String Lname,String Add) {
      this.ProId = Proid;
      this.FName = Fname;
      this.LName = Lname;
      this.Add = Add;
   }
   public long getProId() {
      return ProId;
   }
   public void setProId(long ProId) {
      this.ProId = ProId;
   }
   public String getFName() {
      return FName;
   }
   public void setFName(String FName) {
      this.FName = FName;
   }
   public String getLName() {
      return LName;
   }
   public void setLName(String LName) {
      this.LName = LName;
   }
   public String getAdd() {
      return Add;
   }
   public void setAdd(String Add) {
      this.Add = Add;
   }
}

Step 9- Teraz stworzymy naszą klasę Database. Ponieważ jest to część materiału edukacyjnego, nie będziemy używać żadnej bazy danych jako naszej bazy danych. Będziemy używać wbudowanej pamięci Java do pracy jako nasza pamięć tymczasowa. Jak widać w poniższym zestawie kodu, użyjemy MAP jako naszej bazy danych. Wszystkie operacje usługi sieciowej, które wykonujemy, będziemy pracować na tym MAP zdefiniowanym w klasie.

package com.tutorialspoint.userprofile.DAO;

import com.tutorialspoint.userprofile.Model.UserProfile;

import java.util.HashMap;
import java.util.Map;

public class DatabaseClass {
   private static Map<Long,UserProfile> messages = new HashMap<Long,UserProfile>();
   public static Map<Long,UserProfile> getUsers() {
      return messages; 
      // Each time this method will return entire map as an instance of database
   }
}

Step 10- Teraz zbudujmy naszą klasę usług. Śmiało i skopiuj, wklej następujący zestaw kodu w klasie „ProfileService.java”. To jest klasa, w której zadeklarujemy wszystkie nasze metody usług sieciowych, które mają być ujawnione światu zewnętrznemu. Musimy utworzyć jedno odwołanie do naszej DatabaseClass, tak aby nasza tymczasowa baza danych była dostępna w tej klasie.

package com.tutorialspoint.userprofile.service;

import com.tutorialspoint.userprofile.DAO.DatabaseClass;
import com.tutorialspoint.userprofile.Model.UserProfile;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class ProfileService {
   private Map<Long,UserProfile> Userprofiles = DatabaseClass.getUsers();
   
   // Creating some predefine profile and populating the same in the map
   public ProfileService() {
      UserProfile m1 = new UserProfile(1L,"Tutorials1","Point1","TutorialsPoint.com");
      UserProfile m2 = new UserProfile(2L,"Tutorials2","Point2","TutorialsPoint.com2");
      UserProfile m3 = new UserProfile(3L,"Tutorials3","Point3","TutorialsPoint.com3");
      UserProfile m4 = new UserProfile(4L,"Tutorials4","Point4","TutorialsPoint.com4");
      
      Userprofiles.put(1L, m1);
      Userprofiles.put(2L, m2);
      Userprofiles.put(1L, m3);
      Userprofiles.put(2L, m4);
   }
   
   //Method to fetch all profile
   public List<UserProfile> getAllProfile() {
      List<UserProfile> list = new ArrayList<UserProfile>(Userprofiles.values());
      return list;
   }  // Method to fetch only one profile depending on the ID provided
   
   public UserProfile getProfile(long id) {
      return Userprofiles.get(id);
   }  //Method to add profile
   
   public UserProfile addProfile(UserProfile UserProfile) {
      UserProfile.setProId(Userprofiles.size()+1);
      Userprofiles.put(UserProfile.getProId(), UserProfile);
      return UserProfile;
   }  //method to update Profile

   public UserProfile UpdateProfile(UserProfile UserProfile) {
      if(UserProfile.getProId()<=0) { 
         return null;
      } else { 
         Userprofiles.put(UserProfile.getProId(), UserProfile);
         return UserProfile;
      }
   } //method to delete profile
   
   public void RemoveProfile(long Id) {
      Userprofiles.remove(Id);
   }
}

Step 11 - W tym kroku utworzymy naszą klasę zasobów, która zostanie połączona z adresem URL i wywołana zostanie odpowiednia usługa.

package com.tutorialspoint.userprofile.Resource;

import com.tutorialspoint.userprofile.Model.UserProfile;
import com.tutorialspoint.userprofile.service.ProfileService;

import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/Profile")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)

public class ProfileResource {
   ProfileService messageService = new ProfileService();
   
   @GET
   public List<UserProfile> getProfile() {
      return messageService.getAllProfile();
   }

   @GET
   @Path("/{ProID}")
   public UserProfile getProfile(@PathParam("ProID")long Id) {
      return messageService.getProfile(Id);
   }

   @POST
   public UserProfile addProfile(UserProfile profile) {
      return messageService.addProfile(profile);
   }

   @PUT
   @Path("/{proID}")
   public UserProfile UpdateProfile(@PathParam("proID")long Id,UserProfile UserProfile) {
      UserProfile.setProId(Id);
      return messageService.UpdateProfile(UserProfile);
   }
   
   @DELETE
   @Path("/{ProID}")
   public void deleteProfile(@PathParam("ProID")long Id) {
      messageService.RemoveProfile(Id);
   }
}

Step 12- Wyczyść skompiluj projekt i uruchom go. Jeśli wszystko pójdzie dobrze, podczas uzyskiwania dostępu do przeglądarki powinieneś otrzymać następujące dane wyjściowehttp://localhost:8080/UserProfile/webapi/Profile” URL.

Możesz zobaczyć, że różne wpisy są wypełniane przy użyciu reprezentacji XML.

Różne metody można przetestować za pomocą programu Postman, stosując odpowiedni adres URL metody.

@GET method - Poniższy zrzut ekranu pokazuje, w jaki sposób możemy uzyskać pożądany wynik dla żądania get, które zwraca wszystkie dane użytkownika.

@POST- Poniższe żądanie może posłużyć do przetestowania naszej metody Post. Zwróć uwagę, jak proId został wygenerowany automatycznie.

@PUT- Ta metoda zaktualizuje wpisy. Poniższy zrzut ekranu pokazuje, jak Jersey pobiera proId z adresu URL żądania i aktualizuje tę samą odpowiedź profilu użytkownika.

W ten sam sposób możesz sprawdzić inne metody dostępne w twoich usługach internetowych.

W poprzedniej sekcji opracowaliśmy jedną usługę, która ujawni funkcjonalność CRUD. Teraz ilekroć próbujemy zaimplementować tę usługę w naszej aplikacji, musimy stworzyć klienta tej aplikacji i dołączyć go do naszej aplikacji. W tym rozdziale dowiemy się, jak zbudować tę funkcjonalność przy użyciu koncepcji mikrousług. Poniżej znajduje się schematyczne przedstawienie naszej aplikacji zbudowanej przy użyciu powyższych kroków.

Aktor powinien być punktem wyjścia dla naszej usługi. W tym przypadku „ProfileResource.java” pełni rolę aktora. Ta klasa będzie wywoływać różne metody do wykonywania różnych operacji, takich jak dodawanie, aktualizowanie i usuwanie.

Rozkład aplikacji CRUD

Zgodnie z główną zasadą mikrousług, dla każdego modułu musimy mieć tylko jedno zadanie biznesowe, stąd jeden aktor nie powinien odpowiadać za wszystkie cztery funkcjonalności CRUD. Rozważmy następujący przykład, w którym wprowadziliśmy kilka nowych ról, tak aby koncepcyjnie było jasne, że Microservice jest architektoniczną reprezentacją SOA.

„Użytkownik główny” to użytkownik, który komunikuje się z „Kontrolerem aplikacji” w celu zaspokojenia jego potrzeb. „Kontroler aplikacji” to ten, który po prostu dzwoni do różnych „menedżerów zasobów” w zależności od żądania ze strony użytkownika końcowego. „Menedżer zasobów” wykonuje zadanie, które jest wymagane do wykonania. Rzućmy okiem na różne role różnych jednostek aplikacji.

  • End User/Main Users - Prośby o pewne zasoby do kontrolera aplikacji.

  • Application - Odbiera żądanie i przekazuje je do określonego menedżera zasobów.

  • Resource Manager - Wykonuje rzeczywistą pracę polegającą na aktualizowaniu, usuwaniu i dodawaniu użytkowników.

Zobacz, jak całkowita odpowiedzialność jednej klasy jest rozdzielana między różne inne klasy.

W tym rozdziale zbudujemy jedną aplikację mikrousługową, która będzie korzystać z różnych dostępnych usług. Wszyscy wiemy, że mikrousługi nie są opłacalnym sposobem tworzenia aplikacji, ponieważ każda usługa, którą budujemy, będzie miała charakter pełnego stosu. Zbudowanie mikrousługi w środowisku lokalnym wymagałoby zaawansowanej konfiguracji systemu, ponieważ do dalszego działania serwera potrzebne są cztery wystąpienia, tak aby można go było zużyć w określonym momencie. Aby zbudować naszą pierwszą w historii mikrousługę, użyjemy niektórych dostępnych punktów końcowych SOA i będziemy korzystać z tego samego w naszej aplikacji.

Konfiguracja i instalacja systemu

Przed przejściem do etapu budowy odpowiednio przygotuj system. Potrzebujesz publicznych usług internetowych. Możesz łatwo wygooglować to. Jeśli chcesz korzystać z usługi sieciowej SOAP, otrzymasz jeden plik WSDL i stamtąd musisz korzystać z określonej usługi sieciowej. W przypadku usługi REST potrzebujesz tylko jednego łącza, aby korzystać z tego samego. W tym przykładzie zablokujesz trzy różne usługi internetowe „SOAP”, „REST” i „niestandardowe” w jednej aplikacji.

Architektura aplikacji

Stworzysz aplikację Java, korzystając z planu implementacji mikrousług. Utworzysz usługę niestandardową, a dane wyjściowe tej usługi będą działać jako dane wejściowe dla innych usług.

Poniżej przedstawiono kroki, które należy wykonać, aby opracować aplikację mikrousług.

Step 1: Client creation for SOAP service- Dostępnych jest wiele bezpłatnych interfejsów API sieci Web do nauki usługi sieciowej. Na potrzeby tego samouczka skorzystaj z usługi GeoIP „http://www.webservicex.net/.”Plik WSDL znajduje się w następującym odsyłaczu w ich witrynie internetowej „ webservicex.net. Aby wygenerować klienta z tego pliku WSDL, wszystko, co musisz zrobić, to uruchomić następujące polecenie w swoim terminalu.

wsimport http://www.webservicex.net/geoipservice.asmx?WSDL

To polecenie wygeneruje wszystkie wymagane pliki klienta w jednym folderze o nazwie „SEI”, którego nazwa pochodzi od interfejsu punktu końcowego usługi.

Step 2: Create your custom web service- Wykonaj ten sam proces, o którym wspomniano na wcześniejszym etapie tego samouczka, i utwórz oparty na Maven interfejs REST API o nazwie „CustomRest”. Po zakończeniu znajdziesz klasę o nazwie „MyResource.java”. Śmiało i zaktualizuj tę klasę przy użyciu następującego kodu.

package com.tutorialspoint.customrest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("myresource")
public class MyResource {
   @GET
   @Produces(MediaType.TEXT_PLAIN)
   
   public String getIt() {
      return "IND|INDIA|27.7.65.215";
   }
}

Gdy wszystko będzie gotowe, uruchom tę aplikację na serwerze. W przeglądarce powinien pojawić się następujący wynik.

To jest serwer WWW, który po wywołaniu zwraca jeden obiekt tekstowy. Jest to usługa wejściowa, która udostępnia dane wejściowe, które mogą być używane przez inną aplikację do generowania rekordów.

Step 3: Configure another Rest API- Na tym etapie skorzystaj z innej usługi internetowej dostępnej pod adresem services.groupkt.com. Po wywołaniu zwróci to obiekt JSON.

Step 4: Create JAVA application - Utwórz jedną normalną aplikację Java, wybierając „Nowy projekt” -> „Projekt JAVA” i naciśnij Zakończ, jak pokazano na poniższym zrzucie ekranu.

Step 5: Add the SOAP client- W kroku 1 utworzono plik klienta dla usługi sieciowej SOAP. Śmiało i dodaj te pliki klienta do bieżącego projektu. Po pomyślnym dodaniu plików klienta katalog aplikacji będzie wyglądał następująco.

Step 6: Create your main app- Utwórz swoją główną klasę, w której będziesz korzystać ze wszystkich tych trzech usług internetowych. Kliknij prawym przyciskiem myszy projekt źródłowy i utwórz nową klasę o nazwie „MicroServiceInAction.java”. Następnym zadaniem jest wywołanie różnych usług internetowych z tego.

Step 7: Call your custom web service - W tym celu dodaj następujący zestaw kodów, aby zaimplementować wywołanie własnej usługi.

try {
   url = new URL("http://localhost:8080/CustomRest/webapi/myresource");
   conn = (HttpURLConnection) url.openConnection();
   conn.setRequestMethod("GET");
   conn.setRequestProperty("Accept", "application/json");
   
   if (conn.getResponseCode() != 200) {
      throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
   }
   
   BufferedReader br = new BufferedReader(new InputStreamReader(
      (conn.getInputStream())));
   while ((output = br.readLine()) != null) {
      inputToOtherService = output;
   }
   conn.disconnect();

} catch (MalformedURLException e) {
   e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
}

Step 8: Consume SOAP Services- Wygenerowałeś plik klienta, ale nie wiesz, która metoda powinna zostać wywołana w całym pakiecie? W tym celu musisz ponownie odwołać się do WSDL, którego użyłeś do wygenerowania plików klienta. Każdy plik WSDL powinien mieć jedno wyszukiwanie znacznika „wsdl: service” dla tego znacznika. Powinien to być punkt wejścia do tej usługi internetowej. Poniżej znajduje się punkt końcowy usługi tej aplikacji.

Teraz musisz zaimplementować tę usługę w swojej aplikacji. Poniżej znajduje się zestaw kodu Java potrzebnego do zaimplementowania usługi sieciowej SOAP.

GeoIPService newGeoIPService = new GeoIPService();
GeoIPServiceSoap newGeoIPServiceSoap = newGeoIPService.getGeoIPServiceSoap();
GeoIP newGeoIP = newGeoIPServiceSoap.getGeoIP(Ipaddress);  
// Ipaddress is output of our own web service.

System.out.println("Country Name from SOAP Webserivce ---"+newGeoIP.getCountryName());

Step 9: Consume REST web service- Do tej pory dwie usługi zostały zużyte. W tym kroku inna usługa sieciowa REST ze spersonalizowanym adresem URL zostanie wykorzystana przy pomocy Twojej niestandardowej usługi internetowej. Aby to zrobić, użyj następującego zestawu kodu.

String url1="http://services.groupkt.com/country/get/iso3code/";//customizing the Url
url1 = url1.concat(countryCode);

try {
   URL url = new URL(url1);
   HttpURLConnection conn = (HttpURLConnection) url.openConnection();
   conn.setRequestMethod("GET");
   conn.setRequestProperty("Accept", "application/json");
   
   if (conn.getResponseCode() != 200) {
      throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
   }
   
   BufferedReader br = new BufferedReader(new InputStreamReader(
      (conn.getInputStream())));
   while ((output = br.readLine()) != null) {
      System.out.println(output);
   }
   conn.disconnect();

} catch (MalformedURLException e) {
   e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
}

Step 10: Consume all services - Biorąc pod uwagę, że usługa sieciowa „CustomRest” jest uruchomiona i masz połączenie z Internetem, jeśli wszystko zakończy się pomyślnie, to powinna być skonsolidowana klasa główna.

package microserviceinaction;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.StringTokenizer;

import net.webservicex.GeoIP;
import net.webservicex.GeoIPService;
import net.webservicex.GeoIPServiceSoap;

public class MicroServiceInAction {
   static URL url;
   static HttpURLConnection conn;
   static String output;
   static String inputToOtherService;
   static String countryCode;
   static String ipAddress;
   static String CountryName;
   public static void main(String[] args) {
      //consuming of your own web service
      try {
         url = new URL("http://localhost:8080/CustomRest/webapi/myresource");
         conn = (HttpURLConnection) url.openConnection();
         conn.setRequestMethod("GET");
         conn.setRequestProperty("Accept", "application/json");
         
         if (conn.getResponseCode() != 200) {
            throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
         }
         
         BufferedReader br = new BufferedReader(new InputStreamReader(
            (conn.getInputStream())));
         while ((output = br.readLine()) != null) {
            inputToOtherService = output;
         }
         conn.disconnect();
      
      } catch (MalformedURLException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
      
      //Fetching IP address from the String and other information
      StringTokenizer st = new StringTokenizer(inputToOtherService);
      countryCode = st.nextToken("|");
      CountryName = st.nextToken("|");
      ipAddress = st.nextToken("|");
      
      // Call to SOAP web service with output of your web service--- 
      // getting the location of our given IP address
      String Ipaddress = ipAddress;
      GeoIPService newGeoIPService = new GeoIPService();
      GeoIPServiceSoap newGeoIPServiceSoap = newGeoIPService.getGeoIPServiceSoap();
      GeoIP newGeoIP = newGeoIPServiceSoap.getGeoIP(Ipaddress);
      System.out.println("Country Name from SOAP Webservice ---"+newGeoIP.getCountryName());
      
      // Call to REST API --to get all the details of our country
      String url1 = "http://services.groupkt.com/country/get/iso3code/"; //customizing the Url
      url1 = url1.concat(countryCode);
      
      try {
         URL url = new URL(url1);
         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
         conn.setRequestMethod("GET");
         conn.setRequestProperty("Accept", "application/json");
			
         if (conn.getResponseCode() != 200) {
            throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
         }
      
         BufferedReader br = new BufferedReader(new InputStreamReader(
            (conn.getInputStream())));
         while ((output = br.readLine()) != null) {
            System.out.println(output);
         }
      
         conn.disconnect();
      } catch (MalformedURLException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Po uruchomieniu tego pliku w konsoli zobaczysz następujące dane wyjściowe. Udało Ci się stworzyć pierwszą aplikację mikrousługową.