Cloud Run'dan Tümüyle Yönetilen Veritabanlarına Bağlanma

1. Genel Bakış

Bu laboratuvarda, sunucusuz veritabanlarını(Spanner ve Firestore) Cloud Run'da çalışan uygulamalarla(Go ve Node.js) entegre edeceksiniz. Cymbal Eats uygulaması, Cloud Run'da çalışan birden fazla hizmet içerir. Aşağıdaki adımlarda, hizmetleri Cloud Spanner ilişkisel veritabanını ve NoSQL belge veritabanı olan Cloud Firestore'u kullanacak şekilde yapılandıracaksınız. Veri katmanı ve uygulama çalışma zamanı için sunucusuz ürünler kullanmak, tüm altyapı yönetimini soyutlamanıza olanak tanır. Böylece, ek yük konusunda endişelenmek yerine uygulamanızı oluşturmaya odaklanabilirsiniz.

2. Öğrenecekleriniz

Bu laboratuvarda şunları yapmayı öğreneceksiniz:

  • Spanner'ı entegre etme
  • Spanner Managed Services'i etkinleştirme
  • Koda entegre etme
  • Spanner'a bağlanan kodu dağıtma
  • Firestore'u entegre etme
  • Firestore Managed Services'i etkinleştirme
  • Koda entegre etme
  • Firestore'a bağlanan kodu dağıtma

3. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Bu bilgiyi istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Ortamı ayarlama

  1. Proje kimliği değişkeni oluşturma
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export SPANNER_INSTANCE=inventory-instance
export SPANNER_DB=inventory-db
export REGION=us-east1
export SPANNER_CONNECTION_STRING=projects/$PROJECT_ID/instances/$SPANNER_INSTANCE/databases/$SPANNER_DB
  1. Spanner, Cloud Run, Cloud Build ve Artifact Registry API'lerini etkinleştirin.
gcloud services enable \
     compute.googleapis.com \
     spanner.googleapis.com \
     run.googleapis.com \
     cloudbuild.googleapis.com \
     artifactregistry.googleapis.com \
     firestore.googleapis.com \
     appengine.googleapis.com \
     artifactregistry.googleapis.com
  1. Depoyu klonlama
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. Dizine gidin.
cd cymbal-eats/inventory-service/spanner

4. Spanner örneği oluşturma ve yapılandırma

Spanner, envanter hizmetlerinin arka uç ilişkisel veritabanıdır. Aşağıdaki adımlarda Spanner örneği, veritabanı ve şema oluşturacaksınız.

Örnek oluşturma

  1. Cloud Spanner örneği oluşturma
gcloud spanner instances create $SPANNER_INSTANCE --config=regional-${REGION} \
--description="Cymbal Menu Inventory" --nodes=1

Örnek Çıkış

Creating instance...done.   
  1. Spanner örneğinin doğru şekilde yapılandırılıp yapılandırılmadığını doğrulayın.
gcloud spanner instances list

Örnek çıkış

NAME: inventory-instance
DISPLAY_NAME: Cymbal Menu Inventory
CONFIG: regional-us-east1
NODE_COUNT: 1
PROCESSING_UNITS: 100
STATE: READY

Veritabanı ve şema oluşturma

Yeni bir veritabanı oluşturun ve veritabanı şemasını oluşturmak için Google standart SQL'in veri tanımlama dilini (DDL) kullanın.

  1. DDL dosyası oluşturma
echo "CREATE TABLE InventoryHistory (ItemRowID STRING (36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, Timestamp TIMESTAMP) PRIMARY KEY(ItemRowID)" >> table.ddl
  1. Spanner veritabanını oluşturma
gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl-file=table.ddl

Örnek çıkış

Creating database...done.

Veritabanı durumunu ve şemasını doğrulama

  1. Veritabanının durumunu görüntüleme
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Örnek çıkış

createTime: '2022-04-22T15:11:33.559300Z'
databaseDialect: GOOGLE_STANDARD_SQL
earliestVersionTime: '2022-04-22T15:11:33.559300Z'
encryptionInfo:
- encryptionType: GOOGLE_DEFAULT_ENCRYPTION
name: projects/cymbal-eats-7-348013/instances/menu-inventory/databases/menu-inventory
state: READY
versionRetentionPeriod: 1h
  1. Veritabanının şemasını görüntüleme
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Örnek çıkış

