Battle Jamón – mikroserwisy Battle Ground

1. Wprowadzenie

Ostatnia aktualizacja: 2020-05-05

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. A ponieważ bitwa mikroserwisów odbędzie się podczas konferencji Spring I/O, nasze mikroserwisy będą rzucać jamónem zamiast śnieżkami.

Może się zastanawiasz… Ale jak mikroserwis „rzuca” jamónem 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. Konferencja Spring I/O Bridge będzie mieć własną arenę. Każdy gracz reprezentuje mikrousługę, która porusza się i rzuca jamónem w innych graczy.

Menedżer areny będzie wywoływać Twój mikroserwis mniej więcej raz na sekundę, wysyłając aktualny stan areny (gdzie znajdują się gracze), a Twój mikroserwis będzie odpowiadać poleceniem, co należy zrobić. Na arenie możesz iść do przodu, skręcać w lewo lub w prawo albo rzucać szynką jamón. Rzucona szynka jamón może przebyć maksymalnie 3 pola w kierunku, w którym jest zwrócony gracz. Jeśli jamón „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:

20628e6bd442bd11.png

Przykładowa arena Battle Jamón

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. Logowanie się w Google Cloud

Aby wdrożyć mikrousługę w Cloud Run, musisz zalogować się w Google Cloud. Dodamy środki do Twojego konta i nie będziesz musiał(-a) podawać danych karty kredytowej. Zwykle mniej problematyczne jest używanie konta osobistego (np. gmail.com) zamiast konta G Suite, ponieważ administratorzy G Suite czasami uniemożliwiają użytkownikom korzystanie z określonych funkcji Google Cloud. Konsola internetowa, której będziemy używać, powinna dobrze działać w Chrome i Firefoxie, ale może sprawiać problemy w Safari.

3. 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ć Ci to zadanie, pomożemy Ci zacząć od przykładowej usługi i wdrożyć ją w Cloud Run.

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

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

Java i Spring Boot

Źródło

Wdróż w Cloud Run

Kotlin i Spring Boot

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

4. Prośba o dołączenie do Areny

Aby wziąć udział w arenie, musisz wysłać wiadomość na kanał#battle-jamon, podając swoje imię i nazwisko, adres URL usługi Cloud Run oraz opcjonalnie nazwę użytkownika GitHub, która będzie używana jako awatar lub zdjęcie profilowe. Gdy zweryfikujemy informacje, Twój zawodnik pojawi się na arenie.

5. 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-springboot

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 uruchom aplikację w Cloud Shell:

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

Gdy aplikacja będzie działać, otwórz nową kartę Cloud Shell i przetestuj usługę za pomocą polecenia 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 zechcesz wdrożyć zmiany, 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 gcr.io/buildpacks/builder

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.

6. Gratulacje

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

Kontynuuj naukę

Dokumentacja

7. Najczęstsze pytania

Dlaczego mój mikroserwis nie wyświetla się na arenie?

Jak przebiega ostateczna bitwa?

Jak działa arena przed ostateczną bitwą?

Jak wygrać?

Czy mogę programować lokalnie?