Mikroserwis Rainbow Rumpus

1. Wprowadzenie

Ostatnia aktualizacja: 6.05.2021

Mikroserwis Tęczowy Rumpus

Czy kiedykolwiek zdarzyło Ci się w walce na śnieżki rzucać śnieżki i rzucać się śnieżkami w inne osoby? Jeśli nie, spróbuj kiedyś! Teraz, zamiast narażać się na fizyczne obrażenia, możesz zbudować małą usługę dostępną w sieci (mikroserwis), która weźmie udział w niezapomnianej walce z innymi mikroserwisami, rzucając tęcze zamiast śnieżek.

Być może zastanawiasz się... Ale w jaki sposób mikroserwis „rzuca” tęcza w innych mikroserwisach? Mikroserwis może otrzymywać żądania sieciowe (zwykle przez HTTP) i zwracać odpowiedzi. Jest tu „menedżer areny” który wyśle do mikroserwisu bieżący stan areny, a mikroserwis odpowie poleceniem, które określa, co należy zrobić.

Oczywiście celem jest zwycięstwo, ale przy okazji dowiesz się, jak tworzyć i wdrażać mikroserwisy w Google Cloud.

Jak to działa

Zbudujesz mikroserwis z dowolną technologią (lub wybierz startery w językach Go, Java, Kotlin, Scala, NodeJS bądź Python), a następnie wdrożysz go w Google Cloud. Po wdrożeniu podasz nam adres URL mikroserwisu, a my dodamy go do areny.

Hala zawiera wszystkich graczy biorących udział w danej bitwie. Tęczowa rumpus będzie miała swoje areny. Każdy gracz reprezentuje mikroserwis, który porusza się wokół i rzuca tęczą w stronę pozostałych graczy.

Mniej więcej raz na sekundę nasz menedżer areny zadzwoni do Twojego mikroserwisu i prześle bieżący stan stadionu (gdzie znajdują się gracze). Mikroserwis odpowie na polecenie, co ma zrobić. Na arenie możesz iść do przodu, skręć w lewo lub w prawo oraz rzucić tęczę. Tęcza przemieszcza się w kierunku, w którym jest zwrócony gracz, maksymalnie trzy przestrzenie. Jeśli tęcza zacznie działać inny zawodnik, rzucający otrzymuje jeden punkt, a zawodnik uderzony traci punkt. Rozmiar hali jest automatycznie dostosowywany do bieżącej liczby graczy.

Tak wygląda dawna arena:

20628e6bd442bd11.png

Przykładowa arena Battle One

Konflikty cykliczne

Na arenie może się zdarzyć, że kilku graczy spróbuje wykonać kolidujące działania. Na przykład dwóch graczy może próbować przejść do tego samego miejsca. W przypadku konfliktu wygrywa mikroserwis z najkrótszym czasem odpowiedzi.

Oglądanie bitwy

Aby zobaczyć, jak Twój mikroserwis radzi sobie w walce, odwiedź naszą arenę.

Battle API

Aby współpracować z naszym menedżerem areny, Twój mikroserwis musi wdrożyć odpowiedni interfejs API, aby mieć dostęp do tych funkcji. Menedżer areny wyśle bieżący stan areny w żądaniu HTTP POST na podany przez Ciebie adres URL w następującej strukturze JSON:

{
  "_links": {
    "self": {
      "href": "https://YOUR_SERVICE_URL"
    }
  },
  "arena": {
    "dims": [4,3], // width, height
    "state": {
      "https://A_PLAYERS_URL": {
        "x": 0, // zero-based x position, where 0 = left
        "y": 0, // zero-based y position, where 0 = top
        "direction": "N", // N = North, W = West, S = South, E = East
        "wasHit": false,
        "score": 0
      }
      ... // also you and the other players
    }
  }
}

Odpowiedź HTTP musi mieć kod stanu 200 (OK) z treścią odpowiedzi zawierającą następny ruch i zakodowaną jako pojedynczy znak wielkiej litery:

F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw

To już wszystko. Zobaczmy, jak wdrożyć mikroserwis w Cloud Run, usłudze Google Cloud do uruchamiania mikroserwisów i innych aplikacji.

2. Logowanie do Google Cloud

Aby wdrożyć mikroserwis w Cloud Run, musisz zalogować się w Google Cloud. Uwzględnimy środki na Twoim koncie – nie musisz podawać danych karty kredytowej. Zwykle użycie konta osobistego (np. gmail.com) zamiast konta G Suite jest zazwyczaj mniej problemów, ponieważ czasami administratorzy G Suite uniemożliwiają użytkownikom korzystanie z niektórych funkcji Google Cloud. Używana konsola powinna też dobrze działać z przeglądarkami Chrome i Firefox, ale w Safari mogą występować problemy.

