Читать книгу Mikroserwisy. Wzorce z przykładami w języku Java - Chris Richardson - Страница 5

Spis treści

Оглавление

przedmowa

podziękowania

o książce

o autorze

o ilustracji na okładce

1. Ucieczka z monolitycznego piekła

1.1. Powolny marsz w kierunku monolitycznego piekła

1.1.1. Architektura aplikacji FTGO

1.1.2. Zalety architektury monolitycznej

1.1.3. Życie w monolitycznym piekle

Kompleksowość przeraża deweloperów

Rozwój jest powolny

Ścieżka od zatwierdzenia do wdrożenia jest długa i mozolna

Skalowanie jest trudne

Dostarczanie niezawodnego monolitu jest wyzwaniem

Blokada w coraz bardziej przestarzałym stosie technologicznym

1.2. Dlaczego ta książka jest dla ciebie odpowiednia

1.3. Czego się nauczysz z tej książki?

1.4. Architektura mikroserwisowa na ratunek

1.4.1. Sześcian skal i mikroserwisy

Skalowanie w osi X równoważy obciążenia dotyczące żądań między wiele instancji

Skalowanie w osi Z trasuje żądania na podstawie atrybutu żądania

Skalowanie w osi Y funkcjonalnie rozkłada aplikację na usługi

1.4.2. Mikroserwisy jako forma modułowości

1.4.3. Każda usługa ma własną bazę danych

1.4.4. Architektura mikroserwisowa FTGO

1.4.5. Porównanie architektury mikroserwisowej i SOA

1.5. Zalety i wady architektury mikroserwisowej

1.5.1. Zalety architektury mikroserwisowej

Umożliwianie ciągłego dostarczania i wdrażania dużych, złożonych aplikacji

Każda usługa jest mała i łatwa w utrzymaniu

Usługi są niezależnie skalowalne

Lepsza izolacja błędów

Łatwe eksperymentowanie i wdrażanie nowych technologii

1.5.2. Wady architektury mikroserwisowej

Znalezienie odpowiednich usług jest trudne

Systemy rozproszone są złożone

Wdrażanie funkcjonalności obejmujących wiele usług wymaga starannej koordynacji

Decyzja o przyjęciu jest trudna

1.6. Język wzorców architektury mikroserwisowej

1.6.1. Architektura mikroserwisowa nie jest złotym środkiem

1.6.2. Wzorce i języki wzorców

Wzorce powiązane: pięć różnych rodzajów relacji

1.6.3. Omówienie języka wzorców architektury mikroserwisowej

Wzorce do dekompozycji aplikacji na usługi

Wzorce komunikacyjne

Wzorce spójności danych do wdrażania zarządzania transakcjami

Wzorce odpytywania danych w architekturze mikroserwisowej

Wzorce wdrażania usług

Wzorce obserwowalności zapewniają wgląd w zachowanie aplikacji

Wzorce automatycznego testowania usług

Wzorce do obsługi potrzeb przekrojowych

Wzorce bezpieczeństwa

1.7. Poza mikroserwisy: proces i organizacja

1.7.1. Tworzenie oprogramowania i organizacja dostarczania

1.7.2. Proces tworzenia i dostarczania oprogramowania

1.7.3. Ludzka strona wprowadzania mikroserwisów

2. Strategie dekompozycyjne

2.1. Czym dokładnie jest architektura mikroserwisowa?

2.1.1. Czym jest architektura oprogramowania i dlaczego ma ona znaczenie?

Definicja architektury oprogramowania

Model perspektyw „4+1” w architekturze oprogramowania

Dlaczego architektura jest ważna

2.1.2. Przegląd stylów architektonicznych

Styl: architektura warstwowa

Styl: architektura heksagonalna

2.1.3. Architektura mikroserwisowa jest stylem architektonicznym

Co to jest usługa?

Czym są luźne powiązania?

Rola współdzielonych bibliotek

Rozmiar usługi jest w zasadzie nieważny

2.2. Definiowanie architektury mikroserwisowej aplikacji

2.2.1. Identyfikowanie operacji systemu

Tworzenie wysokopoziomowego modelu domeny

Definiowanie operacji systemu

