1. Giriş
Last Updated: 2021-05-06
Mikro Hizmet Rainbow Rumpus
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, kartopu yerine gökkuşağı atacak küçük ve ağ üzerinden erişilebilen bir hizmet (mikro hizmet) oluşturabilirsiniz.
Şunları merak ediyor olabilirsiniz: Peki bir mikro hizmet, diğer mikro hizmetlere nasıl gökkuşağı "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 Go, Java, Kotlin, Scala, NodeJS ya da Python 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 bildirirsiniz. Biz de bu URL'yi arenaya ekleriz.
Arena, belirli bir savaş için tüm oyuncuları içerir. Rainbow Rumpus'un kendi arenaları olacak. Her oyuncu, etrafta dolaşan ve diğer oyunculara gökkuşağı atan bir mikro hizmeti temsil eder.
Arena yöneticimiz, yaklaşık olarak saniyede bir 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 gökkuşağı atabilirsiniz. Gökkuşağı, oyuncunun baktığı yönde en fazla üç kare ilerler. Gökkuşağı başka bir oyuncuya "çarparsa" atan oyuncu bir puan kazanır, çarptığı oyuncu ise 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 (Tamam) 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şlayabileceğiniz çok sayıda savaş mikro hizmeti örneği vardır:
Kotlin ve Spring Boot | ||
Kotlin ve Micronaut | ||
Kotlin ve Quarkus | ||
Java ve Spring Boot | ||
Java ve Quarkus | ||
Go | ||
Node.js ve Express | ||
Python ve Flask |
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 dizesini görmeniz gerekir.
4. Arenaya dahil edilme isteğinde bulunma
Rainbow Rumpus'a katılmak için bir arenaya katılmanız gerekir. rainbowrumpus.dev adresini açın ve mikro hizmet URL'nizi sağlayacağınız bir arenada katıl'ı tıklayın.
5. Değişiklik Yapma ve Dağıtma
Değişiklik yapabilmek için Cloud Shell'de GCP projesi ve kullandığınız örnek hakkında 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=kotlin-micronaut export SAMPLE=kotlin-quarkus export SAMPLE=kotlin-springboot export SAMPLE=java-quarkus export SAMPLE=java-springboot export SAMPLE=go export SAMPLE=nodejs export SAMPLE=python
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, README.md dosyasındaki komutu kullanarak Cloud Shell'de uygulamayı başlatın. Ancak öncelikle Cloud Shell'de doğru örnek dizinde olduğunuzdan emin olun:
cd cloudbowl-microservice-game/samples/$SAMPLE
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.
# Make sure you are in a Cloud Shell tab where you set the PROJECT_ID # and SAMPLE env vars. Otherwise, set them again. 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 \
--allow-unauthenticated
Artık arena, yeni sürümünüzü kullanacak.
6. Yerel olarak geliştirme (isteğe bağlı)
Aşağıdaki adımları uygulayarak projenizi kendi IDE'nizi kullanarak yerel olarak çalışabilirsiniz:
- [Cloud Shell'de] Örneği zip dosyası olarak paketleyin:
# Make sure the SAMPLE env var is still set. If not, re-set it. 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 \ --project=$PROJECT_ID
- [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 \ --allow-unauthenticated
7. Sürekli Teslim
SCM'yi ayarlama
Mikro hizmetinizde ekibinizle ortak çalışabilmek için GitHub'ı ayarlayın:
- GitHub'da oturum açma
- Yeni depo oluşturma
- Yerel makinenizde çalışıyorsanız git komut satırı arayüzünü (KSA) veya GitHub Desktop GUI uygulamasını (Windows veya Mac) kullanabilirsiniz. Cloud Shell kullanıyorsanız git KSA'yı kullanmanız gerekir. Mikro hizmetinizin kodunu GitHub'a aktarmak için CLI veya GitHub Desktop talimatlarını uygulayın.
git KSA ile kodunuzu gönderme
- Kişisel erişim jetonuyla https üzerinden git talimatlarını uygulayın.
- "Repo" kapsamını seçin.
- Git'i ayarlama:
git config --global credential.helper \ 'cache --timeout=172800' git config --global push.default current git config --global user.email "YOUR@EMAIL" git config --global user.name "YOUR NAME"
- GitHub kuruluşu ve deposu için ortam değişkenlerini ayarlayın (
https://github.com/ORG/REPO)
export GITHUB_ORG=YOUR_GITHUB_ORG export GITHUB_REPO=YOUR_GITHUB_REPO
- Kodunuzu yeni depoya aktarın
# Make sure the SAMPLE env var is still set. If not, re-set it. cd ~/cloudbowl-microservice-game/samples/$SAMPLE git init git add . git commit -m init git remote add origin https://github.com/$GITHUB_ORG/$GITHUB_REPO.git git branch -M main # This will now ask for your GitHub username & password # for the password use the personal access token git push -u origin main
- Değişiklik yaptıktan sonra değişiklikleri işleyip GitHub'a gönderebilirsiniz:
git add . git status git diff --staged git commit -am "my changes" git push
GitHub Desktop ile kodunuzu gönderme
- Önceki "Yerel Olarak Geliştirme" laboratuvarındaki talimatları kullanarak kodunuzu indirin.
- GitHub Desktop'ı yükleyin, başlatın ve giriş yapın
- Yeni oluşturduğunuz depoyu klonlayın

- Dosya Gezgini'ni açın ve projenizi yeni depoya kopyalayın.
- Değişikliklerinizi işleme

- Ana dalınızı GitHub'da yayınlama
Cloud Run sürekli dağıtımını ayarlama
GitHub'da SCM'nizi ayarladıktan sonra artık sürekli teslimi ayarlayabilirsiniz. Böylece, main dalına her yeni taahhüt gönderildiğinde Cloud Build, değişiklikleri otomatik olarak derleyip dağıtır. Ayrıca, dağıtımdan önce testlerinizi çalıştıran sürekli entegrasyon da ekleyebilirsiniz. Ancak hazır örneklerde herhangi bir test bulunmadığından bu adım sizin için bir alıştırma olarak bırakılmıştır.
- Cloud Console'da Cloud Run hizmetinize gidin.
- "SÜREKLİ DAĞITIMI AYARLA" düğmesini tıklayın.
- GitHub ile kimliğinizi doğrulayın ve mikro hizmetinizin deposunu seçin

- GitHub deponuzu seçin ve dalı şu şekilde ayarlayın:
^main$

- Derleme Türü'nü Buildpack'leri kullanacak şekilde ayarlayın.
- Sürekli dağıtımı ayarlamak için Kaydet'i tıklayın.
8. Gözlemlenebilirlik
Cihazlar bozulabilir. Gözlemlenebilirlik, bu durumun ne zaman gerçekleştiğini bilmemizi ve nedenini teşhis etmemizi sağlar. Metrikler, hizmetimizin durumu ve kullanımıyla ilgili verileri gösterir. Günlükler, hizmetimizden yayılan manuel olarak enstrümanlaştırılmış bilgileri gösterir. Uyarılar, bir sorun olduğunda bildirim almamızı sağlar. Bunların her birini daha ayrıntılı olarak inceleyelim.
Metrikler
- Hizmetinizi Cloud Run hizmetleri listesinde bulun.
- Hizmetinizin metrik kontrol paneline gitmek için hizmetinizin adını tıklayın.

- Bir metriğin ⋮ menüsünü tıklayın, ardından "Metrik Gezgini'nde görüntüle"yi seçin.
- Artık kaynak metriklerini, filtreleri, gruplandırmayı ve diğer seçenekleri değiştirebilirsiniz. Örneğin, tüm hizmetler için ortalama hizmet gecikmelerini görüntüleyebilirsiniz:

Günlükler
Hizmetlerden gelen STDOUT çıkışı, Google Cloud Logging sistemine gönderilir. Cloud Run hizmeti yönetici sayfasından temel bir günlük görünümüne erişebilirsiniz. Örneğin:

Cloud Run günlüklerinde önem derecesine göre filtreleme yapabilir ve günlükleri filtreleyebilirsiniz. Daha fazla esneklik için şunları tıklayın: 
Uyarılar
- Hizmetiniz için bir sağlık durumu kontrolü URL'si oluşturun.
- Spring Boot için aşağıdaki bağımlılığı eklemeniz yeterlidir:
org.springframework.boot:spring-boot-starter-actuator
src/main/resources/application.propertiesdosyasını oluşturun veya güncelleyin ve disk alanı kontrolünü devre dışı bırakın:
management.health.diskspace.enabled=false
- Protokolünüzü, ana bilgisayar adınızı ve yolunuzu belirterek çalışma süresi uyarısı oluşturun. Spring Boot için yol:
/actuator/health - Uyarıyı test etme

- Uyarıyı oluşturma
9. Tebrikler
Tebrikler, diğer mikro hizmetlerle savaşabilecek bir mikro hizmeti başarıyla oluşturup dağıttınız. İyi şanslar!