Battle One – mikroserwisowe pole bitwy

1. Wprowadzenie

Ostatnia aktualizacja: 26.08.2020

Microservices Battle Arena

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ś! Ale 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. A ponieważ w SpringOne organizujemy bitwę mikroserwisową, nasze mikroserwisy będą rzucać liście zamiast śnieżkami.

Być może zastanawiasz się... Ale w jaki sposób mikroserwis „rzuca” a liście 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ą (albo wybierz początek w języku Java, Kotlin lub Scala), a następnie wdrożysz go w Google Cloud. Po wdrożeniu trzeba wypełnić formularz i podać nam adres URL mikroserwisu, a następnie dodamy go do domeny.

Hala zawiera wszystkich graczy biorących udział w danej bitwie. Konferencja SpringOne będzie miała swoje oddzielne miejsce. Każdy gracz reprezentuje mikroserwis, który porusza się wokół i rzuca liście do pozostałych.

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 albo rzucić liść. Rzucony liść przemieszcza się maksymalnie po 3 miejscach w kierunku, w którym jest zwrócony gracz. Jeśli liść „trafi” 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

Są 2 przykłady mikroserwisów bitewnych, od których możesz zacząć:

Java i Trzewik wiosenny

Źródło

Wdrażanie w Cloud Run

Kotlin i Trzewik wiosenny

Źródło

Wdrażanie w Cloud Run

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 znaleźć się na arenie, musisz wysłać wiadomość na kanał #3-sponsor-google-cloud na Slacku, podając swoje imię i nazwisko, adres URL usługi Cloud Run i opcjonalnie nazwę użytkownika GitHub jako awatara lub zdjęcie profilowe. Gdy zweryfikujemy te informacje, Twój gracz pojawi się na hali widowiskowej.

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=java-springboot
export SAMPLE=kotlin-springboot

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:

cd cloudbowl-microservice-game/samples/$SAMPLE
./mvnw spring-boot:run

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).

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\
          --memory=512Mi\
          --allow-unauthenticated

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

6. Programuj lokalnie

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

  1. [W Cloud Shell] Skompresuj przykład:

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

  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 --memory=512Mi --allow-unauthenticated

7. Gratulacje

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

Kontynuuj naukę

Dokumenty referencyjne

8. Najczęstsze pytania

Dlaczego mój mikroserwis nie jest widoczny w innej usłudze?