CREATE TABLE InventoryHistory (
  ItemRowID STRING(36) NOT NULL,
  ItemID INT64 NOT NULL,
  InventoryChange INT64,
  TimeStamp TIMESTAMP,
) PRIMARY KEY(ItemRowID);

5. Spanner'ı entegre etme

Bu bölümde, Spanner'ı uygulamanıza nasıl entegre edeceğinizi öğreneceksiniz. Ayrıca SQL Spanner, istemci kitaplıkları, JDBC sürücüleri, R2DBC sürücüleri, REST API'leri ve RPC API'leri sunar. Bu sayede Spanner'ı herhangi bir uygulamaya entegre edebilirsiniz.

Sonraki bölümde, Spanner'da veri yüklemek, kimlik doğrulamak ve değiştirmek için Go istemci kitaplığını kullanacaksınız.

İstemci kitaplığını yükleme

Cloud Spanner istemci kitaplığı, hizmet hesabı kimlik bilgilerinizi bulmak için otomatik olarak Uygulama Varsayılan Kimlik Bilgileri'ni (ADC) kullanarak Cloud Spanner ile entegrasyonu kolaylaştırır.

Kimlik doğrulama ayarlama

Google Cloud CLI ve Google Cloud istemci kitaplıkları, Google Cloud'da çalıştıklarını otomatik olarak algılar ve mevcut Cloud Run düzeltmesinin çalışma zamanı hizmet hesabını kullanır. Bu stratejiye Uygulama Varsayılan Kimlik Bilgileri adı verilir ve birden fazla ortamda kod taşınabilirliğini sağlar.

Ancak, varsayılan hizmet hesabı yerine kullanıcı tarafından yönetilen bir hizmet hesabı atayarak özel bir kimlik oluşturmanız önerilir.

  1. Hizmet hesabına Spanner Database Admin rolünü verin.
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"

Örnek çıkış

Updated IAM policy for project [cymbal-eats-6422-3462].
[...]

İstemci kitaplıklarını kullanma

Spanner istemci kitaplıkları, Spanner ile entegrasyonun karmaşıklığını ortadan kaldırır ve birçok popüler programlama dilinde kullanılabilir.

Spanner istemcisi oluşturma

Spanner istemcisi, Cloud Spanner veritabanına veri okuma ve yazma için kullanılan bir istemcidir. Bir istemcinin Close yöntemi hariç olmak üzere eşzamanlı olarak kullanılması güvenlidir.

Aşağıdaki snippet, bir Spanner istemcisi oluşturur.

main.go

var dataClient *spanner.Client
...
dataClient, err = spanner.NewClient(ctx, databaseName)

İstemciyi bir veritabanı bağlantısı olarak düşünebilirsiniz: Cloud Spanner ile tüm etkileşimleriniz bir istemci üzerinden gerçekleşmelidir. Genellikle uygulamanız başlatıldığında bir istemci oluşturur, ardından işlemleri okumak, yazmak ve yürütmek için bu istemciyi yeniden kullanırsınız. Her istemci, Cloud Spanner'daki kaynakları kullanır.

Verileri değiştirme

Spanner veritabanına veri eklemenin, verileri güncellemenin ve silmenin birden fazla yolu vardır. Kullanabileceğiniz yöntemler aşağıda listelenmiştir.

Bu laboratuvarda, Spanner'daki verileri değiştirmek için mutasyonları kullanacaksınız.

Spanner'daki değişiklikler

Mutasyon, mutasyon işlemlerinin kapsayıcısıdır. Mutasyon, Cloud Spanner'ın bir Cloud Spanner veritabanındaki farklı satırlara ve tablolara atomik olarak uyguladığı bir ekleme, güncelleme ve silme dizisini temsil eder.

main.go

m := []*spanner.Mutation{}

m = append(m, spanner.Insert(
        "inventoryHistory",
         inventoryHistoryColumns,
        []interface{}{uuid.New().String(), element.ItemID, element.InventoryChange, time.Now()}))

Kod snippet'i, envanter geçmişi tablosuna yeni bir satır ekler.

Dağıtım ve Test

Spanner yapılandırıldığına ve temel kod öğelerini incelediğinize göre uygulamayı Cloud Run'a dağıtın.

Uygulamayı Cloud Run'a dağıtma

