Wzorce Cloud Native
Platformy chmurowe obiecują Świętego Grala: niemal zerowe przestoje działania, nieskończoną skalowalność, krótką pętle zwrotnych informacji, odporność na problemy i kontrolę kosztów. Ale jak to osiągnąć? Stosując podejście cloud-native, programiści mogą budować odporne, zdolne do łatwego dostosowywania się, rozproszone aplikacje w skali internetowej, które obsługują olbrzymie ilości użytkowników i obciążenia danymi. Poznaj te podstawowe wzorce i praktyki, a będziesz gotowy na prosperowanie w dynamicznym, rozproszonym, wirtualnym świecie chmury.
Bazując na 25 latach swojego doświadczenia, Cornelia Davis uczy praktyk i wzorców, które odróżniają
aplikacje cloud-native od innych. Wraz z realistycznymi przykładami i eksperckimi poradami w temacie pracy z aplikacjami, danymi, usługami czy routingiem autorka pokazuje, jak projektować i budować oprogramowanie, które doskonale działa na nowoczesnych platformach chmurowych.
W książce omówiono:
• Cykl życia aplikacji cloud-native
• Zarządzanie konfiguracją na skalę chmury
• Aktualizacje bez przestojów, wersjonowane usługi i równoległe wdrożenia
• Wyszukiwanie usług i dynamiczny routing
• Zarządzanie interakcjami pomiędzy usługami, w tym powtórzenia i bezpieczniki
Publikacja jest przeznaczona dla czytelników posiadających podstawowe umiejętności projektowania oprogramowania i czytania Javy lub podobnego języka.
przedmowa XIII
wstęp XV
podziękowania XVII
o książce XIX
o autorce XXIII
o ilustracji na okładce XXV
Część 1 KONTEKST CLOUD-NATIVE 1
1. Wciąż używasz tego słowa: definiując „cloud‑native” 3
1.1. Wymagania dzisiejszych aplikacji 7
Brak przestojów 7
Skrócone cykle informacji zwrotnej 8
Wsparcie urządzeń mobilnych i wielu urządzeń 8
Połączone urządzenia – tak zwany internet rzeczy 9
Kierowane danymi (data-driven) 9
1.2. Wprowadzenie oprogramowania cloud‑native 10
Definiując cloud‑native 11
Model myślowy dla oprogramowania cloud‑native 13
Oprogramowanie cloud‑native w akcji 19
1.3. Cloud‑native a pokój na świecie 23
Chmura (cloud) a cloud‑native 23
Czym nie jest cloud-native 24
Cloud‑native jest miłe 25
2. Uruchamianie aplikacji cloud-native na produkcji 28
2.1. Przeszkody 29
Płatki śniegu 31
Ryzykowne wdrożenia 32
Zmiana jest wyjątkiem 36
Niestabilność na produkcji 37
2.2. Aktywatory 37
Ciągłe dostarczanie 39
Powtarzalność 43
Bezpieczne wdrożenia 48
Zmiana jest regułą 52
3. Platforma dla oprogramowania cloud-native 56
3.1. Ewolucja platform cloud(-native) 57
Zaczęło się od chmury 58
Sygnał wybierania cloud-native 63
3.2. Podstawowe zasady platformy cloud‑native 63
Po pierwsze, porozmawiajmy o kontenerach 63
Wsparcie dla „ciągle zmieniających się” 65
Wsparcie dla „wysoko rozproszonych” 68
3.3. Kto co robi? 72
3.4. Więcej możliwości platform cloud‑native 74
Platforma wspiera cały cykl życia oprogramowania 74
Bezpieczeństwo, kontrola zmian, compliance (funkcje kontrolne) 78
Kontrola tego, co wchodzi do kontenera 80
Aktualizacje i łatanie podatności 83
Kontrola zmian 85
Część 2 Wzorce cloud -native native 89
4. Zdarzeniowe mikroserwisy: nie tylko żądanie-odpowiedź 91
4.1. Jesteśmy (zwykle) uczeni programowania imperatywnego 92
4.2. Wracamy do przetwarzania zdarzeniowego 94
4.3. Moja globalna książka kucharska 95
Żądanie-odpowiedź 96
Architektura zdarzeniowa 102
4.4. Wprowadzenie CQRS – Command Query Responsibility Segregation 111
4.5. Inne style, podobne wyzwania 114
5. Redundancja aplikacji: skalowanie poziome i bezstanowość 117
5.1. Aplikacje cloud-native mają wiele uruchomionych instancji 119
5.2. Stanowe aplikacje w chmurze 121
Dekompozycja monolitu i powiązanie z bazą danych 121
Słaba obsługa stanu sesji 125
5.3. Sesje HTTP i lepkie sesje 139
5.4. Stanowe usługi i bezstanowe aplikacje 141
Stanowe usługi to usługi wyjątkowe 141
Zmiana aplikacji na bezstanową 143
6. Konfiguracja aplikacji: nie tylko zmienne środowiskowe 149
6.1. Dlaczego w ogóle rozmawiamy o konfiguracji? 150
Dynamiczne skalowanie – zwiększanie i zmniejszanie liczby instancji aplikacji 151
Zmiany infrastruktury powodujące zmiany konfiguracji 151
Aktualizacja konfiguracji aplikacji bez przestoju 152
6.2. Warstwa konfiguracji aplikacji 154
6.3. Wstrzykiwanie wartości systemowych/środowiskowych 159
Zobaczmy to w akcji: używanie zmiennych środowiskowych dla konfiguracji 159
6.4. Wstrzykiwanie konfiguracji aplikacji 168
Wprowadzenie serwera konfiguracji 169
Bezpieczeństwo dostarcza kolejnych wymagań 176
Zobaczmy to w akcji: konfiguracja aplikacji z wykorzystaniem serwera konfiguracyjnego 177
7. Cykl życia aplikacji: uwzględnianie ciągłych zmian 181
7.1. Współczucie dla działu operatorów 183
7.2. Cykl życia jednej aplikacji, cykle życia wielu instancji 184
Aktualizacje blue/green 188
Stopniowa aktualizacja 189
Równoległe wdrożenia 191
7.3. Koordynacja różnych cyklów życia aplikacji 193
7.4. Zobaczmy to w akcji: wymiana poświadczeń a cykl życia aplikacji 197
7.5. Radzenie sobie z efemerycznymi środowiskami uruchomieniowymi 206
7.6. Widoczność stanu cyklu życia aplikacji 208
Zobaczmy to w akcji: węzły stanu zdrowia i sondy 213
7.7. Serverless 217
8. Dostęp do aplikacji: usługi, trasy i wyszukiwanie usług 220
8.1. Abstrakcja usługi 223
Przykład usługi: googlowanie 224
Przykład usługi: nasz agregator blogów 226
8.2. Dynamiczny routing 227
Równoważenie obciążenia po stronie serwera 227
Równoważenie ruchu po stronie klienta 229
Aktualność tras 230
8.3. Wyszukiwanie usług 232
Wyszukiwanie usług w sieci 236
Wyszukiwanie usług z równoważeniem ruchu po stronie klienta 237
Wyszukiwanie usług w Kubernetesie 238
Zobaczmy to w akcji: wykorzystanie wyszukiwania usług 240
9. Redundancja interakcji: powtarzanie i inne pętle sterowania 245
9.1. Powtarzanie żądań 247
Podstawowe powtórzenie żądania 248
Zobaczmy to w akcji: proste powtórzenia 249
Powtórzenia: co może pójść nie tak? 253
Wywoływanie burzy powtórzeń 254
Zobaczmy to w akcji: wywoływanie burzy powtórzeń 255
Unikanie burz powtórzeń: uprzejmi klienci 266
Zobaczmy to w akcji: bycie bardziej uprzejmym klientem 266
Kiedy nie powtarzać 272
9.2. Logika awaryjna 273
Zobaczmy to w akcji: implementacja logiki awaryjnej 274
9.3. Pętle sterowania 280
Zrozumienie typów pętli sterowania 280
Sterowanie pętlą sterowania 281
10. Fasady usług: bezpieczniki (circuit breakers) i bramy API 285
10.1. Bezpieczniki 287
Bezpiecznik w oprogramowaniu 287
Implementacja bezpiecznika 290
10.2. Bramy API 303
Sprawa bramy API w oprogramowaniu cloud-native 305
Topologia bramy API 305
10.3. Service mesh 308
Sidecar 308 Płaszczyzna sterowania 310
11. Rozwiązywanie problemów: odnaleźć igłę w stogu siana 314
11.1. Logowanie aplikacji 315
11.2. Metryki aplikacji 319
Ściąganie metryk z aplikacji cloud-native 321
Wysyłanie metryk z aplikacji cloud-native 323
11.3. Rozproszone śledzenie 326
Ślady w wyjściu usług 330
Składanie śladów za pomocą Zipkina 333
Szczegóły implementacji 338
12. Dane cloud-native: przełamywanie monolitu danych 340
12.1. Każdy mikroserwis potrzebuje pamięci podręcznej 343
12.2. Przejście od żądań i odpowiedzi do zdarzeniowości 346
12.3. Dziennik zdarzeń 349
Zobaczmy to w akcji: implementacja zdarzeniowych mikroserwisów 351
Co nowego w tematach i kolejkach? 365
Zawartość zdarzenia 369
Idempotentność 371
12.4. Event sourcing 372
Dotychczasowa podróż 372
Źródło prawdy 373
Zobaczmy to w akcji: implementacja event sourcingu 376
12.5. Ledwo zadrapaliśmy powierzchnię 379
indeks 381