Battle Peach – A Microservices Battle Ground

1. Wprowadzenie

Ostatnia aktualizacja: 12.02.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ż rozpoczynamy pierwszą bitwę w mikroserwisach w Atlancie w stanie Georgia, nasze mikroserwisy będą rzucać brzoskwinie zamiast śnieżek.

Być może zastanawiasz się... Ale w jaki sposób mikroserwis „rzuca” brzoskwinia 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. Każdego dnia na konferencji DevNexus odbędzie się 1 hala. Każdy gracz reprezentuje mikroserwis, który porusza się wokół i rzuca brzoskwiniami 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 albo rzucić brzoskwinią. Rzucona brzoskwinia przemieszcza się maksymalnie po 3 miejscach w kierunku, w którym jest zwrócony gracz. Jeśli brzoskwinia „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 arena z 3 zmyślonymi graczami:

9e4775d13ff18d4d.png

Przykład gry Battle Peach Arena

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. 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 możesz zacząć od przykładowego projektu, który po prostu wybiera losowe polecenie.

Wybierz sampel na początek

Dostępne są 3 przykłady mikroserwisów bitewnych, od których możesz zacząć:

Java i Trzewik wiosenny

Źródło

Wdrażanie w Cloud Run

Java i Quarkus

Źródło

Wdrażanie w Cloud Run

Kotlin i Micronaut

Źródło

Wdrażanie w Cloud Run

Kotlin i Quarkus

Źródło

Wdrażanie w Cloud Run

Scala Platforma Google Play

Źródło

Wdrażanie w Cloud Run

Przeczytaj

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

Poproś o uwzględnienie na arenie

Aby dołączyć do areny, musisz wypełnić krótki formularz. Najtrudniejsze będzie określenie, czego chcesz użyć jako zdjęcia profilowego. Możesz użyć swojego obrazu z GitHub lub profilu z LinkedIn albo wybierzemy dla Ciebie losowy awatar. Po sprawdzeniu zgłoszenia Twój gracz pojawi się na hali.

Produkcja 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-micronaut
export SAMPLE=scala-play

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 skompiluj 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 heroku/buildpacks

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!

3. Gratulacje

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

Co dalej?

Dokumentacja