Mikro Hizmet Gökkuşağı Rompus

1. Giriş

Son Güncelleme Tarihi: 06.05.2021

Mikro Hizmet Gökkuşağı Rumpusu

Hiç etrafta dolanıp başkalarına kartopu fırlattığınız bir kartopu savaşı yaptınız mı? Yoksa bir gün tekrar deneyin! Ancak artık fiziksel olarak vurma riskini almak yerine, diğer mikro hizmetlere karşı kartopu yerine gökkuşağı fırlatarak destansı bir savaşa katılacak küçük, ağa bağlı bir hizmet (mikro hizmet) oluşturabilirsiniz.

Merak ediyor olabilirsiniz... Peki bir mikro hizmet nasıl "fırlatıcı" gökkuşağı olduğunu biliyor muydunuz? Mikro hizmetler, ağ istekleri (genellikle HTTP üzerinden) alabilir ve yanıtlar döndürebilir. Bir "arena yöneticisi" vardır mikro hizmetinize arenanın mevcut durumunu gönderir ve mikro hizmetiniz ne yapılacağını belirten bir komutla yanıt verir.

Elbette hedefiniz kazanmak olsa da bu süreçte Google Cloud'da mikro hizmetler derleme ve dağıtma hakkında bilgi edineceksiniz.

İşleyiş şekli

İstediğiniz teknolojiyle bir mikro hizmet derleyecek (veya Go, Java, Kotlin, Scala, NodeJS ya da Python başlatıcılarından birini seçerek) mikro hizmeti Google Cloud'da dağıtacaksınız. Dağıtımdan sonra mikro hizmetinizin URL'sini bize bildirip arenaya ekleyeceğiz.

Arenada belirli bir savaştaki tüm oyuncular yer alır. Gökkuşağı Rumpus'un kendi arenaları vardır. Her oyuncu, etrafta dolaşan ve diğer oyunculara gökkuşağı fırlatan bir mikro hizmeti temsil eder.

Arena yöneticimiz yaklaşık saniyede bir kez mikro hizmetinizi arayarak mevcut arena durumunu (oyuncuların bulunduğu yer) gönderir ve mikro hizmetiniz, 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ğı, oynatıcının baktığı yönde en fazla üç boşluk gider. Gökkuşağı "vurursa" atış yapan oyuncu bir puan alır ve vuran oyuncu bir puan kaybeder. Arena boyutu, mevcut oyuncu sayısına göre otomatik olarak ayarlanır.

Eski bir arena şu şekilde görünür:

20628e6bd442bd11.png

Örnek Battle One arenası

Dönen Çatışmalar

Arenada birden fazla oyuncu birbiriyle çelişen işlemler gerçekleştirmeye çalışabilir. Örneğin, iki oyuncu aynı alana taşınmaya çalışabilir. Çakışma durumunda, en hızlı yanıt süresine sahip mikro hizmet kazanır.

Savaşı izleme

Mikro hizmetinizin savaşta performansını öğrenmek için canlı arenaya göz atın.

Battle API

Arena yöneticimizle birlikte çalışmak için mikro hizmetinizin arenaya katılmak için belirli bir API uygulaması gerekir. Arena yöneticisi, mevcut arena durumunu HTTP POST'ta bize gönderdiğiniz URL'ye aşağıdaki JSON yapısıyla 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, sonraki taşımanızı içeren ve aşağıdakilerden birinin tek büyük harfli karakteri olarak kodlanmış bir yanıt gövdesine sahip 200 (Tamam) durum kodu olmalıdır:

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

Hepsi bu kadar! Mikro hizmetleri ve diğer uygulamaları çalıştırmaya yönelik bir Google Cloud hizmeti olan Cloud Run'da mikro hizmet dağıtmaya göz atalım.

2. Google Cloud'a giriş yapın

Mikro hizmetinizi Cloud Run'da dağıtabilmek için Google Cloud'a giriş yapmanız gerekir. Böylece hesabınıza kredi uygulanır ve kredi kartı girmeniz gerekmez. G Suite hesapları yerine kişisel bir hesap (ör. gmail.com) kullanmak genellikle daha az sorunludur; çünkü bazen G Suite yöneticileri, kullanıcılarının belirli Google Cloud özelliklerini kullanmasını engeller. Ayrıca, kullanacağımız web konsolunun Chrome veya Firefox ile sorunsuz çalışması beklenir ancak Safari'de sorunlar yaşanabilir.