2.2.2. Definiowanie usług z zastosowaniem wzorca dekompozycji według zdolności biznesowych

Zdolności biznesowe określają, co robi organizacja

Identyfikowanie zdolności biznesowych

Od zdolności biznesowych do usług

2.2.3. Definiowanie usług z zastosowaniem dekompozycji według wzorca subdomeny

2.2.4. Wytyczne dotyczące dekompozycji

Zasada pojedynczej odpowiedzialności

Reguła wspólnego domknięcia

2.2.5. Przeszkody w dekompozycji aplikacji na usługi

Opóźnienia sieciowe

Synchroniczna komunikacja międzyprocesowa ogranicza dostępność

Utrzymanie spójności danych w usługach

Uzyskanie spójnego widoku danych

Dekompozycję utrudniają god classes

2.2.6. Tworzenie API usług

Przypisywanie operacji systemu do usług

Określanie API wymaganego do realizowania współpracy między usługami

3. Komunikacja międzyprocesowa w architekturze mikroserwisowej

3.1. Przegląd komunikacji międzyprocesowej w architekturze mikroserwisowej

3.1.1. Style interakcji

3.1.2. Definiowanie API w architekturze mikroserwisowej

3.1.3. Ewolucja API

Użycie semantycznego wersjonowania

Wprowadzanie drobnych, kompatybilnych wstecznie zmian

Wprowadzanie istotnych zmian

3.1.4. Formaty komunikatów

Tekstowe formaty komunikatów

Binarne formaty komunikatów

3.2. Komunikacja z użyciem wzorca synchronicznego zdalnego wywołania procedury

3.2.1. Korzystanie z REST

Model dojrzałości REST

Specyfikowanie REST API

Wyzwania związane z pobieraniem wielu zasobów w jednym żądaniu

Wyzwania związane z mapowaniem operacji na czasowniki HTTP

Zalety i wady REST

3.2.2. Korzystanie z gRPC

3.2.3. Postępowanie w przypadku częściowej awarii z użyciem wzorca bezpiecznika

Tworzenie solidnych proxy RPI

Reagowanie na niedostępne usługi

3.2.4. Użycie wykrywania usług

Wykrywanie usług

Stosowanie wzorców wykrywania usług na poziomie aplikacji

Stosowanie wzorców wykrywania usług na poziomie platformy

3.3. Komunikacja z użyciem wzorca asynchronicznego przesyłania komunikatów

3.3.1. Spojrzenie na przesyłanie komunikatów

O komunikatach

O kanałach komunikatów

3.3.2. Realizacja stylów interakcji za pomocą przesyłania komunikatów

Realizacja żądanie/odpowiedź i asynchroniczne żądanie/odpowiedź

Realizacja powiadomień jednokierunkowych

Realizacja publikuj/subskrybuj

Realizacja publikowanie/asynchroniczna odpowiedź

3.3.3. Tworzenie specyfikacji dla API usługi opartego na przesyłaniu komunikatów

Dokumentowanie operacji asynchronicznych

Dokumentowanie publikowanych zdarzeń

3.3.4. Użycie brokera komunikatów

Przesyłanie komunikatów bez brokera

Przesyłanie komunikatów oparte na brokerze

Realizacja kanałów komunikatów za pomocą brokera

Zalety i wady przesyłania komunikatów przez brokerów

3.3.5. Konkurujący odbiorcy i sortowanie komunikatów

3.3.6. Obsługa zduplikowanych komunikatów

Tworzenie idempotentnej obsługi komunikatów

Śledzenie komunikatów i odrzucanie duplikatów

3.3.7. Komunikaty transakcyjne

Użycie tabeli bazy danych jako kolejki komunikatów

Publikowanie zdarzeń z użyciem wzorca publikatora z przeszukiwaniem

Publikowanie zdarzeń z zastosowaniem wzorca śledzenie dziennika transakcji

3.3.8. Biblioteki i frameworki do przesyłania komunikatów

Proste przesyłanie komunikatów

Publikowanie zdarzeń domenowych

Przesyłanie komunikatów oparte na poleceniu/odpowiedzi

3.4. Użycie asynchronicznego przesyłania komunikatów w celu poprawy dostępności

