1. Giriş
Son Güncelleme: 2020-08-26
Microservices Battle Arena
Hiç hareket edip diğerlerine eğlenceli bir şekilde kartopu attığınız bir kartopu savaşına katıldınız mı? Henüz denemediyseniz mutlaka deneyin. Ancak artık fiziksel olarak tokatlanma riskini almak yerine, diğer mikro hizmetlere karşı destansı bir savaşa katılacak küçük ve ağ üzerinden erişilebilen bir hizmet (mikro hizmet) oluşturabilirsiniz. Bu mikro hizmet savaşını SpringOne'da düzenlediğimiz için mikro hizmetlerimiz kar topu yerine yaprak atacak.
Şunları merak ediyor olabilirsiniz: Ancak bir mikro hizmet, diğer mikro hizmetlere nasıl "yaprak atar"? Bir mikro hizmet, ağ istekleri (genellikle HTTP üzerinden) alabilir ve yanıt döndürebilir. Arenanın mevcut durumunu mikro hizmetinize gönderen bir "arena yöneticisi" vardır. Mikro hizmetiniz de ne yapılması gerektiğini belirten bir komutla yanıt verir.
Elbette amaç kazanmak ancak bu süreçte Google Cloud'da mikro hizmetler oluşturma ve dağıtma hakkında bilgi edineceksiniz.
İşleyiş şekli
İstediğiniz bir teknolojiyle mikro hizmet oluşturacak (veya Java, Kotlin ya da Scala başlangıç paketlerinden birini seçecek) ve ardından mikro hizmeti Google Cloud'da dağıtacaksınız. Dağıtım tamamlandıktan sonra, mikro hizmetinizin URL'sini bize bildirmek için bir form doldurursunuz. Ardından, URL'yi arenaya ekleriz.
Arena, belirli bir savaş için tüm oyuncuları içerir. SpringOne konferansının kendi arenası olacak. Her oyuncu, etrafta dolaşan ve diğer oyunculara yaprak atan bir mikro hizmeti temsil eder.
Arena yöneticimiz, yaklaşık olarak saniyede bir kez mikro hizmetinizi çağırarak mevcut arena durumunu (oyuncuların bulunduğu yer) gönderir. Mikro hizmetiniz ise ne yapılması gerektiğine dair bir komutla yanıt verir. Arenada ileri gidebilir, sola veya sağa dönebilir ya da yaprak atabilirsiniz. Atılan yaprak, oyuncunun baktığı yönde en fazla üç kare ilerler. Bir yaprak başka bir oyuncuya "çarparsa", atan oyuncu bir puan kazanır ve çarptığı oyuncu bir puan kaybeder. Arena boyutu, mevcut oyuncu sayısına göre otomatik olarak ayarlanır.
Geçmiş bir arenanın görünümü aşağıdaki gibidir:

Örnek Battle One arenası
Döner Çakışmalar
Arenada birden fazla oyuncu çakışan işlemler yapmaya çalışabilir. Örneğin, iki oyuncu aynı alana gitmeye çalışabilir. Çakışma durumunda en hızlı yanıt süresine sahip mikro hizmet kazanır.
Watching the Battle
Mikro hizmetinizin savaşta nasıl performans gösterdiğini görmek için canlı arenayı inceleyin.
Battle API
Arena yöneticimizle çalışabilmek için mikro hizmetinizin arenaya katılmak üzere belirli bir API'yi uygulaması gerekir. Arena yöneticisi, aşağıdaki JSON yapısıyla birlikte, bize sağladığınız URL'ye bir HTTP POST isteğiyle mevcut arena durumunu gönderir:
{
"_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
}
}
}
HTTP yanıtınız, durum kodu 200 (OK) olmalı ve yanıt gövdesinde, bir sonraki hamlenizi içeren, aşağıdaki karakterlerden biriyle kodlanmış tek bir büyük harf bulunmalıdır:
F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw
Hepsi bu kadar. Mikro hizmetleri ve diğer uygulamaları çalıştırmak için kullanılan bir Google Cloud hizmeti olan Cloud Run'da mikro hizmet dağıtma sürecini inceleyelim.
2. Google Cloud'a giriş yapma
Mikro hizmetinizi Cloud Run'da dağıtabilmek için Google Cloud'da oturum açmanız gerekir. Hesabınıza kredi uygulayacağımız için kredi kartı girmeniz gerekmez. G Suite yöneticileri bazen kullanıcılarının belirli Google Cloud özelliklerini kullanmasını engellediğinden, G Suite hesabı yerine kişisel hesap (ör. gmail.com) kullanmak genellikle daha az sorun çıkarır. Ayrıca, kullanacağımız web konsolu Chrome veya Firefox ile sorunsuz çalışır ancak Safari'de sorunlar yaşanabilir.
3. Mikro Hizmetinizi Dağıtma
Mikro hizmetinizi herhangi bir teknolojiyle oluşturabilir ve herkese açık olarak erişilebildiği ve Battle API'ye uygun olduğu sürece istediğiniz yere dağıtabilirsiniz. Ancak işleri kolaylaştırmak için örnek bir hizmetten başlamanıza ve bunu Cloud Run'da dağıtmanıza yardımcı olacağız.
Başlamak İçin Örnek Seçme
Başlangıç için kullanabileceğiniz iki savaş mikro hizmeti örneği vardır:
Java ve Spring Boot | ||
Kotlin ve Spring Boot |
Hangi örnekle başlayacağınıza karar verdikten sonra yukarıdaki "Cloud Run'da dağıt" düğmesini tıklayın. Bu işlem, kaynağın klonlanacağı, ardından dağıtılabilir bir pakete (Docker container görüntüsü) derleneceği, daha sonra Google Container Registry'ye yükleneceği ve ardından Cloud Run'da dağıtılacağı Cloud Shell'i (buluttaki bir sanal makineye yönelik web tabanlı bir konsol) başlatır.
İstenildiğinde us-central1 bölgesini belirtin.
Aşağıdaki ekran görüntüsünde, mikro hizmet derleme ve dağıtımı için Cloud Shell çıkışı gösterilmektedir.

