1. Giriş
Son Güncelleme: 2020-02-12
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 ilk mikro hizmet savaşını Atlanta, Georgia'da düzenlediğimiz için mikro hizmetlerimiz kartopu yerine şeftali atacak.
Şunları merak ediyor olabilirsiniz: Peki bir mikro hizmet, diğer mikro hizmetlere nasıl şeftali "atabilir"? 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. DevNexus konferansında her gün için bir arena olacak. Her oyuncu, hareket eden ve diğer oyunculara şeftali 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 şeftali atabilirsiniz. Atılan şeftali, oyuncunun baktığı yönde en fazla üç kare ilerler. Şeftali 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.
Üç uydurma oyuncuyla arenanın görünümü aşağıdaki gibidir:

Örnek Battle Peach 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. 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. İşleri kolaylaştırmak için rastgele bir komut seçen örnek bir projeyle başlayabilirsiniz.
Başlamak İçin Örnek Seçme
Başlangıç için kullanabileceğiniz üç savaş mikro hizmeti örneği vardır:
Java ve Spring Boot | ||
Java ve Quarkus | ||
Kotlin ve Micronaut | ||
Kotlin ve Quarkus | ||
Scala ve Play Framework | ||
Go |
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.
Arena'ya dahil edilme isteğinde bulunma
Arenaya dahil edilmek için kısa bir form doldurmanız gerekir. En zor kısım, profil resminizde ne kullanmak istediğinize karar vermektir. GitHub resminizi, LinkedIn resminizi kullanabilir veya sizin için rastgele bir avatar seçebiliriz. Gönderimi inceledikten sonra oyuncunuz arenada görünür.
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-micronaut export SAMPLE=scala-play
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 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 heroku/buildpacks
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.
3. Tebrikler
Tebrikler, diğer mikro hizmetlerle savaşabilecek bir mikro hizmeti başarıyla oluşturup dağıttınız. İyi şanslar!
Yapabilecekleriniz
- Spring Boot uygulamanıza dağıtılmış izleme ekleme
- Mikro hizmetinizi süper akıllı hale getirmek için AI Platform'u kullanma