Mikro Hizmet Gökkuşağı Rompus

1. Giriş

Son Güncelleme: 06.05.2021

Microservice Rainbow Rumpus

Hareket halindeyken diğer oyunculara kartopu attığınız bir kartopu savaşına katıldınız mı? Aksi takdirde bir gün deneyebilirsiniz. Ancak artık fiziksel olarak tokat yeme riskini göze almak yerine, diğer mikro hizmetlerle destansı bir savaşa girecek ve kartopu yerine gökkuşağı atacak küçük, ağa erişebilen bir hizmet (mikro hizmet) oluşturabilirsiniz.

Şunları merak ediyor olabilirsiniz: Peki bir mikro hizmet, diğer mikro hizmetlere nasıl "yay" gönderir? Mikro hizmetler, ağ isteklerini (genellikle HTTP üzerinden) alabilir ve yanıt verebilir. Mikro hizmetinize arenanın mevcut durumunu gönderen bir "arena yöneticisi" vardır. Ardından mikro hizmetiniz, ne yapılacağını belirten bir komutla yanıt verir.

Elbette amaç kazanmak olsa da bu süreçte Google Cloud'da mikro hizmet oluşturma ve dağıtma hakkında bilgi edineceksiniz.

İşleyiş şekli

İstediğiniz teknolojiyle (veya Go, Java, Kotlin, Scala, NodeJS veya Python başlangıç kodlarından birini seçerek) bir mikro hizmet oluşturup mikro hizmeti Google Cloud'da dağıtırsınız. Mikro hizmet dağıtıldıktan sonra mikro hizmetinizin URL'sini bize bildirirsiniz. Ardından mikro hizmetinizi arenaya ekleriz.

Arena, belirli bir savaştaki tüm oyuncuları içerir. Rainbow Rumpus'un kendi arenaları olacak. Her oyuncu, hareket eden ve diğer oyunculara gökkuşağı atan bir mikro hizmeti temsil eder.

Arena yöneticimiz, mikro hizmetinizi yaklaşık saniyede bir çağırır ve mevcut arena durumunu (oyuncuların bulunduğu yer) gönderir. Mikro hizmetiniz de ne yapılacağına dair bir komutla yanıt verir. Arenada ileri gidebilir, sola veya sağa dönebilir ya da bir gökkuşağı atabilirsiniz. Gökkuşağı, oyuncunun baktığı yönde üç alana kadar hareket eder. Gökkuşağı başka bir oyuncuya "çarparsa" yayı fırlatan oyuncu bir puan kazanır ve isabet alan oyuncu bir puan kaybeder. Arena boyutu, mevcut oyuncu sayısına göre otomatik olarak ayarlanır.

Eski bir arenanın görünümü aşağıdaki gibidir:

20628e6bd442bd11.png

Örnek Battle One arenası

Döngüsel Çakışmalar

Arenada birden fazla oyuncunun birbiriyle çelişen işlemler yapmaya çalışması mümkündür. Örneğin, iki oyuncu aynı alana gitmeye çalışabilir. Çakışma durumunda, en hızlı yanıt süresine sahip mikro hizmet kazanır.

Maç izleme

Mikro hizmetinizin savaştaki performansını görmek için canlı arenaya göz atın.

Battle API

Arena yöneticimizle çalışabilmesi için mikro hizmetinizin, alana katılmak üzere belirli bir API'yi uygulaması gerekir. Arena yöneticisi, mevcut arena durumunu bize sağladığınız URL'ye HTTP POST ile gönderir. Bu gönderimde aşağıdaki JSON yapısı kullanılır:

{
  "_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ıdır ve bir sonraki hamlenizi içeren yanıt gövdesi, aşağıdakilerden biri olan tek bir büyük harf karakteri olarak kodlanmalıdır:

F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw

Hepsi bu kadar. Mikro hizmetler ve diğer uygulamaları çalıştırmak için kullanılan bir Google Cloud hizmeti olan Cloud Run'da mikro hizmet dağıtma işlemini adım adım inceleyelim.

2. Google Cloud'a giriş yapma

Mikro hizmetinizi Cloud Run'a dağıtabilmek için Google Cloud'a giriş yapmanız gerekir. Hesabınıza kredi uygulayacağız. Kredi kartı girmeniz gerekmez. GSuite yöneticileri bazen kullanıcılarının belirli Google Cloud özelliklerini kullanmasını engellediğinden, GSuite hesabı yerine kişisel hesap (ör. gmail.com) kullanmak genellikle daha az sorunlu olur. Ayrıca, kullanacağımız web konsolu Chrome veya Firefox ile mükemmel şekilde çalışır ancak Safari'de sorun yaşanabilir.

3. Mikro Hizmetinizi Dağıtma

Mikro hizmetinizi herhangi bir teknolojiyle oluşturabilir ve herkese açık olarak erişilebilir ve Battle API'ye uygun olduğu sürece istediğiniz yere dağıtabilirsiniz. Ancak işleri kolaylaştırmak için bir örnek hizmetten başlayıp bunu Cloud Run'da dağıtmanıza yardımcı olacağız.

Başlamak için örnek seçin

Başlamanız için çok sayıda savaş mikro hizmet ö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

Başlamak için hangi örneği kullanacağınıza karar verdikten sonra yukarıdaki "Cloud Run'da dağıt" düğmesini tıklayın. Bu işlem, kaynağın klonlanacağı ve ardından dağıtılabilir bir pakete (Docker kapsayıcı görüntüsü) derleneceği Cloud Shell'i (buluttaki sanal makine için web tabanlı bir konsol) başlatır. Bu paket daha sonra Google Container Registry'ye yüklenir ve Cloud Run'a dağıtılır.

Sorulduğunda 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 yerine hizmetinizin URL'sini (Cloud Shell'de "Uygulamanız artık burada yayınlanıyor" satırından sonra bulunur) ekleyerek yeni dağıtılan mikro hizmetinize istek gönderebilirsiniz:

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örürsünüz.