3.4.1. Komunikacja synchroniczna zmniejsza dostępność

3.4.2. Eliminowanie interakcji synchronicznych

Użycie asynchronicznych stylów interakcji

Replikacja danych

Zakończenie przetwarzania po zwróceniu odpowiedzi

4. Zarządzanie transakcjami z użyciem sag

4.1. Zarządzanie transakcjami w architekturze mikroserwisowej

4.1.1. Potrzeba transakcji rozproszonych w architekturze mikroserwisowej

4.1.2. Problem z rozproszonymi transakcjami

4.1.3. Użycie wzorca sagi do zarządzania spójnością danych

Przykładowa saga: Create Order Saga

Do wycofania zmian sagi wykorzystują transakcje kompensujące

4.2. Koordynowanie sag

4.2.1. Sagi oparte na choreografii

Realizacja Create Order Saga z wykorzystaniem choreografii

Niezawodna komunikacja oparta na zdarzeniach

Zalety i wady sag opartych na choreografii

4.2.2. Sagi oparte na orkiestracji

Realizacja Create Order Saga z wykorzystaniem orkiestracji

Modelowanie orkiestratorów sagi jako maszyn stanów

Orkiestracja sagi i komunikaty transakcyjne

Zalety i wady sag opartych na orkiestracji

4.3. Radzenie sobie z brakiem izolacji

4.3.1. Przegląd anomalii

Utracone aktualizacje

Brudne odczyty

4.3.2. Przeciwdziałania związane z brakiem izolacji

Struktura sagi

Blokada semantyczna

Aktualizacje przemienne

Podejście pesymistyczne

Ponowne odczytanie wartości

Rejestr kroków

Według korzyści

4.4. Projekt usługi Order Service i sagi Create Order Saga

4.4.1. Klasa OrderService

4.4.2. Implementacja Create Order Saga

Orkiestrator CreateOrderSaga

Klasa CreateOrderSagaState

Klasa KitchenServiceProxy

Framework Eventuate Tram Saga

4.4.3. Klasa OrderCommandHandlers

4.4.4. Klasa OrderServiceConfiguration

5. Projektowanie logiki biznesowej w architekturze mikroserwisowej

5.1. Wzorce organizacji logiki biznesowej

5.1.1. Projektowanie logiki biznesowej z użyciem wzorca skryptu transakcji

5.1.2. Projektowanie logiki biznesowej z użyciem wzorca modelu domeny

5.1.3. Domain-Driven Design

5.2. Projektowanie modelu domeny z użyciem wzorca agregatu DDD

5.2.1. Problem z rozmytymi granicami

5.2.2. Agregaty mają wyraźne granice

Agregaty są granicami spójności

Kluczowa jest identyfikacja agregatów

5.2.3. Zasady agregatów

Zasada 1: Odniesienie tylko do korzenia agregatu

Zasada 2: Odniesienia między agregatami muszą korzystać z kluczy głównych

Zasada 3: Jedna transakcja tworzy lub aktualizuje jeden agregat

5.2.4. Ziarnistość agregatu

5.2.5. Projektowanie logiki biznesowej z agregatami

5.3. Publikowanie zdarzeń domenowych

5.3.1. Dlaczego publikować zdarzenia związane ze zmianą stanu?

5.3.2. Czym jest zdarzenie domenowe?

5.3.3. Wzbogacanie zdarzeń

5.3.4. Identyfikowanie zdarzeń domenowych

5.3.5. Generowanie i publikowanie zdarzeń domenowych

Generowanie zdarzeń domenowych

Jak niezawodnie publikować zdarzenia domenowe?

5.3.6. Pobieranie zdarzeń domenowych

5.4. Logika biznesowa Kitchen Service

5.4.1. Agregat Ticket

Struktura klasy Ticket

Zachowanie agregatu Ticket

Usługa domenowa KitchenService

Klasa KitchenServiceCommandHandler

5.5. Logika biznesowa Order Service

5.5.1. Agregat Order

Struktura agregatu Order

Maszyna stanów agregatu Order

Metody agregatu Order

5.5.2. Klasa OrderService

6. Rozwijanie logiki biznesowej za pomocą pozyskiwania zdarzeń