3. Wdrażanie mikroserwisu

Swój mikroserwis możesz zbudować z dowolną technologią i wdrażać w dowolnym miejscu, o ile jest dostępny publicznie i zgodny z interfejsem Battle API. Dla ułatwienia pomożemy Ci zacząć od przykładowej usługi i wdrożyć ją w Cloud Run.

Wybierz sampel na początek

Jest wiele przykładowych mikroserwisów bitewnych, od których możesz zacząć:

Kotlin i Trzewik wiosenny

Źródło

Kotlin i Micronaut

Źródło

Kotlin i Quarkus

Źródło

Java i Trzewik wiosenny

Źródło

Java i Quarkus

Źródło

Przeczytaj

Źródło

Node.js i Ekspresowa

Źródło

Python i Piersiówka

Źródło

Gdy wybierzesz przykład, od którego chcesz zacząć, kliknij „Wdróż w Cloud Run” przycisk powyżej. Spowoduje to uruchomienie Cloud Shell (internetowej konsoli maszyny wirtualnej w chmurze), w której zostanie sklonowane źródło, a następnie wbudowane w możliwy do wdrożenia pakiet (obraz kontenera Dockera), który następnie zostanie przesłany do Google Container Registry i wdrożony w Cloud Run.

Gdy pojawi się prośba, określ region us-central1.

Zrzut ekranu poniżej przedstawia dane wyjściowe Cloud Shell dotyczące kompilacji i wdrażania mikroserwisów

d88e40430706a32b.png

Sprawdzanie działania mikroserwisu

W Cloud Shell możesz wysłać żądanie do nowo wdrożonego mikroserwisu, zastępując YOUR_SERVICE_URL adresem URL swojej usługi (znajdujący się w Cloud Shell po wierszu „Twoja aplikacja jest teraz aktywna”):

curl -d '{
  "_links": {
    "self": {
      "href": "https://foo.com"
    }
  },
  "arena": {
    "dims": [4,3],
    "state": {
      "https://foo.com": {
        "x": 0,
        "y": 0,
        "direction": "N",
        "wasHit": false,
        "score": 0
      }
    }
  }
}' -H "Content-Type: application/json" -X POST -w "\n" \
  https://YOUR_SERVICE_URL

Powinien wyświetlić się ciąg znaków odpowiedzi F, L, R lub T.

4. Poproś o dołączenie do areny

Aby dołączyć do Tęczowej rumpusa, musisz wejść na arenę. Otwórz plik rainbowrumpus.dev, klikając złączenie na arenie, w której podasz adres URL swojego mikroserwisu.

5. Marka i Wdrażanie zmian

Zanim wprowadzisz zmiany, musisz skonfigurować w Cloud Shell pewne informacje o projekcie GCP i użytym przykładzie. Najpierw wyświetl listę projektów GCP:

gcloud projects list

Prawdopodobnie masz tylko 1 projekt. Skopiuj element PROJECT_ID z pierwszej kolumny i wklej go do tego polecenia (zastępując YOUR_PROJECT_ID swoim identyfikatorem projektu), aby ustawić zmienną środowiskową, której użyjemy w późniejszych poleceniach:

export PROJECT_ID=YOUR_PROJECT_ID

Teraz ustaw kolejną zmienną środowiskową dla użytego przykładu, aby w późniejszych poleceniach można było podać prawidłowy katalog i nazwę usługi:

# Copy and paste ONLY ONE of these
export SAMPLE=kotlin-micronaut
export SAMPLE=kotlin-quarkus
export SAMPLE=kotlin-springboot
export SAMPLE=java-quarkus
export SAMPLE=java-springboot
export SAMPLE=go
export SAMPLE=nodejs
export SAMPLE=python

Teraz możesz edytować źródło mikroserwisu w Cloud Shell. Aby otworzyć internetowy edytor Cloud Shell, uruchom to polecenie:

cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md

Wyświetlone zostaną dalsze instrukcje dotyczące wprowadzania zmian.

f910c9ef7b51c406.png

Cloud Shell z edytorem z otwartym przykładowym projektem

Po zapisaniu zmian uruchom aplikację w Cloud Shell za pomocą polecenia z pliku README.md, ale najpierw sprawdź, czy jesteś we właściwym przykładowym katalogu w Cloud Shell:

cd cloudbowl-microservice-game/samples/$SAMPLE

Gdy aplikacja zostanie uruchomiona, otwórz nową kartę Cloud Shell i przetestuj usługę za pomocą curl:

