Cloud Spanner ile Spring Boot uygulaması

1. Genel Bakış

Cloud Spanner; yüksek düzeyde kullanılabilir, yatay olarak ölçeklenebilir ve çok bölgeli bir RDCMS'dir. Bu kod laboratuvarı, Cloud Spanner'ın en küçük bir örneğini kullanır. Ancak işiniz bittiğinde onu kapatmayı unutmayın.

Neler öğreneceksiniz?

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

İhtiyacınız olanlar

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

Bu eğiticiden nasıl yararlanacaksınız?

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

Google Cloud Platform hizmetlerinin kullanımıyla ilgili deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

  1. Cloud Console'da oturum açıp 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

Tüm Google Cloud projelerinde benzersiz bir ad olan proje kimliğini unutmayın (yukarıdaki ad zaten alınmış ve size uygun olmayacaktır!). Bu kod laboratuvarın ilerleyen bölümlerinde PROJECT_ID olarak adlandırılacaktır.

  1. Sonraki adımda, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.

Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. "Temizleme" bölümündeki talimatları izlediğinizden emin olun. bölümünde, bu eğiticinin dışında faturalandırmayla karşılaşmamanız için kaynakları nasıl kapatacağınız konusunda tavsiyelerde bulunuyoruz. Yeni Google Cloud kullanıcıları 300 ABD doları ücretsiz deneme programından yararlanabilir.

Cloud Shell'i etkinleştirme

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

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Cloud Shell'i daha önce hiç çalıştırmadıysanız ne olduğunu açıklayan bir ara ekran (ekranın alt kısmında) gösterilir. Bu durumda Devam'ı tıklayın (bunu bir daha görmezsiniz). Tek seferlik ekran şöyle görünür:

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

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

İhtiyacınız olan tüm geliştirme araçlarını bu sanal makinede bulabilirsiniz. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı yalnızca bir tarayıcı veya Chromebook'unuzla yapılabilir.

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. Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki 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>

Doğru değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Cloud Spanner'ı ilk kullanıma hazırlama

gcloud KSA'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 bir veritabanı oluşturun:

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

Veri şemasını tanımlamak 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 uygulayın:

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

4. Yeni bir Spring Boot Java Uygulamasının önyüklemesini yapın

Cloud Shell ortamında aşağıdaki komutu kullanarak yeni bir Spring Boot uygulamasını başlatın ve önyükleyin:

$ 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 yeni bir Maven projesinin yanı sıra Maven'in pom.xml projesi, bir Maven sarmalayıcı ve bir uygulama giriş noktası içeren yeni bir spanner-example/ dizini oluşturur.

pom.xml dosyasına Spring Data Cloud Spanner başlatıcıyı 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 içinde, 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 öğesinin doğru sürüme 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ğiyle, Spring Data'yı kullanarak kolayca Java nesnesi oluşturabilir ve bir Spanner tablosuna deyimsel ORM eşlemesi yapabilirsiniz.

Önce bir Sipariş Öğesi 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şkiler için birleşik birincil anahtar kullanmanız gerekir. Bu örnekte, order_id ve order_item_id bileşik anahtardır.

Ardından bir Sipariş 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, Sipariş Öğeleri ile bire-çok ilişki oluşturmak için @Interleaved ek açıklamasını kullanır.

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

Aşağıdaki içerikle 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. Order alan adı sınıfı, String ise Birincil Anahtar türüdür. Spring Data, bu arayüz üzerinden otomatik olarak CRUD erişimi sağlar ve ek kod oluşturmanız gerekmez.

7. Temel işlemler için REST Denetleyici 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 derleyip çalıştırın.

./mvnw spring-boot:run

Bu işlemin düzgün bir şekilde başlatılması ve 8080 numaralı bağlantı noktasından dinlemesi gerekir.

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şe ait UUID ile yanıt vermesi gerekir.

Daha sonra siparişi UUID ile 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 gidin ve Spanner → Spanner Örneği → sipariş veritabanı → sipariş tablosu → Veri'ye gidin.

780f4947e4a864f6.png

9. Temizleme

Temizlemek için Spanner örneğini silin. Böylece artık ücret alınmaz.

gcloud spanner instances delete spanner-instance -q

10. Tebrikler!

Bu codelab'de, Cloud Spanner'dan veri depolayıp 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.