Cloud Run, kodunuzu tek bir komutla otomatik olarak derleyebilir, gönderebilir ve dağıtabilir. Aşağıdaki komutta, deploy hizmetinde run komutunu çağıracak ve çalışan uygulama tarafından kullanılan değişkenleri (ör. daha önce oluşturduğunuz SPANNER_CONNECTION_STRING) ileteceksiniz.

  1. Terminali aç'ı tıklayın.
  2. Envanter hizmetini Cloud Run'a dağıtma
gcloud run deploy inventory-service \
    --source . \
    --region $REGION \
    --update-env-vars SPANNER_CONNECTION_STRING=$SPANNER_CONNECTION_STRING \
    --allow-unauthenticated \
    --project=$PROJECT_ID \
    --quiet

Örnek çıkış

Service [inventory-service] revision [inventory-service-00001-sug] has been deployed and is serving 100 percent of traffic.
Service URL: https://inventory-service-ilwytgcbca-uk.a.run.app
  1. Hizmet URL'sini saklama
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")

Cloud Run uygulamasını test etme

Öğe ekleme

  1. Cloud Shell'de aşağıdaki komutu girin.
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
    {
        "itemID": 1,
        "inventoryChange": 5
    }
]'

Örnek çıkış

HTTP/2 200
access-control-allow-origin: *
content-type: application/json
x-cloud-trace-context: 10c32f0863d26521497dc26e86419f13;o=1
date: Fri, 22 Apr 2022 21:41:38 GMT
server: Google Frontend
content-length: 2

OK

Öğe sorgulama

  1. Envanter hizmetini sorgulama
GET_URL=$INVENTORY_SERVICE_URL/getAvailableInventory
curl -i ${GET_URL}

Örnek yanıt

HTTP/2 200
access-control-allow-origin: *
content-type: text/plain; charset=utf-8
x-cloud-trace-context: b94f921e4c2ae90210472c88eb05ace8;o=1
date: Fri, 22 Apr 2022 21:45:50 GMT
server: Google Frontend
content-length: 166

[{"ItemID":1,"Inventory":5}]

6. Spanner Kavramları

Cloud Spanner, veritabanlarını bildirimsel SQL ifadeleriyle sorgular. SQL ifadeleri, sonuçların nasıl elde edileceğini açıklamadan kullanıcının ne istediğini belirtir.

  1. Terminalde, daha önce oluşturulan kaydı sorgulamak için bu komutu girin.
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'

Örnek çıkış

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp: 

Sorgu yürütme planları

Sorgu yürütme planı, Spanner'ın sonuçları elde etmek için kullandığı bir dizi adımdır. Belirli bir SQL ifadesinin sonuçlarını elde etmenin çeşitli yolları olabilir. Sorgu yürütme planlarına konsoldan ve istemci kitaplıklarından erişilebilir. Spanner'ın SQL sorgularını nasıl işlediğini görmek için:

  1. Konsolda Cloud Spanner örnekleri sayfasını açın.
  2. Cloud Spanner örneklerine gitme
  3. Cloud Spanner örneğinin adını tıklayın. Veritabanları bölümünde sorgulamak istediğiniz veritabanını seçin.
  4. Sorgu'yu tıklayın.
  5. Sorgu düzenleyiciye aşağıdaki sorguyu girin.
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. ÇALIŞTIR'ı tıklayın.
  2. AÇIKLAMA'yı tıklayın.

Cloud Console, sorgunuz için görsel bir yürütme planı gösterir.

149f8bae468f8b34.png

Sorgu optimize edici

Cloud Spanner sorgu optimize edicisi, alternatif yürütme planlarını karşılaştırır ve en verimli olanı seçer. Zaman içinde sorgu optimizasyon aracı gelişerek sorgu yürütme planındaki seçenekleri genişletecek ve bu seçenekleri belirleyen tahminlerin doğruluğunu artıracak. Bu da daha verimli sorgu yürütme planları oluşturulmasını sağlayacak.

Cloud Spanner, optimize edici güncellemelerini yeni sorgu optimize edici sürümleri olarak kullanıma sunar. Varsayılan olarak, her veritabanı, optimize edicinin en son sürümünü yayınlandıktan en erken 30 gün sonra kullanmaya başlar.

gcloud spanner'da sorgu çalıştırılırken kullanılan sürümü görmek için –query-mode işaretini PROFILE olarak ayarlayın.

  1. Optimizasyon aracı sürümünü görüntülemek için aşağıdaki komutu girin.
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Örnek çıkış