Mikro hizmetin çalıştığını doğrulama
Cloud Shell'de, YOUR_SERVICE_URL kısmını hizmetinizin URL'siyle (Cloud Shell'de "Your application is now live here" satırından sonra yer alır) değiştirerek yeni dağıtılan mikro hizmetinize istekte bulunabilirsiniz:
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
F, L, R veya T yanıt dizisini görmeniz gerekir.
4. Arenaya dahil edilme isteğinde bulunma
Arenaya dahil edilmek için #3-sponsor-google-cloud Slack kanalına adınızı, Cloud Run hizmetinizin URL'sini ve isteğe bağlı olarak avatarı / profil fotoğrafı için GitHub kullanıcı adınızı içeren bir mesaj göndermeniz gerekir. Bilgiler doğrulandıktan sonra oyuncunuz arenada görünür.
5. Değişiklik Yapma ve Dağıtma
Değişiklik yapabilmek için Cloud Shell'de GCP projesi ve kullandığınız örnekle ilgili bazı bilgileri ayarlamanız gerekir. Önce GCP projelerinizi listeleyin:
gcloud projects list
Muhtemelen yalnızca bir projeniz vardır. Daha sonraki komutlarda kullanacağımız bir ortam değişkeni ayarlamak için ilk sütundaki PROJECT_ID değerini kopyalayıp aşağıdaki komuta yapıştırın (YOUR_PROJECT_ID yerine gerçek proje kimliğinizi kullanın):
export PROJECT_ID=YOUR_PROJECT_ID
Şimdi, kullandığınız örnek için başka bir ortam değişkeni ayarlayın. Böylece, sonraki komutlarda doğru dizini ve hizmet adını belirtebiliriz:
# Copy and paste ONLY ONE of these export SAMPLE=java-springboot export SAMPLE=kotlin-springboot
Artık mikro hizmetinizin kaynağını Cloud Shell'den düzenleyebilirsiniz. Cloud Shell web tabanlı düzenleyiciyi açmak için şu komutu çalıştırın:
cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md
Ardından değişiklik yapmayla ilgili diğer talimatları görürsünüz.

Örnek proje açıkken düzenleyiciyle Cloud Shell
Değişikliklerinizi kaydettikten sonra Cloud Shell'de uygulamayı başlatın:
cd cloudbowl-microservice-game/samples/$SAMPLE ./mvnw spring-boot:run
Uygulama çalıştıktan sonra yeni bir Cloud Shell sekmesi açın ve hizmeti curl kullanarak test edin:
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
Değişikliklerinizi dağıtmaya hazır olduğunuzda pack komutunu kullanarak projenizi Cloud Shell'de oluşturun. Bu komut, proje türünü algılamak, derlemek ve dağıtılabilir yapıyı (bir Docker kapsayıcı görüntüsü) oluşturmak için Buildpack'leri kullanır.
pack build gcr.io/$PROJECT_ID/$SAMPLE \ --path ~/cloudbowl-microservice-game/samples/$SAMPLE \ --builder gcr.io/buildpacks/builder
Container görüntünüz oluşturulduktan sonra, Cloud Run tarafından erişilebilmesi için container görüntüsünü Google Container Registry'ye göndermek üzere docker komutunu (Cloud Shell'de) kullanın:
docker push gcr.io/$PROJECT_ID/$SAMPLE
Şimdi yeni sürümü Cloud Run'a dağıtın:
gcloud run deploy $SAMPLE\
--project=$PROJECT_ID\
--platform=managed\
--region=us-central1\
--image=gcr.io/$PROJECT_ID/$SAMPLE\
--memory=512Mi\
--allow-unauthenticated
Artık arena, yeni sürümünüzü kullanacak.
6. Yerel olarak geliştirme
Aşağıdaki adımları uygulayarak projenizi kendi IDE'nizi kullanarak yerel olarak çalışabilirsiniz:
- [Cloud Shell'de] Örneği zip dosyası olarak paketleyin:
cd ~/cloudbowl-microservice-game/samples; zip -r cloudbowl-sample.zip $SAMPLE
- [Cloud Shell'de] ZIP dosyasını makinenize indirin:
cloudshell download-file cloudbowl-sample.zip
- [Makinenizde] Dosyanın sıkıştırmasını açın, ardından değişikliklerinizi yapıp test edin.
- [Makinenizde] gcloud CLI'yı yükleyin.
- [Makinenizde] Google Cloud'da oturum açın:
gcloud auth login
- [Makinenizde]
PROJECT_IDveSAMPLEortam değişkenlerini Cloud Shell'deki değerlerle aynı olacak şekilde ayarlayın. - [Makinenizde] Container'ı oluşturmak için Cloud Build'i kullanın (kök proje dizininden):
gcloud alpha builds submit . --pack=image=gcr.io/$PROJECT_ID/$SAMPLE
- [Makinenizde] Yeni kapsayıcıyı dağıtın:
gcloud run deploy $SAMPLE --project=$PROJECT_ID --platform=managed --region=us-central1 --image=gcr.io/$PROJECT_ID/$SAMPLE --memory=512Mi --allow-unauthenticated
7. Tebrikler
Tebrikler, diğer mikro hizmetlerle savaşabilecek bir mikro hizmeti başarıyla oluşturup dağıttınız. İyi şanslar!
Öğrenmeye Devam Et
Referans belgeler
8. SSS
Mikro hizmetim neden arenada görünmüyor?