1. Wprowadzenie
Ostatnia aktualizacja: 26.08.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ż w SpringOne organizujemy bitwę mikroserwisową, nasze mikroserwisy będą rzucać liście zamiast śnieżkami.
Być może zastanawiasz się... Ale w jaki sposób mikroserwis „rzuca” a liście 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 SpringOne będzie miała swoje oddzielne miejsce. Każdy gracz reprezentuje mikroserwis, który porusza się wokół i rzuca liście do pozostałych.
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ć liść. Rzucony liść przemieszcza się maksymalnie po 3 miejscach w kierunku, w którym jest zwrócony gracz. Jeśli liść „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 dawna arena:
Przykładowa arena Battle One
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 | ||
Kotlin i Trzewik wiosenny |
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
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ć wiadomość na kanał #3-sponsor-google-cloud na Slacku, podając swoje imię i nazwisko, adres URL usługi Cloud Run i opcjonalnie nazwę użytkownika GitHub jako awatara lub zdjęcie profilowe. 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.
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. Programuj lokalnie
Możesz pracować nad projektem lokalnie z użyciem własnego IDE, wykonując te czynności:
- [W Cloud Shell] Skompresuj przykład:
cd ~/cloudbowl-microservice-game/samples; zip -r cloudbowl-sample.zip $SAMPLE
- [W Cloud Shell] Pobierz plik ZIP na swój komputer:
cloudshell download-file cloudbowl-sample.zip
- [Na Twoim komputerze] Rozpakuj plik, a następnie utwórz sprawdź zmiany
- [Na Twoim komputerze] Zainstaluj interfejs wiersza poleceń gcloud
- [Na Twoim komputerze] Zaloguj się do Google Cloud:
gcloud auth login
- [Na Twoim komputerze] Ustaw zmienne środowiskowe
PROJECT_ID
iSAMPLE
na te same wartości co w Cloud Shell. - [Na Twoim komputerze] Utwórz kontener za pomocą Cloud Build (z katalogu głównego projektu):
gcloud alpha builds submit . --pack=image=gcr.io/$PROJECT_ID/$SAMPLE
- [Na Twoim komputerze] Wdróż nowy kontener:
gcloud run deploy $SAMPLE --project=$PROJECT_ID --platform=managed --region=us-central1 --image=gcr.io/$PROJECT_ID/$SAMPLE --memory=512Mi --allow-unauthenticated
7. Gratulacje
Gratulujemy! Udało Ci się utworzyć i wdrożyć mikroserwis, który radzi sobie z innymi mikroserwisami. Powodzenia!
Kontynuuj naukę
Dokumenty referencyjne
8. Najczęstsze pytania
Dlaczego mój mikroserwis nie jest widoczny w innej usłudze?