TOTAL_ELAPSED_TIME: 6.18 msecs
CPU_TIME: 5.17 msecs
ROWS_RETURNED: 1
ROWS_SCANNED: 1
OPTIMIZER_VERSION: 3
 RELATIONAL Distributed Union
 (1 execution, 0.11 msecs total latency)
 subquery_cluster_node: 1
    |
    +- RELATIONAL Distributed Union
    |  (1 execution, 0.09 msecs total latency)
    |  call_type: Local, subquery_cluster_node: 2
    |   |
    |   \- RELATIONAL Serialize Result
    |      (1 execution, 0.08 msecs total latency)
    |       |
    |       +- RELATIONAL Scan
    |       |  (1 execution, 0.08 msecs total latency)
    |       |  Full scan: true, scan_target: InventoryHistory, scan_type: TableScan
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  ItemRowID
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  ItemID
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  InventoryChange
    |       |   |
    |       |   \- SCALAR Reference
    |       |      Timestamp
    |       |
    |       +- SCALAR Reference
    |       |  $ItemRowID
    |       |
    |       +- SCALAR Reference
    |       |  $ItemID
    |       |
    |       +- SCALAR Reference
    |       |  $InventoryChange
    |       |
    |       \- SCALAR Reference
    |          $Timestamp
    |
    \- SCALAR Constant
       true

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp:

Optimizasyon aracının sürümünü güncelleme

Bu laboratuvarın yapıldığı sırada en yeni sürüm 4. sürümdür. Ardından, sorgu optimize edicinin 4. sürümünü kullanmak için Spanner tablosunu güncelleyeceksiniz.

  1. Optimizasyon aracını güncelleme
gcloud spanner databases ddl update $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl='ALTER DATABASE InventoryHistory
SET OPTIONS (optimizer_version = 4)'

Örnek çıkış

Schema updating...done. 
  1. Optimizasyon aracı sürüm güncellemesini görüntülemek için aşağıdaki komutu girin.
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Örnek çıkış

TOTAL_ELAPSED_TIME: 8.57 msecs
CPU_TIME: 8.54 msecs
ROWS_RETURNED: 1
ROWS_SCANNED: 1
OPTIMIZER_VERSION: 4
[...]

Metrik Gezgini'nde sorgu optimize edici sürümünü görselleştirme

Veritabanı örneğinizin Sorgu sayısı metriğini görselleştirmek için Cloud Console'daki Metrik Gezgini'ni kullanabilirsiniz. Her veritabanında hangi optimize edici sürümünün kullanıldığını görebilirsiniz.

  1. Cloud Console'da İzleme'ye gidin ve sol menüde Metrik Gezgini'ni seçin.
  2. Kaynak türü alanında Cloud Spanner örneği'ni seçin.
  3. Metrik alanında, Sorgu sayısı'nı seçip Uygula'yı tıklayın.
  4. Group By (Gruplandır) alanında database, optimizer_version ve status'u seçin.

581b859c25790b21.png

7. Firestore veritabanı oluşturma ve yapılandırma

Firestore; otomatik ölçeklendirme, yüksek performans ve uygulama geliştirme kolaylığı için oluşturulmuş bir NoSQL belge veritabanıdır. Firestore arayüzü, geleneksel veritabanlarıyla aynı özelliklerin çoğuna sahip olsa da NoSQL veritabanı, veri nesneleri arasındaki ilişkileri tanımlama konusunda geleneksel veritabanlarından farklıdır.

Aşağıdaki görev, Firestore tarafından desteklenen bir sipariş hizmeti Cloud Run uygulaması oluşturma konusunda size yol gösterecektir. Sipariş hizmeti, siparişe başlamadan önce Spanner veritabanını sorgulamak için önceki bölümde oluşturulan envanter hizmetini çağırır. Bu hizmet, yeterli envanterin bulunduğundan ve siparişin karşılanabileceğinden emin olmanızı sağlar.

6843abaf4263e112.png

8. Firestore Kavramları

Veri modeli

Firestore veritabanı, koleksiyonlar ve dokümanlardan oluşur.

b60acd63d4793a6c.png

Dokümanlar