3. Mikro Hizmetinizi Dağıtma

Mikro hizmetinizi dilediğiniz teknolojiyle derleyebilir, herkese açık olduğu 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 bu hizmeti Cloud Run'da dağıtmanıza yardımcı olacağız.

Başlamak İçin Sana Özel içeriklerini seçin

Başlayabileceğiniz çok sayıda savaş mikro hizmet örneği vardır:

Kotlin ve Yazlık Bot

Kaynak

Kotlin ve Micronaut

Kaynak

Kotlin ve Quarkus

Kaynak

Java ve Yazlık Bot

Kaynak

Java ve Quarkus

Kaynak

Go

Kaynak

Node.js ve Ekspres

Kaynak

Python ve Alkollü İçki Matarası

Kaynak

Hangi örnekle başlayacağınıza karar verdikten sonra "Cloud Run'da dağıt"ı tıklayın. düğmesini tıklayın. Bu işlem, kaynağın klonlanacağı, ardından dağıtılabilir bir pakete (bir Docker container görüntüsü) yerleştirileceği ve ardından Google Container Registry'ye yüklenip Cloud Run'a dağıtılacağı Cloud Shell'i (buluttaki bir sanal makineye yönelik web tabanlı bir konsol) başlatacaktır.

Sorulduğunda, us-central1 bölgesini belirtin.

Aşağıdaki ekran görüntüsünde, mikro hizmet derlemesi ve dağıtımı için Cloud Shell çıkışı gösterilmektedir

d88e40430706a32b.png

Mikro hizmetin çalıştığını doğrulama

Cloud Shell'de, yeni dağıtılan mikro hizmetinize YOUR_SERVICE_URL yerine hizmetinizin URL'sini yazarak istek gönderebilirsiniz. Hizmet URL'si, Cloud Shell'de "Uygulamanız artık burada yayında" satırından sonra yer alır:

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öreceksiniz.

4. Arenaya Katılım İsteğinde Bulunma

Rainbow Rumpus'a katılmak için bir arenaya katılmanız gerekir. Mikro hizmetinizin URL'sini sağlayacağınız arenada rainbowrumpus.dev adresini açın.

5. Marka ve Değişiklikleri Dağıtma

Değişiklik yapmadan önce, Cloud Shell'de GCP projesi ve kullandığınız örnekle ilgili bazı bilgileri ayarlamanız gerekir. İlk olarak GCP projelerinizi listeleyin:

gcloud projects list

Muhtemelen yalnızca bir projeniz vardır. İlk 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). Böylece, sonraki komutlarda kullanacağımız bir ortam değişkeni belirleyebilirsiniz:

export PROJECT_ID=YOUR_PROJECT_ID

Şimdi, sonraki komutlarda doğru dizini ve hizmet adını belirtebilmemiz için, kullandığınız örnekle ilgili başka bir ortam değişkeni ayarlayın:

# 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 içinden 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 projenin açık olduğu düzenleyiciyi içeren Cloud Shell

Değişikliklerinizi kaydettikten sonra README.md dosyasındaki komutu kullanarak uygulamayı Cloud Shell'de başlatın. Ancak önce Cloud Shell'de doğru örnek dizinde 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'ü 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 container görüntüsü) oluşturmak için Buildpacks'i 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 container görüntüsünü Google Container Registry'ye aktarmak için Docker komutunu (Cloud Shell'de) kullanın. Böylece, Cloud Run bu görüntüye erişebilir:

docker push gcr.io/$PROJECT_ID/$SAMPLE

Şimdi yeni sürümü Cloud Run'da 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ştirin (İsteğe Bağlı)

Aşağıdaki adımları uygulayarak kendi IDE'nizi kullanarak projeniz üzerinde 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. [Makinenizde] Dosyanın sıkıştırmasını açın ve & değişikliklerinizi test edin
  2. [Makinenizde] gcloud KSA'yı yükleme
  3. [Makinenizde] Google Cloud'a giriş yapın:
gcloud auth login
  1. [Makinenizde] PROJECT_ID ve SAMPLE ortam değişkenlerini Cloud Shell'dekilerle aynı değerlere ayarlayın.
  2. [Makinenizde] Container'ı derlemek 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 container'ı 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 kurulumu

Mikro hizmetinizde ekibinizle ortak çalışmak için GitHub'ı kurun:

  1. GitHub'a giriş yap
  2. Yeni depo oluşturma
  3. Yerel makinenizde çalışıyorsanız git komut satırı arayüzünü (KSA) veya GitHub Masaüstü GUI uygulamasını (Windows veya Mac) kullanabilirsiniz. Cloud Shell kullanıyorsanız git CLI'ı kullanmanız gerekir. Mikro hizmetinizin kodunu GitHub'da almak için CLI veya GitHub Masaüstü talimatlarını uygulayın.

Kodunuzu git CLI ile aktarma

  1. Kişisel erişim jetonuyla https üzerinden git talimatlarını uygulayın
  2. "Depo"yu seçin kapsam
  3. Git'i ayarlayın:
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 kod deposu için env değişkenleri ayarla (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. Herhangi bir değişiklik yaptıktan sonra değişiklikleri uygulayabilir ve GitHub'a aktarabilirsiniz:
git add .
git status
git diff --staged
git commit -am "my changes"
git push

GitHub masaüstü ile kodunuzu aktarın

  1. Önceki "Yerel Olarak Geliştirme" bölümünde bulunan talimatları uygulayarak kodunuzu indirme laboratuvar
  2. GitHub Desktop'ı yükleyin, başlatın ve giriş yapın
  3. Yeni oluşturulan deponuzu klonlama

cf7f38c7c86a91cd.png

  1. Dosya gezgininizi açın ve projenizi yeni depoya kopyalayın
  2. Değişikliklerinizi kaydedin

5f3c1552e30ad7c5.png

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

Cloud Run Sürekli Dağıtımını Ayarlama

GitHub'daki SCM kurulumunuzla artık Sürekli Teslim'i ayarlayabilirsiniz. Böylece, main dalına her yeni kayıt aktarıldığında, Cloud Build değişiklikleri otomatik olarak derleyip dağıtır. Dağıtım öncesinde testlerinizi çalıştıran Sürekli Entegrasyon'u da ekleyebilirsiniz. Ancak kullanıma 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ĞITIM AYARLA"yı tıklayın düğme
  3. GitHub ile kimlik doğrulaması yapın ve mikro hizmetinizin deposunu seçin

a3b5692f178869bc.png

  1. GitHub deponuzu seçin ve dalı ^main$ olarak ayarlayın.

338f1c00f33d2f65.png

  1. Buildpacks'i kullanmak için Derleme Türü'nü ayarlama
  2. Sürekli Dağıtım'ı ayarlamak için Kaydet'i tıklayın.

8. Gözlemlenebilirlik

işler bozulur. Gözlemlenebilirlik bize bunun ne zaman gerçekleştiğini bilme ve nedenini teşhis etme imkanı tanır. Metrikler, hizmetimizin durumu ve kullanımı ile ilgili verileri gösterir. Günlükler, hizmetimizden yayınlanan manuel olarak düzenlenmiş bilgileri gösterir. Uyarılar, bir sorun olduğunda bildirim almamızı sağlar. Bunların her birini daha ayrıntılı inceleyelim.

Metrikler

  1. Hizmetinizi Cloud Run hizmetleri listesinde bulun
  2. Metrik kontrol panelini ziyaret etmek 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 alınan STDOUT çıkışı Google Cloud Logging sistemine gönderilir. Cloud Run hizmet yöneticisi sayfasından temel günlük görünümlerine 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 tıklayın: 186fdb0e6d39a6ca.png

Uyarılar

  1. Hizmetiniz için bir ısı 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 bir çalışma süresi uyarısı oluşturun. Spring Boot için yol şudur: /actuator/health
  2. Uyarıyı test etme

6948d13b263bf573.png

  1. Uyarıyı oluştur

9. Tebrikler

Tebrikler, diğer mikro hizmetlerle savaşabilecek bir mikro hizmeti başarıyla derleyip dağıttınız. İyi şanslar!

Referans Belgeler