curl -d '{
  "_links": {
    "self": {
      "href": "https://foo.com"
    }
  },
  "arena": {
    "dims": [4,3],
    "state": {
      "https://foo.com": {
        "x": 0,
        "y": 0,
        "direction": "N",
        "wasHit": false,
        "score": 0
      }
    }
  }
}' -H "Content-Type: application/json" -X POST -w "\n" \
  http://localhost:8080

Gdy zmiany będą gotowe do wdrożenia, utwórz projekt w Cloud Shell za pomocą polecenia pack. To polecenie używa pakietów Buildpacks do wykrywania typu projektu, skompilowania go i utworzenia możliwego do wdrożenia artefaktu (obrazu kontenera Dockera).

# Make sure you are in a Cloud Shell tab where you set the PROJECT_ID
# and SAMPLE env vars. Otherwise, set them again.
pack build gcr.io/$PROJECT_ID/$SAMPLE \
  --path ~/cloudbowl-microservice-game/samples/$SAMPLE \
  --builder gcr.io/buildpacks/builder

Po utworzeniu obrazu kontenera użyj polecenia Dockera (w Cloud Shell), aby przekazać go do Google Container Registry, aby umożliwić dostęp do niego Cloud Run:

docker push gcr.io/$PROJECT_ID/$SAMPLE

Teraz wdróż nową wersję w Cloud Run:

gcloud run deploy $SAMPLE \
          --project=$PROJECT_ID \
          --platform=managed \
          --region=us-central1 \
          --image=gcr.io/$PROJECT_ID/$SAMPLE \
          --allow-unauthenticated

Teraz arena będzie używać Twojej nowej wersji!

6. Programuj lokalnie (opcjonalnie)

Możesz pracować nad projektem lokalnie z użyciem własnego IDE, wykonując te czynności:

  1. [W Cloud Shell] Skompresuj przykład:
# Make sure the SAMPLE env var is still set. If not, re-set it.
cd ~/cloudbowl-microservice-game/samples
zip -r cloudbowl-sample.zip $SAMPLE
  1. [W Cloud Shell] Pobierz plik ZIP na swój komputer:
cloudshell download-file cloudbowl-sample.zip
  1. [Na Twoim komputerze] Rozpakuj plik, a następnie utwórz sprawdź zmiany
  2. [Na Twoim komputerze] Zainstaluj interfejs wiersza poleceń gcloud
  3. [Na Twoim komputerze] Zaloguj się do Google Cloud:
gcloud auth login
  1. [Na Twoim komputerze] Ustaw zmienne środowiskowe PROJECT_ID i SAMPLE na te same wartości co w Cloud Shell.
  2. [Na Twoim komputerze] Utwórz kontener za pomocą Cloud Build (z katalogu głównego projektu):
gcloud alpha builds submit . \
  --pack=image=gcr.io/$PROJECT_ID/$SAMPLE \
  --project=$PROJECT_ID
  1. [Na Twoim komputerze] Wdróż nowy kontener:
gcloud run deploy $SAMPLE \
  --project=$PROJECT_ID \
  --platform=managed \
  --region=us-central1 \
  --image=gcr.io/$PROJECT_ID/$SAMPLE \
  --allow-unauthenticated

7. Tryb ciągłego dostarczania

Konfigurowanie SCM

Skonfiguruj GitHub, aby współpracować ze swoim zespołem nad mikroserwisem:

  1. Zaloguj się w GitHubie
  2. Tworzenie nowego repozytorium
  3. Jeśli pracujesz na komputerze lokalnym, możesz użyć interfejsu wiersza poleceń git (interfejsu wiersza poleceń git) lub aplikacji GitHub Desktop GUI (dla systemu Windows lub Mac). Jeśli używasz Cloud Shell, musisz użyć interfejsu wiersza poleceń git. Aby pobrać kod mikroserwisu do GitHuba, postępuj zgodnie z instrukcjami interfejsu wiersza poleceń lub GitHub Desktop.

Przekazywanie kodu za pomocą interfejsu wiersza poleceń git

  1. Postępuj zgodnie z instrukcjami git over https z osobistym tokenem dostępu
  2. Wybierz „repozytorium” zakres
  3. Skonfiguruj git:
git config --global credential.helper \
  'cache --timeout=172800'
