Cloud Datastore ile Spring Boot uygulaması

1. Genel Bakış

Google Cloud Datastore; otomatik ölçeklendirme, yüksek performans ve uygulama geliştirme kolaylığı için oluşturulmuş NoSQL belge veritabanıdır.

Neler öğreneceksiniz?

  • Spring Boot'ta Java nesnelerini kaydetmek ve almak için Cloud Datastore'u 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. Google Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğinizi (genellikle PROJECT_ID olarak tanımlanır) belirtmeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz olması açısından, bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmanın tekrarlanmasını önlemek amacıyla kaynakları kapatmak için oluşturduğunuz kaynakları silebilir veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da, Cloud Shell'i etkinleştir 853e55310c205094.png simgesini tıklayın.

55efc1aaa7a4d3ad.png

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara bir ekran görüntülendiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

Gereken tüm geliştirme araçları bu sanal makinede yüklüdür. 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ı tarayıcıyla yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.

  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`
  1. gcloud komutunun projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
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 Datastore'u ilk kullanıma hazırlama

GCP Console'da Menü -> Datastore'u (Depolama bölümünde) seçin veya burayı tıklayın.

Geçerli projede hiç Datastore'u kullanmadıysanız "Cloud Firestore modu seçin" ekranını görürsünüz. "Datastore modu" seçeneğini belirleyin.

f938295c7ff297f4.png

Sonrasında, "Verilerinizin depolanacağı yeri seçin" ekranını görürsünüz. us-east1 veya başka bir bölgesel konumu seçip "Veritabanı Oluştur"u tıklayın:

916ac84fec10fae7.png

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

CloudShell ortamında, yeni bir Spring Boot uygulamasını başlatmak ve önyüklemek için aşağıdaki komutu kullanın:

$ curl https://start.spring.io/starter.tgz \
  -d packaging=war \
  -d dependencies=cloud-gcp \
  -d type=maven-project \
  -d baseDir=datastore-example \
  -d bootVersion=3.0.5 | tar -xzvf -

Bu işlem yeni bir Maven projesiyle birlikte yeni bir datastore-example/ dizininin yanı sıra Maven'in pom.xml dizini, bir Maven sarmalayıcı ve bir uygulama giriş noktası oluşturur.

Uygulamamız, kullanıcıların komutları girmesi ve sonuçları görmesi için bir KSA sağlar. Kitabı temsil edecek bir sınıf oluşturup Datastore Deposunu kullanarak kitabı Cloud Datastore'a kaydedeceğiz.

pom.xml öğesine gerekli bir bağımlılık daha eklememiz gerekiyor.

Cloud Shell menüsünden Düzenleyiciyi aç'ı tıklayarak Web Kodu Düzenleyici'yi açın.

6d823258c76a7452.png

Düzenleyici yüklendikten sonra pom.xml dosyasını değiştirerek Google Cloud Datastore Starter ve Spring Shell Starter bağımlılıklarını ekleyin:

pom.xml

<project>
  ...
  <dependencies>
        ...
        <!-- Add GCP Datastore Starter -->
        <dependency>
                <groupId>com.google.cloud</groupId>
                <artifactId>spring-cloud-gcp-starter-data-datastore</artifactId>
        </dependency>

        <!-- Add Spring Shell Starter -->
        <dependency>
                <groupId>org.springframework.shell</groupId>
                <artifactId>spring-shell-starter</artifactId>
                <version>3.0.2</version>
        </dependency>

  </dependencies>
</project>

5. Kitap sınıfını oluşturma

Düzenleyiciyi kullanarak aşağıdaki içerikle Book sınıfını oluşturun:

datastore-example/src/main/java/com/example/demo/Book.java

package com.example.demo;

import com.google.cloud.spring.data.datastore.core.mapping.Entity;
import org.springframework.data.annotation.Id;

@Entity(name = "books")
public class Book {
  @Id
  Long id;

  String title;

  String author;

  int year;

  public Book(String title, String author, int year) {
    this.title = title;
    this.author = author;
    this.year = year;
  }

  public long getId() {
    return this.id;
  }

  @Override
  public String toString() {
    return "Book{" +
        "id=" + this.id +
        ", title='" + this.title + '\'' +
        ", author='" + this.author + '\'' +
        ", year=" + this.year +
        '}';
  }
}

Gördüğünüz gibi bu basit bir POJO. Sınıfa, Datastore'da depolanabileceğini belirtmek ve tür adını vermek için @Entity ile ek açıklama verilir (SQL veritabanlarında bir türü düşünün (daha fazla bilgi için belgelere bakın). Tür adı isteğe bağlıdır. Tür adı atlanırsa tür adı sınıf adına göre oluşturulur.

id özelliğine @Id ile ek açıklama eklediğimizi unutmayın. Bu, bu alanın Datastore Anahtarı'nın tanımlayıcı bölümü olarak kullanılmasını istediğimizi gösterir. Her Datastore varlığı için bir tanımlayıcı gerekir. Desteklenen türler: String ve Long.

Nesnelerin dize gösterimini daha okunabilir hale getirmek için toString yöntemini geçersiz kılarız; bu yararlı olacaktır.

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

Aşağıdaki içerikle BookRepository sınıfını oluşturun:

datastore-example/src/main/java/com/example/demo/BookRepository.java

package com.example.demo;

import java.util.List;

import com.google.cloud.spring.data.datastore.repository.DatastoreRepository;


public interface BookRepository extends DatastoreRepository<Book, Long> {

  List<Book> findByAuthor(String author);

  List<Book> findByYearGreaterThan(int year);

  List<Book> findByAuthorAndYear(String author, int year);
}

Arayüz, DatastoreRepository<Book, Long> öğesini genişletir. Book alan adı sınıfı, Long ise Id türüdür. Depomuzda, uygulamaların arka planda otomatik olarak oluşturulduğu üç sorgu yöntemi tanımlıyoruz.

İlki findByAuthor. Tahmin edebileceğiniz gibi, bu yöntemin uygulanması, yazara eşitlik alanında koşul filtresinde kullanıcı tarafından sağlanan değeri kullanacak bir sorgu yürütür.

findByYearGreaterThan yöntemi, kullanıcı tarafından sağlanan değerden büyük yıl alanını filtreleyen bir sorgu yürütür.

findByAuthorAndYear, yazar ve yıl alanlarının kullanıcı tarafından sağlanan değerlerle eşleştiği varlıkları arayan bir sorgu yürütür.

7. Etkileşimli CLI uygulamasını oluşturma

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

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

package com.example.demo;

import java.util.List;

import com.google.common.collect.Lists;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;

@ShellComponent
@SpringBootApplication
public class DemoApplication {
  @Autowired
  BookRepository bookRepository;

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

  @ShellMethod("Saves a book to Cloud Datastore: save-book <title> <author> <year>")
  public String saveBook(String title, String author, int year) {
     Book savedBook = this.bookRepository.save(new Book(title, author, year));
     return savedBook.toString();
  }

  @ShellMethod("Loads all books")
  public String findAllBooks() {
     Iterable<Book> books = this.bookRepository.findAll();
     return Lists.newArrayList(books).toString();
  }

  @ShellMethod("Loads books by author: find-by-author <author>")
  public String findByAuthor(String author) {
     List<Book> books = this.bookRepository.findByAuthor(author);
     return books.toString();
  }

  @ShellMethod("Loads books published after a given year: find-by-year-after <year>")
  public String findByYearAfter(int year) {
     List<Book> books = this.bookRepository.findByYearGreaterThan(year);
     return books.toString();
  }

  @ShellMethod("Loads books by author and year: find-by-author-year <author> <year>")
  public String findByAuthorYear(String author, int year) {
     List<Book> books = this.bookRepository.findByAuthorAndYear(author, year);
     return books.toString();
  }

  @ShellMethod("Removes all books")
  public void removeAllBooks() {
     this.bookRepository.deleteAll();
  }
}

@ShellComponent ile sınıfa nasıl not eklediğimize dikkat edin. Bu bilgi, Spring'e bu sınıfı CLI komutları için bir kaynak olarak kullanmak istediğimizi bildirir. @ShellMethod ile açıklama eklenen yöntemler, uygulamamızda CLI komutları olarak gösterilir.

Burada, BookRepository arayüzünde beyan ettiğimiz yöntemleri kullanırız: findByAuthor, findByYearGreaterThan, findByAuthorAndYear. Ayrıca üç yerleşik yöntem kullanırız: save, findAll ve deleteAll.

saveBook yöntemine bakalım. Başlık, yazar ve yıl için kullanıcıların sağladığı değerleri kullanarak bir Book nesnesi oluştururuz. Gördüğünüz gibi id değeri sağlamıyoruz. Bu nedenle, kayıt sırasında değer otomatik olarak ayrılıp id alanına atanır. save yöntemi, Book türünde bir nesne kabul eder ve bunu Cloud Datastore'a kaydeder. id alanı dahil tüm alanlar doldurulmuş bir Book nesnesi döndürür. Sonunda, bu nesnenin dize temsilini döndürürüz.

Geri kalan yöntemler de benzer şekilde çalışır: Bunlar, uygun depo yöntemlerine iletilen parametreleri kabul eder ve dizeleştirilmiş sonuçlar döndürür.

8. Uygulamayı çalıştırın

Uygulamayı oluşturmak ve başlatmak için öncelikle JAVA_HOME'un doğru sürüme ayarlandığından emin olun:

$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64

Bu komutu Cloud Shell'de yürütün (pom.xml öğesinin bulunduğu datastore-example/ projesinin kökünden):

$ ./mvnw spring-boot:run
export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64

Başarılı bir derleme aşamasından sonra ilkbahar logosu ve kabuk istemi görünür:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.0.5)



shell:>

Artık daha önce tanımladığımız komutlarla deneme yapabilirsiniz. Komut listesini görmek için yardım komutunu kullanın:

shell:> help
...
find-all-books: Loads all books
find-by-author: Loads books by author: find-by-author <author>
find-by-author-year: Loads books by author and year: find-by-author-year <author> <year>
find-by-year-after: Loads books published after a given year: find-by-year-after <year>
remove-all-books: Removes all books
save-book: Saves a book to Cloud Datastore: save-book <title> <author> <year>

Aşağıdakileri deneyin:

  1. save-book komutunu kullanarak birkaç kitap oluşturun
  2. find-all-books komutunu kullanarak arama yapın
  3. Belirli yazarlara göre kitaplar bulun: find-by-author <author>
  4. Belirli bir yıldan sonra yayınlanan kitapları bulun: find-by-year-after <year>
  5. Belirli bir yazara ve yıla göre kitap bulun: find-by-author-year <author> <year>

9. Web arayüzünü kullanarak Datastore'da nelerin depolandığını görün

Varlıkların Cloud Datastore'da nasıl depolandığını görmek için GCP Console'a gidin. "books" girin tür alanına yazın.

5fab21a6c89f45a.png

10. Temizleme

Temizlemek için uygun şekilde adlandırılmış remove-all-books komutunu kullanarak tüm kitapları uygulama kabuğundan kaldırın.

shell:> remove-all-books

Uygulamadan çıkmak için çıkış komutunu, ardından Ctrl+C komutunu kullanın.

11. Tebrikler!

Bu codelab'de, Cloud Datastore'dan nesne 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.