1. Ringkasan
Cloud Spanner adalah RDBMS multi-regional, skalabel secara horizontal, dan sangat tersedia. Lab kode ini akan menggunakan instance Cloud Spanner terkecil, tetapi jangan lupa untuk menonaktifkannya setelah selesai.
Yang akan Anda pelajari
- Cara menggunakan Cloud Spanner untuk menyimpan dan mengambil data dengan Spring Boot
Yang Anda butuhkan
Bagaimana Anda akan menggunakan tutorial ini?
Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud Platform?
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- Login ke Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. (Jika belum memiliki akun Gmail atau G Suite, Anda harus membuatnya.)
Ingat project ID, nama unik di semua project Google Cloud (maaf, nama di atas telah digunakan dan tidak akan berfungsi untuk Anda!) Project ID tersebut selanjutnya akan dirujuk di codelab ini sebagai PROJECT_ID
.
- Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan resource Google Cloud.
Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Pastikan untuk mengikuti petunjuk yang ada di bagian "Membersihkan" yang memberi tahu Anda cara menonaktifkan resource sehingga tidak menimbulkan penagihan di luar tutorial ini. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.
Mengaktifkan Cloud Shell
- Dari Cloud Console, klik Aktifkan Cloud Shell .
Jika belum pernah memulai Cloud Shell, Anda akan melihat layar perantara (di paruh bawah) yang menjelaskan apa itu Cloud Shell. Jika demikian, klik Lanjutkan (dan Anda tidak akan pernah melihatnya lagi). Berikut tampilan layar sekali-tampil tersebut:
Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.
Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan hanya dengan browser atau Chromebook.
Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke project ID Anda.
- Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list
Output perintah
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
Output perintah
[core] project = <PROJECT_ID>
Jika tidak, Anda dapat menyetelnya dengan perintah ini:
gcloud config set project <PROJECT_ID>
Output perintah
Updated property [core/project].
3. Melakukan inisialisasi Cloud Spanner
Aktifkan Cloud Spanner API menggunakan gcloud CLI:
gcloud services enable spanner.googleapis.com
Buat instance Cloud Spanner:
gcloud spanner instances create spanner-instance \ --config=regional-us-central1 \ --nodes=1 --description="A Spanner Instance"
Buat database dalam instance:
gcloud spanner databases create orders \ --instance=spanner-instance
Buat file schema.ddl
untuk mendeskripsikan skema data:
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
Terapkan skema ke database Cloud Spanner:
gcloud spanner databases ddl update orders \ --instance=spanner-instance \ --ddl="$(<schema.ddl)"
4. Melakukan bootstrap pada Aplikasi Java Spring Boot baru
Dari lingkungan Cloud Shell, gunakan perintah berikut untuk menginisialisasi dan mem-bootstrap aplikasi Spring Boot baru:
$ 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
Tindakan ini akan membuat direktori spanner-example/
baru dengan project Maven baru, beserta pom.xml
Maven, wrapper Maven, serta titik entri aplikasi.
Di file pom.xml
, tambahkan pemicu Spring Data Cloud Spanner.
contoh-spanner/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>
Di application.properties, konfigurasi informasi koneksi database Spanner:
spanner-example/src/main/resources/application.properties
spring.cloud.gcp.spanner.instance-id=spanner-instance spring.cloud.gcp.spanner.database=orders
Pastikan JAVA_HOME
ditetapkan ke versi yang tepat:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
Build ulang aplikasi untuk memastikan konfigurasi Maven Anda sudah benar:
./mvnw package
5. Membuat Entity
Dengan dukungan Spring Data Spanner dari Spring Cloud GCP, Anda dapat dengan mudah membuat objek Java, dan pemetaan ORM idiomatis ke tabel Spanner, menggunakan Spring Data.
Pertama, buat class Item Pesanan.
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;
}
Untuk hubungan Orang Tua/Anak di Spanner, Anda harus menggunakan kunci utama gabungan. Dalam contoh ini, kunci gabungannya adalah order_id
dan order_item_id
.
Berikutnya, buat class Pesanan:
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;
}
Class ini menggunakan anotasi @Interleaved
untuk membuat hubungan one-to-many dengan Item Pesanan.
6. Membuat antarmuka OrderRepository
Buat class OrderRepository
dengan konten berikut:
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> {
}
Antarmuka memperluas SpannerRepository<Order, String>
dengan Order
sebagai class domain dan String
adalah jenis Kunci Utama. Spring Data akan otomatis memberikan akses CRUD melalui antarmuka ini dan Anda tidak perlu membuat kode tambahan.
7. Membuat Pengontrol REST untuk operasi dasar
Buka class DemoApplication
aplikasi utama dan ubah agar terlihat seperti ini:
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. Menjalankan Aplikasi
Build ulang dan jalankan aplikasi.
./mvnw spring-boot:run
Proses ini akan dimulai dengan baik di port 8080.
Anda dapat memposting data Pesanan ke endpoint:
curl -H"Content-Type: application/json" -d'{"description": "My orders", "items": [{"description": "Android Phone", "quantity": "1"}]}' \ http://localhost:8080/api/orders
Pesan ini harus merespons dengan UUID
Pesanan.
Selanjutnya, Anda dapat mengambil Pesanan dengan UUID
:
curl http://localhost:8080/api/orders/REPLACE_WITH_ORDER_UUID
Untuk melihat cara data disimpan di Cloud Spanner, buka Konsol Cloud, lalu buka Spanner → Spanner Instance → order database → order table → Data.
9. Pembersihan
Untuk membersihkannya, hapus instance Spanner agar tidak lagi menimbulkan biaya.
gcloud spanner instances delete spanner-instance -q
10. Selamat!
Dalam codelab ini, Anda telah membuat aplikasi CLI interaktif yang dapat menyimpan dan mengambil data dari Cloud Spanner.
Pelajari Lebih Lanjut
- Cloud Spanner: https://cloud.google.com/spanner/
- Musim semi di project GCP: https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/
- Spring di repositori GitHub GCP: https://github.com/spring-cloud/spring-cloud-gcp
- Java di Google Cloud Platform: https://cloud.google.com/java/
Lisensi
Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.