Battle Jamón – mikroserwisy Battle Ground

1. Wprowadzenie

Ostatnia aktualizacja: 5.05.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ż podczas wiosennej konferencji I/O będziemy organizować tę bitwę w mikroserwisach, nasze mikroserwisy będą rzucać jamón zamiast śnieżek.

Być może zastanawiasz się... Ale w jaki sposób mikroserwis „rzuca” i jamón 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 Spring I/O Bridge będzie miała własną salę. Każdy gracz reprezentuje mikroserwis, który porusza się wokół i rzuca jamónem innym graczom.

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ęcić w lewo lub w prawo albo wyrzucić dżemon. Rzucony jamón przebywa do 3 przestrzeni w kierunku, w którym jest zwrócony gracz. Jeśli jamón „klika” 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:

20628e6bd442bd11.png

Przykładowa arena Battle Jamón

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ć na #battle-jamon kanał wiadomość ze swoim imieniem i nazwiskiem, adresem URL usługi Cloud Run i opcjonalnie swoją nazwą użytkownika na GitHubie jako awatarem lub zdjęciem profilowym. 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. Gratulacje

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

Kontynuuj naukę

Dokumenty referencyjne

7. Najczęstsze pytania

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

Jak wygląda finałowa bitwa?

Jak działa arena przed ostateczną bitwą?

Jak wygrać?

Czy mogę programować lokalnie?