6.1. Wykorzystywanie wzorca pozyskiwania zdarzeń do tworzenia logiki biznesowej

6.1.1. Problemy tradycyjnego utrwalania

Niedopasowanie między modelem obiektowym a relacyjnym

Brak historii agregatu

Wdrożenie dzienników zdarzeń jest uciążliwe i podatne na błędy

Publikowanie zdarzeń jest powiązane z logiką biznesową

6.1.2. Pozyskiwanie zdarzeń

Pozyskiwanie zdarzeń utrwala agregaty korzystając ze zdarzeń

Zdarzenia reprezentują zmiany stanu

Metody agregatów dotyczą zdarzeń

Agregat Order wykorzystujący pozyskiwanie zdarzeń

6.1.3. Obsługa jednoczesnych aktualizacji z użyciem optymistycznego blokowania

6.1.4. Pozyskiwanie zdarzeń i publikowanie zdarzeń

Użycie przeszukiwania do publikowania zdarzeń

Wykorzystanie śledzenia dziennika transakcji do niezawodnego publikowania zdarzeń

6.1.5. Użycie migawek do poprawy wydajności

6.1.6. Idempotentne przetwarzanie komunikatów

Idempotentne przetwarzanie komunikatów z magazynem zdarzeń opartym na RDBMS

Idempotentne przetwarzanie komunikatów z magazynem zdarzeń opartym na NoSQL

6.1.7. Rozwój zdarzeń domenowych

Ewolucja schematu zdarzeń

Zarządzanie zmianami schematu przez rzutowanie w górę

6.1.8. Zalety pozyskiwania zdarzeń

Niezawodnie publikowanie zdarzeń domenowych

Zachowywanie historii agregatów

Zwykle pomaga uniknąć problemu niedopasowania między modelem relacyjnym a obiektowym

Oferuje programistom maszynę czasu

6.1.9. Wady pozyskiwania zdarzeń

Inny model programowania powodujący wzrost krzywej uczenia się

Złożoność aplikacji opartej na przesyłaniu komunikatów

Ewolucja zdarzeń może być trudna

Usuwanie danych jest trudne

Wykonywanie zapytań do magazynu zdarzeń jest trudne

6.2. Implementowanie magazynu zdarzeń

6.2.1. Jak działa magazyn zdarzeń Eventuate Local

Schemat bazy danych zdarzeń Eventuate Local

Pobieranie zdarzeń przez subskrybowanie brokera zdarzeń Eventuate Local

Przekaźnik zdarzeń Eventuate Local propaguje zdarzenia z bazy danych do brokera komunikatów

6.2.2. Środowisko klienta Eventuate dla Javy

Definiowanie agregatów za pomocą klasy ReflectiveMutableCommandProcessingAggregate

Definiowanie poleceń agregatu

Definiowanie zdarzeń domenowych

Tworzenie, wyszukiwanie i aktualizacja agregatów za pomocą klasy AggregateRepository

Subskrybowanie zdarzeń domenowych

6.3. Łączne używanie sag i pozyskiwania zdarzeń

6.3.1. Realizacja sag opartych na choreografii z wykorzystaniem pozyskiwania zdarzeń

6.3.2. Tworzenie sagi opartej na orkiestracji

Tworzenie orkiestratora sagi podczas korzystania z magazynu zdarzeń opartego na RDMBS

Tworzenie orkiestratora sagi podczas korzystania z magazynu zdarzeń opartego na NoSQL

6.3.3. Tworzenie uczestnika sagi opartej na pozyskiwaniu zdarzeń

Idempotentna obsługa komunikatów poleceń

Atomowe wysyłanie komunikatów zwrotnych

Przykład uczestnika sagi opartej na pozyskiwaniu zdarzeń

6.3.4. Projektowanie orkiestratorów sagi z użyciem pozyskiwania zdarzeń

Utrzymywanie orkiestratora sagi z użyciem pozyskiwania zdarzeń

Niezawodne wysyłanie komunikatów poleceń

Dokładnie jednokrotne przetwarzanie odpowiedzi

7. Implementowanie zapytań w architekturze mikroserwisowej

7.1. Tworzenie zapytań z użyciem wzorca kompozycji API

