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 bir 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ı derlemeye odaklanabilirsiniz.

2. Öğrenecekleriniz

Bu laboratuvarda aşağıdakileri nasıl yapacağınızı öğreneceksiniz:

  • Spanner'ı entegre etme
  • Spanner Yönetilen Hizmetleri'ni etkinleştirme
  • Koda entegre etme
  • Spanner'a bağlanan kodu dağıtma
  • Firestore'u entegre etme
  • Firestore Yönetilen Hizmetlerini etkinleştir
  • Koda entegre etme
  • Firestore'a bağlanan kodu dağıtma

3. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp 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. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğinizi (genellikle PROJECT_ID olarak tanımlanır) belirtmeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz olması açısından, bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmanın tekrarlanmasını önlemek amacıyla kaynakları kapatmak için oluşturduğunuz kaynakları silebilir veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden 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ştirme
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 hizmetleri arka uç ilişkisel veritabanıdır. Aşağıdaki adımlarda bir Spanner örneği, veritabanı ve şeması 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 yapılandırılıp yapılandırılmadığını doğrulama
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ımı 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üleyin
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. Buna ek olarak SQL Spanner, Spanner'ı herhangi bir uygulamaya entegre etmenize olanak tanıyan İstemci kitaplıkları, JDBC sürücüleri, R2DBC sürücüleri, REST API'leri ve RPC API'leri de sağlar.

Sonraki bölümde, Spanner'da veri yüklemek, verileri 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 Uygulama Varsayılan Kimlik Bilgilerini (ADC) otomatik olarak kullanarak Cloud Spanner ile entegrasyonu kolaylaştırır.

Kimlik doğrulamayı ayarlayın

Google Cloud KSA 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. Uygulama Varsayılan Kimlik Bilgileri adlı bu strateji, birden fazla ortamda kod taşınabilirliği sağlar.

Ancak en iyisi, varsayılan hizmet hesabı yerine kullanıcı tarafından yönetilen bir hizmet hesabı atayarak özel bir kimlik oluşturmaktır.

  1. Hizmet hesabına Spanner Veritabanı Yöneticisi rolü verme
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 mevcuttur.

Spanner istemcisi oluşturma

Spanner istemcisi, Cloud Spanner veritabanında veri okumak ve yazmak için kullanılan bir istemcidir. Bir istemci, Close yöntemi dışında eş zamanlı olarak kullanılabilir.

Aşağıdaki snippet, bir anahtar istemcisi oluşturuyor

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 İstemci üzerinden geçmelidir. Genellikle uygulamanız başlatıldığında bir İstemci oluşturursunuz ve ardından bu istemciyi işlemleri okumak, yazmak ve yürütmek için yeniden kullanırsınız. Her istemci, Cloud Spanner'daki kaynakları kullanır.

Verileri değiştirme

Spanner veritabanından veri eklemenin, güncellemenin ve silmenin birden çok 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

Dönüşüm, mutasyon işlemleri için bir container'dır. Mutasyon, Cloud Spanner'ın bir Cloud Spanner veritabanındaki farklı satır ve tablolara temel olarak uyguladığı ekleme, güncelleme ve silme işlemlerini ifade 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

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

Uygulamayı Cloud Run'a dağıtma

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

  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 depolayın
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 ekle

  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, bildirim temelli SQL ifadeleri kullanarak veritabanlarını sorgular. SQL ifadeleri, sonuçların nasıl elde edileceğini açıklamadan kullanıcının ne istediğini gösterir.

  1. Terminalde, daha önce oluşturulan kayıt için tabloyu sorgulamak üzere 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ı almanın birkaç yolu 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 git
  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 bir görsel yürütme planı gösterir.

149f8bae468f8b34.png

Sorgu optimize edici

Cloud Spanner sorgu optimize edici, alternatif yürütme planlarını karşılaştırır ve en verimli olanı seçer. Zaman içinde, Sorgu Optimize Edici gelişerek sorgu yürütme planındaki seçenekleri genişletecek ve bu seçeneklere bilgi sağlayan tahminlerin doğruluğunu iyileştirecek, böylece daha etkili sorgu yürütme planları ortaya çıkacaktır.

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ü, ilgili sürüm yayınlandıktan en az 30 gün sonra kullanmaya başlar.

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

  1. Optimize Edici 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:

Optimize Edici sürümünü güncelle