4. Arena'ya dahil edilme isteğinde bulunma

Gökkuşağı Güreşleri'ne 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 yapmadan önce Cloud Shell'de GCP projesi ve kullandığınız örnekle ilgili bazı bilgileri ayarlamanız gerekir. Öncelikle 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 değerini gerçek proje kimliğinizle değiştirin):

export PROJECT_ID=YOUR_PROJECT_ID

Ardından, 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 daha fazla talimat görürsünüz.

f910c9ef7b51c406.png

Örnek projenin açık olduğu düzenleyiciyle Cloud Shell

Değişikliklerinizi kaydettikten sonra, README.md dosyasında bulunan komutu kullanarak uygulamayı Cloud Shell'de başlatın. Ancak önce Cloud Shell'de doğru örnek dizininde olduğunuzdan emin olun:

cd cloudbowl-microservice-game/samples/$SAMPLE

Uygulama çalışmaya başladıktan sonra yeni bir Cloud Shell sekmesi açın ve curl'i kullanarak hizmeti 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 derleyin. Bu komut, proje türünü algılamak, derlemek ve dağıtılabilir yapıyı (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şturulduğuna göre, Cloud Run'un erişebilmesi 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

Ardından 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 kendi IDE'nizi kullanarak projenizde yerel olarak çalışabilirsiniz:

  1. [Cloud Shell'de] Örneği sıkıştırın:
# 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. [Bilgisayarınızda] Dosyayı açın, ardından değişikliklerinizi yapın ve test edin
  2. [Makinenizde] gcloud CLI'yi yükleyin
  3. [Bilgisayarınızda] Google Cloud'a giriş yapın:
gcloud auth login
  1. [Makinenizde] PROJECT_ID ve SAMPLE ortam değişkenlerini Cloud Shell'dakiyle aynı değerlere ayarlayın.
  2. [Bilgisayarınızda] Cloud Build'i kullanarak container'ı derleyin (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

GitHub'ı, mikro hizmetiniz üzerinde ekibinizle ortak çalışabileceğiniz şekilde ayarlayın:

  1. GitHub'a giriş yapın
  2. Yeni bir 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 İTŞ'yi kullanmanız gerekir. Mikro hizmetinizin kodunu GitHub'a almak için CLI veya GitHub Desktop talimatlarını uygulayın.

git KSA ile kodunuzu yayınlama

  1. Kişisel erişim jetonu ile 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 env değişkenlerini ayarlama (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 GitHub'a gönderebilirsiniz:
git add .
git status
git diff --staged
git commit -am "my changes"
git push

GitHub masaüstü sürümüyle kodunuzu yayınlama

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

cf7f38c7c86a91cd.png

  1. Dosya Gezgini'nizi açıp projenizi yeni depoya kopyalayın.
  2. Değişikliklerinizi kaydetme

5f3c1552e30ad7c5.png

  1. Ana dalınızı GitHub'da yayınlama

Cloud Run Sürekli Dağıtımı'nı ayarlama

GitHub'daki SCM ayarlarınızla artık sürekli teslim ayarını, main dalına her yeni taahhüt aktarıldığında Cloud Build'in değişiklikleri otomatik olarak derleyip dağıtacağı şekilde ayarlayabilirsiniz. Ayrıca, dağıtımdan önce testlerinizi çalıştıran sürekli entegrasyon da ekleyebilirsiniz. Ancak hazır örnekler herhangi bir test içermediğinden bu adım size bir alıştırma olarak bırakılmıştır.

  1. Cloud Console'da Cloud Run hizmetinize gidin
  2. "SÜREKLİ YAYIMLAMAYI OLUŞTUR" düğmesini tıklayın
  3. GitHub ile kimlik doğrulaması yapın ve mikro hizmetinizin deposunu seçin

a3b5692f178869bc.png

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

338f1c00f33d2f65.png

  1. Derleme türünü, Buildpack'leri kullanacak şekilde ayarlama
  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 manuel olarak kaydedilen bilgileri gösterir. Uyarılar, bir sorun olduğunda bilgilendirilmemizi sağlar. Bunların her birini daha ayrıntılı olarak inceleyelim.

Metrikler

  1. Cloud Run hizmetlerinin listesinde hizmetinizi bulun.
  2. Hizmetinizin adını tıklayarak metrik kontrol panelini ziyaret edin.

8491b8ec6bc5b4db.png

  1. Bir metriğin menüsünü tıklayın ve 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 hizmet yöneticisi sayfasından temel bir günlük görünümüne erişebilirsiniz. Örneğin:

40058a82c9299cff.png

Cloud Run günlüklerinde, günlükleri önem düzeyine göre filtreleyebilirsiniz. Daha fazla esneklik için şunları tıklayın: 186fdb0e6d39a6ca.png

Uyarılar

  1. Hizmetiniz için bir sağlık 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 öğesini 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 makine 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 rekabet edebilecek bir mikro hizmeti başarıyla oluşturdunuz ve dağıttınız. İyi şanslar!

Referans Dokümanları