Mikro Hizmet Gökkuşağı Rompus

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:

20628e6bd442bd11.png

Ö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

Kaynak

Kotlin ve Micronaut

Kaynak

Kotlin ve Quarkus

Kaynak

Java ve Spring Boot

Kaynak

Java ve Quarkus

Kaynak

Go

Kaynak

Node.js ve Express

Kaynak

Python ve Flask

Kaynak

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.

d88e40430706a32b.png

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.

f910c9ef7b51c406.png

Ö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:

  1. [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
  1. [Cloud Shell'de] ZIP dosyasını makinenize indirin:
cloudshell download-file cloudbowl-sample.zip
  1. [Makinenizde] Dosyanın sıkıştırmasını açın, ardından değişikliklerinizi yapıp test edin.
  2. [Makinenizde] gcloud CLI'yı yükleyin.
  3. [Makinenizde] Google Cloud'da oturum açın:
gcloud auth login
  1. [Makinenizde] PROJECT_ID ve SAMPLE ortam değişkenlerini Cloud Shell'deki değerlerle aynı olacak şekilde ayarlayın.
  2. [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
  1. [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:

  1. GitHub'da oturum açma
  2. Yeni depo oluşturma
  3. 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

  1. Kişisel erişim jetonuyla https üzerinden git talimatlarını uygulayın.
  2. "Repo" kapsamını seçin.
  3. 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"
  1. 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
  1. 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
  1. 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

  1. Önceki "Yerel Olarak Geliştirme" laboratuvarındaki talimatları kullanarak kodunuzu indirin.
  2. GitHub Desktop'ı yükleyin, başlatın ve giriş yapın
  3. Yeni oluşturduğunuz depoyu klonlayın

cf7f38c7c86a91cd.png

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

5f3c1552e30ad7c5.png

  1. 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.

  1. Cloud Console'da Cloud Run hizmetinize gidin.
  2. "SÜREKLİ DAĞITIMI AYARLA" düğmesini tıklayın.
  3. GitHub ile kimliğinizi doğrulayın ve mikro hizmetinizin deposunu seçin

a3b5692f178869bc.png

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

338f1c00f33d2f65.png

  1. Derleme Türü'nü Buildpack'leri kullanacak şekilde ayarlayın.
  2. 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

  1. Hizmetinizi Cloud Run hizmetleri listesinde bulun.
  2. Hizmetinizin metrik kontrol paneline gitmek için hizmetinizin adını tıklayın.

8491b8ec6bc5b4db.png

  1. Bir metriğin ⋮ menüsünü tıklayın, ardından "Metrik Gezgini'nde görüntüle"yi seçin.
  2. 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:

f0d666d8f4221d45.png

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:

40058a82c9299cff.png

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: 186fdb0e6d39a6ca.png

Uyarılar

  1. Hizmetiniz için bir sağlık durumu kontrolü URL'si oluşturun.
  2. Spring Boot için aşağıdaki bağımlılığı eklemeniz yeterlidir:
org.springframework.boot:spring-boot-starter-actuator
  1. src/main/resources/application.properties dosyasını oluşturun veya güncelleyin ve disk alanı kontrolünü devre dışı bırakın:
management.health.diskspace.enabled=false
  1. 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
  2. Uyarıyı test etme

6948d13b263bf573.png

  1. 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!

Referans belgeler