git config --global push.default current
git config --global user.email "YOUR@EMAIL"
git config --global user.name "YOUR NAME"
  1. Ustaw zmienne środowiskowe dla organizacji i repozytorium GitHub (https://github.com/ORG/REPO)
export GITHUB_ORG=YOUR_GITHUB_ORG
export GITHUB_REPO=YOUR_GITHUB_REPO
  1. Przekazywanie kodu do nowego repozytorium
# Make sure the SAMPLE env var is still set. If not, re-set it.
cd ~/cloudbowl-microservice-game/samples/$SAMPLE
git init
git add .
git commit -m init
git remote add origin https://github.com/$GITHUB_ORG/$GITHUB_REPO.git
git branch -M main

# This will now ask for your GitHub username & password
# for the password use the personal access token
git push -u origin main
  1. Po wprowadzeniu zmian możesz je zatwierdzić i przenieść do GitHuba:
git add .
git status
git diff --staged
git commit -am "my changes"
git push

Przekazywanie kodu za pomocą pulpitu GitHub

  1. Pobierz kod, postępując zgodnie z instrukcjami z poprzedniej części „Programowanie lokalnie”. moduł
  2. Zainstaluj aplikację GitHub Desktop, uruchom ją i zaloguj się
  3. Klonowanie nowo utworzonego repozytorium

cf7f38c7c86a91cd.png

  1. Otwórz eksploratora plików i skopiuj projekt do nowego repozytorium
  2. Zatwierdź zmiany

5f3c1552e30ad7c5.png

  1. Opublikuj główną gałąź w GitHubie

Skonfiguruj ciągłe wdrażanie Cloud Run

Po skonfigurowaniu SCM w GitHubie możesz skonfigurować tryb ciągłego dostarczania tak, aby za każdym razem, gdy do gałęzi main wypuszczono nowe zatwierdzenia, Cloud Build automatycznie kompiluje i wdraża te zmiany. Możesz też dodać tryb ciągłej integracji, który uruchamia testy przed wdrożeniem, ale ten krok pozostał dla Ciebie jako ćwiczenie, ponieważ gotowe przykłady nie zawierają żadnych testów.

  1. W konsoli Cloud otwórz usługę Cloud Run.
  2. Kliknij „SKONFIGURUJ CIĄGŁOWE WDROŻENIE”. przycisk
  3. Uwierzytelnij się w GitHubie i wybierz repozytorium mikroserwisu

a3b5692f178869bc.png

  1. Wybierz repozytorium GitHub i ustaw gałąź na: ^main$

338f1c00f33d2f65.png

  1. Ustaw typ kompilacji do użycia pakietów Buildpack
  2. Kliknij Zapisz, aby skonfigurować ciągłe wdrażanie.

8. Dostrzegalność

A teraz coś psuje. Dostrzegalność pozwala nam określić, kiedy do tego dochodzi, i diagnozować przyczynę. Wskaźniki pokazują nam informacje o stanie i korzystaniu z naszej usługi. Logi pokazują ręcznie zinstruowane informacje wysyłane z naszej usługi. Dzięki alertom otrzymujesz powiadomienia, gdy coś poszło nie tak. Przyjrzyjmy się bliżej każdemu z nich.

Dane

  1. Znajdź swoją usługę na liście usług Cloud Run.
  2. Kliknij nazwę usługi, aby otworzyć panel jej wskaźników

8491b8ec6bc5b4db.png

  1. Kliknij menu dotyczące wskaźnika, a następnie wybierz „Wyświetl w narzędziu Metrics Explorer”.
  2. Możesz teraz zmieniać wskaźniki zasobów, filtry, grupowanie i inne opcje. Możesz na przykład wyświetlić średnie czasy oczekiwania na usługę dla wszystkich usług:

f0d666d8f4221d45.png

Logi

Dane wyjściowe STDOUT z usług są wysyłane do systemu Google Cloud Logging. Podstawowy widok logu możesz uzyskać ze strony administratora usługi Cloud Run, na przykład:

40058a82c9299cff.png

Logi Cloud Run możesz filtrować według poziomu ważności i filtrować logi. Jeśli potrzebujesz większej swobody, kliknij: 186fdb0e6d39a6ca.png

Alerty

  1. Utwórz adres URL kontroli temperatury dla swojej usługi.
  2. W przypadku Spring Boot wystarczy dodać tę zależność:
org.springframework.boot:spring-boot-starter-actuator
  1. Utwórz lub zaktualizuj zasadę src/main/resources/application.properties i wyłącz sprawdzanie miejsca na dysku:
management.health.diskspace.enabled=false
  1. Utwórz alert o dostępności, w którym podasz protokół, nazwę hosta i ścieżkę. W przypadku Spring Boot ścieżka: /actuator/health
  2. Testowanie alertu

6948d13b263bf573.png

  1. Utwórz alert

9. Gratulacje

Gratulujemy! Udało Ci się utworzyć i wdrożyć mikroserwis, który radzi sobie z innymi mikroserwisami. Powodzenia!

Dokumenty referencyjne