7.1.1. Operacja zapytania findOrder()

7.1.2. Wzorzec kompozycji API

7.1.3. Implementowanie operacji zapytania findOrder() z wykorzystaniem wzorca kompozycji API

7.1.4. Problemy projektowe związane z wzorcem kompozycji API

Kto powinien odgrywać rolę API Composer?

7.1.5. Wady i zalety wzorca kompozycji API

Zwiększone koszty ogólne

Brak spójności danych transakcyjnych

7.2. Korzystanie z wzorca CQRS

7.2.1. Motywacja do korzystania z CQRS

Realizacja operacji zapytania findOrderHistory()

Wymagające zapytanie dotyczące pojedynczej usługi: findAvailableRestaurants()

Konieczność oddzielenia obowiązków

7.2.2. Przegląd CQRS

CQRS oddziela polecenia od zapytań

CQRS i usługi tylko dla zapytań

7.2.3. Zalety CQRS

7.2.4. Wady CQRS

Bardziej złożona architektura

Konieczność radzenia sobie z opóźnieniem replikacji

7.3. Projektowanie widoków CQRS

7.3.1. Wybór magazynu danych widoku

Bazy danych SQL kontra NoSQL

Wspieranie operacji aktualizacji

7.3.2. Projekt modułu dostępu do danych

Obsługa jednoczesnych aktualizacji

Idempotentne procedury obsługi zdarzeń

Umożliwienie aplikacji klienckiej korzystania z ostatecznie spójnego widoku

7.3.3. Dodawanie i aktualizacja widoków CQRS

Budowanie widoków CQRS z użyciem zarchiwizowanych zdarzeń

Stopniowe budowanie widoków CQRS

7.4. Implementowanie widoku CQRS za pomocą AWS DynamoDB

7.4.1. Moduł OrderHistoryEventHandlers

7.4.2. Modelowanie danych i projektowanie zapytań za pomocą DynamoDB

Projektowanie tabeli ftgo-order-history

Zdefiniowanie indeksu dla zapytania findOrderHistory

Realizacja zapytania findOrderHistory

Stronicowanie wyników zapytania

Aktualizowanie zamówień

Wykrywanie zduplikowanych zdarzeń

7.4.3. Klasa OrderHistoryDaoDynamoDb

Metoda addOrder()

Metoda notePickedUp()

Metoda idempotentUpdate()

Metoda findOrderHistory()

8. Wzorce zewnętrznych API

8.1. Problemy z projektowaniem zewnętrznego API

8.1.1. Problemy z projektowaniem API dla mobilnego klienta FTGO

Gorszy komfort użytkowania spowodowany klientem wykonującym wiele zapytań

Brak enkapsulacji wymaga od programistów frontendu, aby zmieniali swój kod krok w krok ze zmianami w backendzie

Usługi mogą wykorzystywać mechanizmy IPC nieprzyjazne dla klientów

8.1.2. Problemy z projektowaniem API dla innych typów klientów

Problemy z projektowaniem API dla aplikacji webowych

Problemy z projektowaniem API dla aplikacji JavaScript działających w przeglądarce

Projektowanie API dla aplikacji zewnętrznych

8.2. Wzorzec bramy API

8.2.1. Wzorzec bramy API

Przekierowywanie żądań

Kompozycja API

Translacja protokołów

Brama API oferuje każdemu klientowi specyficzne API

Implementowanie funkcji brzegowych

Architektura bramy API

Model własności bramy API

Korzystanie z wzorca Backends for Frontends

8.2.2. Zalety i wady bramy API

Zalety bramy API

Wady bramy API

8.2.3. Netflix jako przykład bramy API

8.2.4. Problemy z projektowaniem bramy API

Wydajność i skalowalność

Użycie abstrakcji programowania reaktywnego

Postępowanie w przypadku częściowej awarii

Bycie dobrym obywatelem w architekturze aplikacji

8.3. Implementowanie bramy API

8.3.1. Skorzystanie z gotowego produktu/usługi bramy API

Brama API AWS

AWS Application Load Balancer

Użycie produktu typu brama API

8.3.2. Opracowanie własnej bramy API

Użycie Netflix Zuul

O Spring Cloud Gateway