Her dokümanda bir dizi anahtar/değer çifti bulunur. Firestore, küçük dokümanlardan oluşan büyük koleksiyonları depolamak için optimize edilmiştir.

5571cb2f261d2dbe.png

Koleksiyonlar

Tüm dokümanları koleksiyonlarda saklamanız gerekir. Dokümanlar; dizeler gibi temel alanlar veya listeler gibi karmaşık nesneler de dahil olmak üzere alt koleksiyonlar ve iç içe yerleştirilmiş nesneler içerebilir.

5811378cb721e5ec.png

Firestore veritabanı oluşturma

  1. Firestore veritabanını oluşturma
gcloud firestore databases create --location=$REGION

Örnek çıkış

Success! Selected Google Cloud Firestore Native database for cymbal-eats-6422-3462

9. Firestore'u uygulamanıza entegre etme

Bu bölümde hizmet hesabını güncelleyecek, Firestore erişim hizmet hesapları ekleyecek, Firestore güvenlik kurallarını inceleyip dağıtacak ve Firestore'da verilerin nasıl değiştirildiğini inceleyeceksiniz.

Kimlik doğrulama ayarlama

  1. Hizmet hesabına Datastore kullanıcı rolünü verme
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/datastore.user"

Örnek çıkış

Updated IAM policy for project [cymbal-eats-6422-3462].

Firestore Güvenlik Kuralları

Güvenlik kuralları, erişim denetimi ve veri doğrulamayı ifade eden ancak basit bir biçim sunar.

  1. order-service/starter-code dizinine gidin.
cd ~/cymbal-eats/order-service
  1. firestore.rules dosyasını Cloud Editor'da açın.
cat firestore.rules

firestore.rules

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents { ⇐ All database
    match /{document=**} { ⇐ All documents
      allow read: if true; ⇐ Allow reads
    }
    match /{document=**} {
      allow write: if false; ⇐ Deny writes
    }
  }
}

Uyarı: Firestore depolama alanına erişimi sınırlamak en iyi uygulamadır. Bu laboratuvar için tüm okumalara izin verilir. Bu, önerilen bir üretim yapılandırması değildir.

Firestore Managed Services'i etkinleştirme

  1. Terminali aç'ı tıklayın.
  2. Mevcut proje kimliğiyle .firebaserc dosyası oluşturun. Dağıtım hedeflerinin ayarları, proje dizininizdeki .firebaserc dosyasında saklanır.

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. Firebase ikilisini indirme
curl -sL https://firebase.tools | upgrade=true bash

Örnek çıkış

-- Checking for existing firebase-tools on PATH...
Your machine already has firebase-tools@10.7.0 installed. Nothing to do.
-- All done!
  1. Firestore kurallarını dağıtın.
firebase deploy 

Örnek Çıkış

=== Deploying to 'cymbal-eats-6422-3462'...

i  deploying firestore
i  cloud.firestore: checking firestore.rules for compilation errors...
✔  cloud.firestore: rules file firestore.rules compiled successfully
i  firestore: uploading rules firestore.rules...
✔  firestore: released rules firestore.rules to cloud.firestore

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/cymbal-eats-6422-3462/overview

Verileri değiştirme

Koleksiyonlar ve dokümanlar Firestore'da örtülü olarak oluşturulur. Verileri bir koleksiyondaki dokümana atamanız yeterlidir. Koleksiyon veya belge yoksa Firestore bunları oluşturur.

Firestore'a veri ekleme

Cloud Firestore'a veri yazmanın çeşitli yolları vardır:

  • Bir koleksiyondaki belgenin verilerini, belge tanımlayıcısını açıkça belirterek ayarlayın.
  • Koleksiyona yeni bir doküman ekleme Bu durumda Cloud Firestore, belge tanımlayıcısını otomatik olarak oluşturur.
  • Otomatik olarak oluşturulan tanımlayıcıya sahip boş bir belge oluşturun ve daha sonra bu belgeye veri atayın.

Sonraki bölümde, ayarlanan yöntemi kullanarak doküman oluşturma adımları açıklanmaktadır.

Doküman ayarlama

Doküman oluşturmak için set() yöntemini kullanın. set() yöntemiyle, oluşturulacak doküman için bir kimlik belirtmeniz gerekir.

Aşağıdaki kod snippet'ine göz atın.

index.js

