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
Bu eğitimi nasıl kullanacaksınız?
Google Cloud Platform hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
2. Kurulum ve Gereksinimler
Yönlendirmesiz ortam kurulumu
- 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.)
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.
- 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
- Cloud Console'da Cloud Shell'i etkinleştir 'i
tıklayın.
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:
Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.
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.
- 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.

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
- Cloud Spanner: https://cloud.google.com/spanner/
- GCP'de Spring projesi: https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/
- Spring on GCP GitHub deposu: https://github.com/spring-cloud/spring-cloud-gcp
- Google Cloud Platform'da Java: https://cloud.google.com/java/
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.