Klasa OrderConfiguration

Klasa OrderHandlers

Klasa OrderService

Klasa ApiGatewayApplication

8.3.3. Realizacja bramy API za pomocą GraphQL

Definiowanie schematu GraphQL

Wykonywanie zapytań GraphQL

Podłączanie schematu do danych

Optymalizacja ładowania za pomocą grupowania i buforowania

Integracja serwera Apollo GraphQL z Expressem

Tworzenie klienta GraphQL

9. Testowanie mikroserwisów: część 1

9.1. Strategie testowania w architekturze mikroserwisowej

9.1.1. Testowanie

Pisanie testów automatycznych

Testowanie z użyciem obiektów typu mock i stub

Różne rodzaje testów

Wykorzystanie kwadrantu testowego do kategoryzacji testów

Wykorzystanie piramidy testów jako przewodnika w wysiłkach związanych z testowaniem

9.1.2. Wyzwania związane z testowaniem mikroserwisów

Test kontraktowy ukierunkowany na klienta

Testowanie usług z wykorzystaniem Spring Cloud Contract

Konsumenckie testy kontraktowe API przesyłania komunikatów

9.1.3. Strumień wdrażania

9.2. Pisanie testów jednostkowych dla usługi

9.2.1. Projektowanie testów jednostkowych dla encji

9.2.2. Pisanie testów jednostkowych dla obiektów wartości

9.2.3. Opracowywanie testów jednostkowych dla sag

9.2.4. Pisanie testów jednostkowych dla usług domenowych

9.2.5. Opracowywanie testów jednostkowych dla kontrolerów

9.2.6. Pisanie testów jednostkowych dla procedur obsługi zdarzeń i komunikatów

10. Testowanie mikroserwisów: część 2

10.1. Pisanie testów integracyjnych

10.1.1. Testy integracyjne trwałości

10.1.2. Testy integracyjne interakcji żądanie/odpowiedź opartej na REST

Przykładowy kontrakt dla API REST

Integracyjny test kontraktowy ukierunkowany na klienta dla Order Service

Test integracyjny po stronie konsumenta dla OrderServiceProxy z API Gateway

10.1.3. Testy integracyjne interakcji publikuj/subskrybuj

Kontrakt dla publikowania zdarzenia OrderCreated

Test kontraktowy ukierunkowany na konsumenta dla Order Service

Test kontraktowy po stronie konsumenta dla Order History Service

10.1.4. Kontraktowe testy integracyjne interakcji asynchroniczne żądanie/odpowiedź

Przykładowy kontrakt dla asynchronicznego żądania/odpowiedzi

Kontraktowy test integracyjny po stronie konsumenta dla interakcji asynchroniczne żądanie/odpowiedź

Pisanie testów kontraktowych po stronie dostawcy przeznaczonych do testowania konsumenta w zakresie asynchronicznej interakcji żądanie/odpowiedź

10.2. Tworzenie testów komponentów

10.2.1. Definiowanie testów akceptacyjnych

10.2.2. Pisanie testów akceptacyjnych z użyciem Gherkina

Wykonywanie specyfikacji Gherkina za pomocą Cucumber

10.2.3. Projektowanie testów komponentów

Wewnątrzprocesowe testy komponentów

Pozaprocesowe testowanie komponentu

Jak tworzyć obiekty stubs dla usług w pozaprocesowych testach komponentów

10.2.4. Pisanie testów komponentów dla Order Service z FTGO

Klasa OrderServiceComponentTestStepDefinitions

Uruchamianie testów komponentów

10.3. Pisanie testów end-to-end

10.3.1. Projektowanie testów end-to-end

10.3.2. Pisanie testów end-to-end

10.3.3. Uruchamianie testów end-to-end

11. Opracowywanie usług gotowych do produkcji

11.1. Opracowywanie bezpiecznych usług

11.1.1. Przegląd kwestii bezpieczeństwa w tradycyjnej aplikacji monolitycznej

11.1.2. Realizacja kwestii bezpieczeństwa w architekturze mikroserwisowej

Obsługa uwierzytelniania w bramie API

Obsługa autoryzacji

Użycie JWT do przekazywania tożsamości użytkownika i roli

