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:

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 | ||
Java i Quarkus | ||
Kotlin i Micronaut | ||
Kotlin i Quarkus | ||
Scala i Play Framework | ||
Go |
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

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.

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?
- Dodawanie śledzenia rozproszonego do aplikacji Spring Boot
- Używanie AI Platform do zwiększania możliwości mikrousług