Battle Peach – A Microservices Battle Ground

1. Wprowadzenie

Ostatnia aktualizacja: 12.02.2020

Microservices Battle Arena

Czy zdarzyło Ci się kiedyś brać udział w bitwie na śnieżki, w której poruszasz się i rzucasz śnieżkami w inne osoby? Jeśli nie, wypróbuj ją kiedyś. Zamiast jednak ryzykować fizyczne uderzenie, możesz utworzyć małą usługę dostępną w sieci (mikroserwis), która weźmie udział w epickiej bitwie z innymi mikroserwisami. Ponieważ pierwsza bitwa mikroserwisów odbędzie się w Atlancie w stanie Georgia, nasze mikroserwisy będą rzucać brzoskwiniami zamiast śnieżkami.

Może się zastanawiasz… Ale jak mikroserwis „rzuca” brzoskwinią w inne mikroserwisy? Mikroserwis może odbierać żądania sieciowe (zwykle przez HTTP) i zwracać odpowiedzi. Istnieje „menedżer areny”, który wysyła do mikroserwisu bieżący stan areny, a mikroserwis odpowiada poleceniem określającym, co należy zrobić.

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

Jak to działa

Utworzysz mikroserwis przy użyciu dowolnej technologii (lub wybierzesz jeden z projektów startowych w języku Java, Kotlin lub Scala), a następnie wdrożysz go w Google Cloud. Po wdrożeniu wypełnij formularz, aby podać adres URL mikrousługi. Następnie dodamy ją do areny.

Arena zawiera wszystkich graczy biorących udział w danej bitwie. W przypadku konferencji DevNexus na każdy dzień będzie przypadać jedna arena. Każdy gracz reprezentuje mikrousługę, która porusza się i rzuca brzoskwiniami w innych graczy.

Mniej więcej raz na sekundę menedżer areny wywoła Twój mikroserwis, wysyłając bieżący stan areny (gdzie znajdują się gracze), a Twój mikroserwis odpowie poleceniem, co należy zrobić. Na arenie możesz iść do przodu, skręcać w lewo lub w prawo albo rzucać brzoskwinią. Rzucona brzoskwinia pokonuje maksymalnie 3 pola w kierunku, w którym jest zwrócony gracz. Jeśli brzoskwinia „trafi” innego gracza, rzucający otrzymuje 1 punkt, a trafiony gracz traci 1 punkt. Rozmiar areny jest automatycznie dostosowywany do aktualnej liczby graczy.

Tak wygląda arena z 3 wymyślonymi graczami:

9e4775d13ff18d4d.png

Przykładowa arena Battle Peach

Konflikty cykliczne

Na arenie może się zdarzyć, że kilku graczy będzie próbowało wykonać sprzeczne działania. Na przykład 2 graczy może próbować przesunąć się na to samo pole. W przypadku konfliktu wygrywa mikrousługa z najkrótszym czasem odpowiedzi.

Oglądanie bitwy

Aby zobaczyć, jak radzi sobie Twój mikroserwis, sprawdź arenę na żywo.

Battle API

Aby współpracować z naszym menedżerem areny, mikrousługa musi wdrożyć określony interfejs API, który umożliwi jej udział w arenie. Menedżer areny wyśle bieżący stan areny w żądaniu HTTP POST na podany przez Ciebie adres URL, używając tej struktury 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) i zawierać treść z Twoim następnym ruchem zakodowanym jako pojedynczy znak pisany wielką literą:

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

To już wszystko. Omówimy wdrażanie mikroserwisu w Cloud Run, usłudze Google Cloud do uruchamiania mikroserwisów i innych aplikacji.

2. Wdrażanie mikroserwisu

Mikroserwis możesz utworzyć w dowolnej technologii i wdrożyć w dowolnym miejscu, o ile jest on publicznie dostępny i zgodny z interfejsem Battle API. Aby ułatwić sobie pracę, możesz zacząć od przykładowego projektu, który po prostu wybiera losowe polecenie.

Wybierz próbkę, od której chcesz zacząć

Możesz zacząć od 3 przykładowych mikrousług bitewnych:

Java i Spring Boot

Źródło

Wdróż w Cloud Run

Java i Quarkus

Źródło

Wdróż w Cloud Run

Kotlin i Micronaut

Źródło

Wdróż w Cloud Run

Kotlin i Quarkus

Źródło

Wdróż w Cloud Run

Scala i Play Framework

Źródło

Wdróż w Cloud Run

Go

Źródło

Wdróż w Cloud Run

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

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

Na zrzucie ekranu poniżej widać dane wyjściowe Cloud Shell dotyczące kompilacji i wdrażania mikroserwisu

d88e40430706a32b.png

Sprawdzanie działania mikroserwisu

W Cloud Shell możesz wysłać żądanie do nowo wdrożonej mikroserwisu, zastępując YOUR_SERVICE_URL adresem URL usługi (który znajduje się w Cloud Shell po wierszu „Your application is now live here”):

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 pojawić się ciąg znaków F, L, R lub T.

Prośba o uwzględnienie w Arenie

Aby znaleźć się na arenie, musisz wypełnić krótki formularz. Najtrudniejsze będzie określenie, czego chcesz użyć jako zdjęcia profilowego. Możesz użyć obrazu z GitHub lub LinkedIn albo po prostu wybierzemy dla Ciebie losowy awatar. Gdy sprawdzimy zgłoszenie, Twój zawodnik pojawi się na arenie.

Wprowadzanie i wdrażanie zmian

Zanim wprowadzisz zmiany, musisz skonfigurować w Cloud Shell informacje o projekcie GCP i użytej próbce. Najpierw wyświetl listę projektów GCP:

gcloud projects list

Prawdopodobnie masz tylko 1 projekt. Skopiuj PROJECT_ID z pierwszej kolumny i wklej go do tego polecenia (zastępując YOUR_PROJECT_ID identyfikatorem projektu), aby ustawić zmienną środowiskową, której będziemy używać 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 określić 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 mikrousługi w Cloud Shell. Aby otworzyć edytor internetowy Cloud Shell, uruchom to polecenie:

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

Następnie zobaczysz dalsze instrukcje dotyczące wprowadzania zmian.

f910c9ef7b51c406.png

Cloud Shell z otwartym edytorem i 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, kompilowania go i tworzenia artefaktu do wdrożenia (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 docker (w Cloud Shell), aby przenieść obraz kontenera do Google Container Registry, tak aby można było uzyskać do niego dostęp z 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ć nowej wersji.

3. Gratulacje

Gratulacje, udało Ci się utworzyć i wdrożyć mikroserwis, który może walczyć z innymi mikroserwisami. Powodzenia!

Co dalej?

Dokumentacja