Użycie OAuth 2.0 w architekturze mikroserwisowej

11.2. Projektowanie konfigurowalnych usług

11.2.1. Użycie konfiguracji zewnętrznej opartej na udostępnianiu

11.2.2. Użycie konfiguracji zewnętrznej opartej na pobieraniu

11.3. Projektowanie obserwowalnych usług

11.3.1. Użycie wzorca API kontroli działania

Realizacja punktu końcowego kontroli działania

Wywołanie punktu końcowego kontroli działania

11.3.2. Stosowanie wzorca agregacji dzienników

W jaki sposób usługa generuje dziennik

Infrastruktura agregacji dzienników

11.3.3. Stosowanie wzorca rozproszonego śledzenia

Użycie biblioteki instrumentacji

Serwer rozproszonego śledzenia

11.3.4. Stosowanie wzorca metryk aplikacji

Zbieranie metryk na poziomie usługi

Dostarczanie metryk do usługi metryk

11.3.5. Stosowanie wzorca śledzenia wyjątków

11.3.6. Stosowanie wzorca dzienników inspekcji

Dodawanie kodu dzienników inspekcji do logiki biznesowej

Użycie programowania aspektowego

Użycie pozyskiwania zdarzeń

11.4. Tworzenie usług za pomocą wzorca szkieletów mikroserwisowych

11.4.1. Korzystanie ze szkieletu mikroserwisowego

11.4.2. Od szkieletu mikroserwisowego do service mesh

12. Wdrażanie mikroserwisów

12.1. Wdrażanie usług jako pakietów specyficznych dla języka

12.1.1. Zalety wzorca Usługa jako pakiet specyficzny dla języka

Szybkie wdrażanie

Efektywne wykorzystanie zasobów

12.1.2. Wady wzorca Usługa jako pakiet specyficzny dla języka

Brak enkapsulacji stosu technologicznego

Brak możliwości ograniczenia zasobów zużywanych przez instancję usługi

Brak izolacji podczas uruchamiania wielu instancji usługi na tej samej maszynie

Automatyczne określenie miejsca umieszczenia instancji usługi jest trudne

12.2. Wdrażanie usług z użyciem wzorca usługi jako maszyny wirtualnej

12.2.1. Zalety wdrażania usług jako maszyn wirtualnych

Obraz maszyny wirtualnej hermetyzuje stos technologiczny

Instancje usług są izolowane

Wykorzystanie wyrafinowanej infrastruktury chmurowej

12.2.2. Wady wdrażania usług jako maszyn wirtualnych

Mniej wydajne wykorzystanie zasobów

Wolne wdrożenia

Narzut związany z administracją systemem

12.3. Wdrażanie usług za pomocą wzorca usługi jako kontenera

12.3.1. Wdrażanie usług za pomocą Dockera

Budowanie obrazu Dockera

Wysyłanie obrazu Dockera do rejestru

Uruchamianie kontenera Dockera

12.3.2. Zalety wdrażania usług jako kontenerów

12.3.3. Wady wdrażania usług jako kontenerów

12.4. Wdrażanie aplikacji FTGO za pomocą Kubernetesa

12.4.1. Kubernetes

Architektura Kubernetesa

Kluczowe pojęcia Kubernetesa

12.4.2. Wdrażanie Restaurant Service w Kubernetesie

Tworzenie service w Kubernetesie

Wdrażanie bramy API

12.4.3. Wdrożenia bez przestojów

12.4.4. Użycie service mesh w celu oddzielenia wdrożenia od wydania

Service mesh Istio

Wdrażanie usługi za pomocą Istio

Tworzenie reguł routingu do wersji v1

Wdrażanie wersji 2 Consumer Service

Przekierowywanie części testowego ruchu do wersji 2

Kierowanie produkcyjnego ruchu do wersji 2

12.5. Wdrażanie usług za pomocą wzorca wdrożenia bezserwerowego

12.5.1. Bezserwerowe wdrażanie za pomocą AWS Lambda

12.5.2. Tworzenie funkcji lambda

12.5.3. Wywoływanie funkcji lambda

Obsługa żądań HTTP

Obsługa zdarzeń generowanych przez usługi AWS