Bu laboratuvarın yapıldığı tarihteki en yeni sürüm 4'tür. Ardından, sorgu optimize edici için sürüm 4'ü kullanmak üzere Spanner Tablosunu güncelleyeceksiniz.

  1. Optimize Edici'yi 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. Optimize Edici 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ştirin

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

  1. Cloud Console'da Monitoring'e gidin ve soldaki menüden 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çin ve Uygula'yı tıklayın.
  4. Gruplandırma Ölçütü alanında veritabanı, optimize_version ve durum özelliklerini 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ş NoSQL belge veritabanıdır. Firestore arayüzü, geleneksel veritabanlarıyla aynı özelliklere sahip olsa da, veri nesneleri arasındaki ilişkileri tanımlama açısından NoSQL veritabanı onlardan farklıdır.

Aşağıdaki görev, Firestore tarafından desteklenen bir sipariş hizmeti Cloud Run uygulaması oluşturmada size yol gösterecektir. Sipariş hizmeti, siparişi başlatmadan önce Spanner veritabanını sorgulamak için önceki bölümde oluşturulan envanter hizmetini çağırır. Bu hizmet, yeterli envanterin mevcut olmasını ve siparişin doldurulabilmesini sağlar.

6843abaf4263e112.png

8. Firestore Kavramları

Veri modeli

Firestore veritabanı, koleksiyonlar ve belgelerden oluşur.

b60acd63d4793a6c.png

Dokümanlar

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

5571cb2f261d2dbe.png

Koleksiyonlar

Tüm dokümanları koleksiyonlarda depolamanız gerekir. Belgeler, dizeler gibi temel alanlar veya listeler gibi karmaşık nesneler 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 hizmeti hesapları ekleyecek, Firestore güvenlik kurallarını gözden geçirip dağıtacak ve verilerin Firestore'da nasıl değiştirildiğini inceleyeceksiniz.

Kimlik doğrulamayı ayarlayın

  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ğrulamanın etkileyici ama basit bir biçimi sağlar.

  1. Order-service/starter-code dizinine gidin
cd ~/cymbal-eats/order-service
  1. firestore.rules dosyasını bulut düzenleyicide 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ı: En iyi uygulama, Firestore depolama alanına erişimi sınırlamaktır. Bu laboratuvarın amacı doğrultusunda tüm okumalara izin verilir. Bu, tavsiye edilen bir üretim yapılandırması değildir.

Firestore Yönetilen Hizmetlerini etkinleştir

  1. Terminali aç'ı tıklayın.
  2. Geçerli proje kimliğiyle .firebaserc dosyası oluşturun. Dağıtım hedeflerine ilişkin ayarlar proje dizininizdeki .firebaserc dosyasında depolanır.

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. Firebase ikili programını indir
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 doğrudan Firestore'da oluşturulur. Bir koleksiyondaki dokümana veri atamanız yeterlidir. Koleksiyon veya belge yoksa Firestore oluşturur.

Firestore'a veri ekleyin

Cloud Firestore'a veri yazmanın birkaç yolu vardır:

  • Açıkça bir doküman tanımlayıcı belirterek koleksiyon içindeki dokümanın verilerini ayarlayın.
  • Koleksiyona yeni doküman ekleyin. Bu durumda, Cloud Firestore otomatik olarak belge tanımlayıcısını oluşturur.
  • Otomatik olarak oluşturulmuş bir tanımlayıcıyla boş bir doküman oluşturun ve bu dokümana daha sonra veri atayın.

Bir sonraki bölüm, ayarlama yöntemini kullanarak doküman oluşturma konusunda size yol gösterecektir.

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 doküman kimliği 123'ü belirten bir doküman oluşturur. Firestore'un sizin adınıza kimlik oluşturmasını sağlamak için add() veya create() yöntemini kullanın.

Belgeleri güncelleme

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

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

index.js

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

Dokümanları silme

Firestore'da bir dokümandaki koleksiyonları, belgeleri veya belirli alanları silebilirsiniz. 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 depolayı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 saklama
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Bir sipariş isteği oluşturun ve Firestore veritabanına yeni bir sipariş yayınlayın
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 kaydetme

export ORDER_NUMBER=<value_from_output>

Sonuçları görüntüle

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

  1. Firestore konsoluna gidin
  2. Veriler'i tıklayın

465ceca6198b2b88.png

Doküman güncelleme

Gönderilen siparişte miktar yer almıyordu.

  1. Kaydı güncelleme ve miktar anahtar/değer çifti ekleme
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üleyin

  1. Firestore konsoluna gidin
  2. Veriler'i tıklayın

cfcf78d200e15b84.png

Doküman silme

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

Sonuçları görüntüle

  1. Firestore konsoluna gidin
  2. Veriler'i 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ğiticide kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız kaynakları içeren projeyi silin veya projeyi tutup tek tek kaynakları silin.

Projeyi silme

Faturalandırmayı ortadan kaldırmanın en kolay yolu, eğitim için oluşturduğunuz projeyi silmektir.