const orderDoc = db.doc(`orders/123`);
await orderDoc.set({
    orderNumber: 123,
    name: Anne,
    address: 555 Bright Street,
    city: Mountain View,
    state: CA,
    zip: 94043,
    orderItems: [id: 1],
    status: 'New'
  });

Bu kod, kullanıcı tarafından oluşturulan 123 kimlikli bir dokümanı belirten bir doküman oluşturur. Firestore'un sizin adınıza kimlik oluşturması için add() veya create() yöntemini kullanın.

Dokümanları güncelleme

Güncelleme yöntemi update(), dokümanın tamamını üzerine yazmadan bazı doküman alanlarını güncellemenize olanak tanır.

Aşağıdaki snippet'te kod, 123 numaralı siparişi günceller.

index.js

const orderDoc = db.doc(`orders/123`);
await orderDoc.update(name: "Anna");

Doküman silme

Firestore'da koleksiyonları, dokümanları veya bir dokümandaki belirli alanları silebilirsiniz. Bir dokümanı silmek için delete() yöntemini kullanın.

Aşağıdaki snippet, 123 numaralı siparişi siler.

index.js

const orderDoc = db.doc(`orders/123`);
await orderDoc.delete();

10. Dağıtım ve Test

Bu bölümde, uygulamayı Cloud Run'a dağıtacak ve oluşturma, güncelleme ve silme yöntemlerini test edeceksiniz.

Uygulamayı Cloud Run'a dağıtma

  1. Envanter Hizmeti ile entegrasyon için URL'yi INVENTORY_SERVICE_URL değişkeninde saklayın.
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")
  1. Sipariş hizmetini dağıtma
gcloud run deploy order-service \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated \
  --project=$PROJECT_ID \
  --set-env-vars=INVENTORY_SERVICE_URL=$INVENTORY_SERVICE_URL \
  --quiet

Örnek çıkış

[...]
Done.
Service [order-service] revision [order-service-00001-qot] has been deployed and is serving 100 percent of traffic.
Service URL: https://order-service-3jbm3exegq-uk.a.run.app

Cloud Run uygulamasını test etme

Doküman oluştur

  1. Sipariş hizmeti uygulamasının URL'sini test için bir değişkende saklayın.
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Sipariş isteği oluşturma ve Firestore veritabanına yeni bir sipariş gönderme
curl --request POST $ORDER_SERVICE_URL/order \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "Jane Doe",
         "email": "Jane.Doe-cymbaleats@gmail.com",
    "address": "123 Maple",
    "city": "Buffalo",
    "state": "NY",
    "zip": "12346",
    "orderItems": [
        {
            "id": 1
        }
    ]
}'

Örnek çıkış

{"orderNumber":46429}

Sipariş numarasını daha sonra kullanmak üzere kaydedin.

export ORDER_NUMBER=<value_from_output>

Sonuçları görüntüle

Sonuçları Firestore'da görüntüleme

  1. Firestore konsoluna gidin.
  2. Verileri tıklayın.

465ceca6198b2b88.png

Doküman güncelleme

Gönderilen siparişte miktar belirtilmemiş.

  1. Kaydı güncelleyin ve bir miktar anahtar/değer çifti ekleyin
curl --location -g --request PATCH $ORDER_SERVICE_URL/order/${ORDER_NUMBER} \
--header 'Content-Type: application/json' \
--data-raw '{
"orderItems": [
        {   
            "id": 1,
            "quantity": 1   
        }
    ]
}'

Örnek çıkış

{"status":"success"}

Sonuçları görüntüle

Sonuçları Firestore'da görüntüleme

  1. Firestore konsoluna gidin.
  2. Verileri tıklayın.

cfcf78d200e15b84.png

Doküman silme

  1. 46429 numaralı öğeyi Firestore sipariş koleksiyonundan sil
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

Sonuçları görüntüle

  1. Firestore konsoluna gidin.
  2. Verileri tıklayın.

73e14d69211d1539.png

11. Tebrikler!

Tebrikler, laboratuvarı tamamladınız.

Sıradaki adım:

Diğer Cymbal Eats codelab'lerini keşfedin:

Temizleme

Bu eğitimde kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini önlemek amacıyla kaynakları içeren projeyi silin veya projeyi koruyup tek tek kaynakları silin.

Projeyi silme

Faturalandırılmanın önüne geçmenin en kolay yolu, eğitim için oluşturduğunuz projeyi silmektir.