Definiowanie zaplanowanych funkcji lambda

Wywoływanie funkcji lambda za pomocą żądania usługi sieciowej

12.5.4. Zalety użycia funkcji lambda

12.5.5. Wady użycia funkcji lambda

12.6. Wdrażanie usługi RESTful z użyciem AWS Lambda i AWS Gateway

12.6.1. Projekt AWS Lambda wersji Restaurant Service

Klasa FindRestaurantRequestHandler

Wstrzykiwanie zależności z użyciem klasy AbstractAutowiringHttpRequestHandler

Klasa AbstractHttpHandler

12.6.2. Pakowanie usługi jako pliku ZIP

12.6.3. Wdrażanie funkcji lambda z użyciem frameworka Serverless

13. Refaktoryzacja do mikroserwisów

13.1. Refaktoryzacja do mikroserwisów

13.1.1. Dlaczego warto refaktoryzować monolit?

13.1.2. Duszenie monolitu

Szybkie i częste prezentowanie wartości dodanej

Minimalizacja zmian w monolicie

Techniczne aspekty infrastruktury wdrożeniowej: nie potrzebujemy wszystkiego od razu

13.2. Strategie refaktoryzacji monolitu do mikroserwisów

13.2.1. Realizacja nowych funkcjonalności jako usług

Integracja nowej usługi z monolitem

Kiedy zaimplementować nową funkcjonalność jako usługę

13.2.2. Oddzielanie warstwy prezentacji od backendu

13.2.3. Wyodrębnianie zdolności biznesowych do usług

Podział modelu domeny

Refaktoryzacja bazy danych

Replikowanie danych w celu uniknięcia rozległych zmian

Jakie usługi wyodrębniać i kiedy

13.3. Projektowanie, w jaki sposób usługa i monolit będą współpracować

13.3.1. Projektowanie kodu integrującego

Projektowanie API kodu integrującego

Wybór stylu interakcji i mechanizmu IPC

Projektowanie Anti-Corruption Layer

Jak monolit publikuje i subskrybuje zdarzenia domenowe

13.3.2. Utrzymywanie spójności danych w usłudze i monolicie

Wyzwanie związane ze zmianą monolitu, aby wspierał transakcje kompensujące

Sagi nie zawsze wymagają od monolitu wspierania transakcji kompensujących

Określanie kolejności wyodrębniania usług w celu uniknięcia konieczności implementacji transakcji kompensujących w monolicie

13.3.3. Obsługa uwierzytelniania i autoryzacji

LoginHandler monolitu ustawia plik cookie USERINFO

Brama API mapuje plik cookie USERINFO na nagłówek Authorization

13.4. Wdrażanie nowej funkcjonalności jako usługi: obsługa niezrealizowanych zamówień

13.4.1. Projekt Delayed Delivery Service

13.4.2. Projektowanie kodu integrującego dla Delayed Delivery Service

Pobieranie informacji kontaktowych klienta z wykorzystaniem CustomerContactInfoRepository

Publikowanie i pobieranie zdarzeń domenowych Order i Restaurant

13.5. Rozbijanie monolitu: wyodrębnianie zarządzania dostawami

13.5.1. Przegląd istniejącej funkcjonalności związanej z zarządzaniem dostawami

13.5.2. Przegląd Delivery Service

13.5.3. Projekt modelu domeny Delivery Service

Określenie encji i ich pól, które są częścią zarządzania dostawami

Decydowanie, które dane przenieść do Delivery Service

Projekt logiki domeny Delivery Service

13.5.4. Projekt kodu integrującego Delivery Service

Projekt API Delivery Service

W jaki sposób Delivery Service będzie uzyskiwał dostęp do danych monolitu FTGO

W jaki sposób monolit FTGO będzie uzyskiwał dostęp do danych Delivery Service?

13.5.5. Dostosowanie monolitu FTGO do współpracy z Delivery Service

Definiowanie interfejsu DeliveryService

Refaktoryzacja monolitu w celu wywoływania interfejsu DeliveryService

Implementacja interfejsu DeliveryService

Przełączanie funkcjonalności

Przypisy

Mikroserwisy. Wzorce z przykładami w języku Java

Подняться наверх