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
Bu eğiticiden nasıl yararlanacaksınız?
Google Cloud Platform hizmetlerinin kullanımıyla ilgili deneyiminizi nasıl değerlendirirsiniz?
2. Kurulum ve Gereksinimler
Kendi hızınızda ortam kurulumu
- 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.)
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.
- 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
- Cloud Console'da, Cloud Shell'i etkinleştir simgesini tıklayın.
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:
Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.
İ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.
- 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.
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
- Cloud Spanner: https://cloud.google.com/spanner/
- GCP projesinde ilkbahar: https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/
- Spring'de 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.