Cloud Spanner ile Spring Boot uygulaması

1. Genel Bakış

Cloud Spanner, yüksek oranda kullanılabilir, yatay olarak ölçeklenebilir ve çok bölgeli bir ilişkisel veritabanı yönetim sistemidir. Bu kod laboratuvarında Cloud Spanner'ın en küçük örneği kullanılacaktır. Ancak işiniz bittiğinde bu örneği kapatmayı unutmayın.

Neler öğreneceksiniz?

  • Spring Boot ile veri kaydetmek ve almak için Cloud Spanner'ı kullanma

İhtiyacınız olanlar

  • Google Cloud Platform projesi
  • Chrome veya Firefox gibi bir tarayıcı

Bu eğitimi nasıl kullanacaksınız?

Yalnızca okuyun Okuyun ve alıştırmaları tamamlayın

Google Cloud Platform hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?

Başlangıç Orta İleri

2. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

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

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Proje kimliğini unutmayın. Bu kimlik, tüm Google Cloud projelerinde benzersiz bir addır (Yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu codelab'in ilerleyen kısımlarında PROJECT_ID olarak adlandırılacaktır.

  1. Ardından, Google Cloud kaynaklarını 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ırma ücreti alınmaması için kaynakları nasıl kapatacağınız konusunda size tavsiyelerde bulunan "Temizleme" bölümündeki talimatları uyguladığınızdan emin olun. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ tıklayın.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Cloud Shell'i daha önce hiç başlatmadıysanız ne olduğunu açıklayan bir ara ekran (ekranın alt kısmı) gösterilir. Bu durumda Devam'ı tıkladığınızda bu ekranı bir daha görmezsiniz. Bu tek seferlik ekran aşağıdaki gibi görünür:

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını yalnızca bir tarayıcı veya Chromebook'unuzla yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.

  1. Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu komutu çalıştırın:
gcloud auth list

Komut çıkışı

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Değilse şu komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Cloud Spanner'ı başlatma

gcloud CLI'yı kullanarak Cloud Spanner API'yi etkinleştirin:

gcloud services enable spanner.googleapis.com

Cloud Spanner örneği oluşturun:

gcloud spanner instances create spanner-instance \
 --config=regional-us-central1 \
 --nodes=1 --description="A Spanner Instance"

Örnek içinde veritabanı oluşturun:

gcloud spanner databases create orders \
  --instance=spanner-instance

Veri şemasını açıklamak için bir schema.ddl dosyası oluşturun:

cat << EOF > schema.ddl
CREATE TABLE orders (
  order_id STRING(36) NOT NULL,
  description STRING(255),
  creation_timestamp TIMESTAMP,
) PRIMARY KEY (order_id);

CREATE TABLE order_items (
  order_id STRING(36) NOT NULL,
  order_item_id STRING(36) NOT NULL,
  description STRING(255),
  quantity INT64,
) PRIMARY KEY (order_id, order_item_id),
  INTERLEAVE IN PARENT orders ON DELETE CASCADE;
EOF

Şemayı Cloud Spanner veritabanına uygulama:

gcloud spanner databases ddl update orders \
  --instance=spanner-instance \
  --ddl="$(<schema.ddl)"

4. Yeni bir Spring Boot Java uygulaması başlatma

Cloud Shell ortamında, yeni bir Spring Boot uygulamasını ilk kullanıma hazırlamak ve bootstrap yapmak için aşağıdaki komutu kullanın:

$ curl https://start.spring.io/starter.tgz \
  -d packaging=jar \
  -d dependencies=cloud-gcp,web,lombok \
  -d baseDir=spanner-example \
  -d type=maven-project \
  -d bootVersion=3.2.6 | tar -xzvf -

$ cd spanner-example

Bu işlem, Maven'in pom.xml, Maven sarmalayıcısı ve uygulama giriş noktası ile birlikte yeni bir Maven projesi içeren yeni bir spanner-example/ dizini oluşturur.

pom.xml dosyasında Spring Data Cloud Spanner başlatıcısını ekleyin.

spanner-example/pom.xml

<project>
  ...
  <dependencies>
        ...
        <!-- Add Spring Cloud GCP Spanner Starter -->
        <dependency>
                <groupId>com.google.cloud</groupId>
                <artifactId>spring-cloud-gcp-starter-data-spanner</artifactId>
        </dependency>

        ...

  </dependencies>

  ...
</project>

application.properties dosyasında Spanner veritabanı bağlantı bilgilerini yapılandırın:

spanner-example/src/main/resources/application.properties

spring.cloud.gcp.spanner.instance-id=spanner-instance
spring.cloud.gcp.spanner.database=orders

JAVA_HOME cihazında doğru sürümün ayarlandığından emin olun:

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

Maven yapılandırmanızın doğru olduğundan emin olmak için uygulamayı yeniden oluşturun:

./mvnw package

5. Varlıkları oluşturma

Spring Cloud GCP'nin Spring Data Spanner desteği sayesinde Spring Data'yı kullanarak kolayca bir Java nesnesi ve Spanner tablosuna deyimsel ORM eşlemesi oluşturabilirsiniz.

Öncelikle bir Order Item sınıfı oluşturun.

spanner-example/src/main/java/com/example/demo/OrderItem.java

package com.example.demo;

import com.google.cloud.spring.data.spanner.core.mapping.Column;
import com.google.cloud.spring.data.spanner.core.mapping.PrimaryKey;
import com.google.cloud.spring.data.spanner.core.mapping.Table;

@Table(name="order_items")
@Data
class OrderItem {
  @PrimaryKey(keyOrder = 1)
  @Column(name="order_id")
  private String orderId;

  @PrimaryKey(keyOrder = 2)
  @Column(name="order_item_id")
  private String orderItemId;

  private String description;
  private Long quantity;
}

Spanner'daki üst/alt ilişkileri için bileşik bir birincil anahtar kullanmanız gerekir. Bu örnekte, bileşik anahtar order_id ve order_item_id'dir.

Ardından, bir Order sınıfı oluşturun:

spanner-example/src/main/java/com/example/demo/Order.java

package com.example.demo;

import java.time.LocalDateTime;
import java.util.List;
import lombok.Data;
import com.google.cloud.spring.data.spanner.core.mapping.Column;
import com.google.cloud.spring.data.spanner.core.mapping.Interleaved;
import com.google.cloud.spring.data.spanner.core.mapping.PrimaryKey;
import com.google.cloud.spring.data.spanner.core.mapping.Table;

@Table(name="orders")
@Data
public class Order {
  @PrimaryKey
  @Column(name="order_id")
  private String id;

  private String description;

  @Column(name="creation_timestamp")
  private LocalDateTime timestamp;

  @Interleaved
  private List<OrderItem> items;
}

Bu sınıf, @Interleaved ek açıklamasını kullanarak sipariş öğeleriyle bire çok ilişkisi oluşturur.

6. OrderRepository arayüzünü oluşturma

Aşağıdaki içeriklerle OrderRepository sınıfını oluşturun:

spanner-example/src/main/java/com/example/demo/OrderRepository.java

package com.example.demo;

import com.google.cloud.spring.data.spanner.repository.SpannerRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface OrderRepository extends SpannerRepository<Order, String> {
}

Arayüz, SpannerRepository<Order, String> öğesini genişletir. Burada Order alan adı sınıfı, String ise birincil anahtar türüdür. Spring Data, bu arayüz üzerinden CRUD erişimini otomatik olarak sağlar ve ek kod oluşturmanız gerekmez.

7. Temel işlemler için bir REST denetleyicisi oluşturma

Ana uygulama DemoApplication sınıfını açın ve aşağıdaki gibi görünecek şekilde değiştirin:

spanner-example/src/main/java/com/example/demo/DemoApplication.java

package com.example.demo;

import java.time.LocalDateTime;
import java.util.UUID;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;

@SpringBootApplication
public class DemoApplication {
        public static void main(String[] args) {
                SpringApplication.run(DemoApplication.class, args);
        }
}

@RestController
class OrderController {
  private final OrderRepository orderRepository;

        OrderController(OrderRepository orderRepository) {
                this.orderRepository = orderRepository;
        }

        @GetMapping("/api/orders/{id}")
        public Order getOrder(@PathVariable String id) {
          return orderRepository.findById(id)
                                .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, id + " not found"));
        }

        @PostMapping("/api/orders")
        public String createOrder(@RequestBody Order order) {
                // Spanner currently does not auto generate IDs
                // Generate UUID on new orders
                order.setId(UUID.randomUUID().toString());
                order.setTimestamp(LocalDateTime.now());

                order.getItems().forEach(item -> {
                        // Assign parent ID, and also generate child ID
                        item.setOrderId(order.getId());
                        item.setOrderItemId(UUID.randomUUID().toString());
                });

          Order saved = orderRepository.save(order);
          return saved.getId();
        }
}

8. Uygulamayı çalıştırma

Uygulamayı yeniden oluşturup çalıştırın.

./mvnw spring-boot:run

Bu işlem düzgün şekilde başlamalı ve 8080 numaralı bağlantı noktasını dinlemelidir.

Uç noktaya bir Sipariş kaydı gönderebilirsiniz:

curl -H"Content-Type: application/json" -d'{"description": "My orders", "items": [{"description": "Android Phone", "quantity": "1"}]}' \
  http://localhost:8080/api/orders

Siparişin UUID ile yanıt vermelidir.

Ardından, UUID ile siparişi alabilirsiniz:

curl http://localhost:8080/api/orders/REPLACE_WITH_ORDER_UUID

Verilerin Cloud Spanner'da nasıl depolandığını görmek için Cloud Console'a gidip Spanner → Spanner Instance → order database → orders table → Data'ya (Spanner → Spanner örneği → sipariş veritabanı → siparişler tablosu → Veriler) gidin.

780f4947e4a864f6.png

9. Temizleme

Temizlemek için Spanner örneğini silerek artık ücretlendirilmemesini sağlayın.

gcloud spanner instances delete spanner-instance -q

10. Tebrikler!

Bu codelab'de, Cloud Spanner'da veri depolayabilen ve verileri alabilen etkileşimli bir CLI uygulaması oluşturdunuz.

Daha Fazla Bilgi

Lisans

Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.