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

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

Bu eğitimi nasıl kullanacaksınız?

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

Google Cloud Platform hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?

Başlangıç Orta İleri

2. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

  1. Google Cloud Console'da oturum açın ve 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. Bu bilgiyi istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini 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ırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i 853e55310c205094.png 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 ekran gösterildiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

9f0e51b578fecce5.png

Bu sanal makineye, ihtiyaç duyacağınız tüm geliştirme araçları yüklenmiştir. 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ı tarayıcıyla 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.

  1. 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`
  1. gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
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 Datastore'u başlatma

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

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

f938295c7ff297f4.png

Ardından "Verilerinizi nerede depolayacağınızı 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ı başlatma

Cloud Shell ortamında, yeni bir Spring Boot uygulamasını başlatmak ve bootstrap yapmak 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 Maven'in pom.xml, Maven sarmalayıcısı ve uygulama giriş noktası içeren yeni bir datastore-example/ dizini oluşturur.

Uygulamamız, kullanıcıların komut girmesi ve sonuçları görmesi için bir CLI sağlar. Kitabı temsil eden bir sınıf oluşturacak ve ardından Datastore Repository'yi kullanarak Cloud Datastore'a kaydedeceğiz.

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

Cloud Shell menüsünden Open editor'ı (Düzenleyiciyi aç) tıklayarak Web Code Editor'ı açın.

6d823258c76a7452.png

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

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. Book sınıfını oluşturma

Düzenleyiciyi kullanarak aşağıdaki içeriklerle 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ıf, Datastore'da depolanabileceğini belirtmek için @Entity ile açıklama eklenir ve tür adını sağlar (türü SQL veritabanlarındaki bir tablo olarak düşünebilirsiniz, daha fazla bilgi için belgelere bakın). Tür adı isteğe bağlıdır. Atlanırsa tür adı, sınıf adına göre oluşturulur.

id özelliğini @Id ile ek açıklama olarak eklediğimizi unutmayın. Bu, bu alanın Datastore anahtarının tanımlayıcı kısmı olarak kullanılmasını istediğimizi gösterir. Her veri deposu varlığının bir tanımlayıcısı olması gerekir. Desteklenen türler String ve Long'dir.

Nesnelerin dize gösterimini daha okunabilir hale getirmek için toString yöntemini geçersiz kılıyoruz. Bu, nesneleri yazdırdığımızda faydalı olacaktır.

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

Aşağıdaki içeriklerle 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> ifadesini genişletir. Burada Book, alan sınıfı, Long ise Id türüdür. Depomuzda, uygulamaların arka planda otomatik olarak oluşturulduğu üç sorgu yöntemi bildiriyoruz.

Birincisi findByAuthor. Tahmin edebileceğiniz gibi, bu yöntemin uygulanması, yazar alanıyla eşitlik için koşul filtresinde kullanıcı tarafından sağlanan bir değeri kullanacak bir sorgu yürütecektir.

findByYearGreaterThan yöntemi, yıl alanını kullanıcı tarafından sağlanan değerden büyük olacak şekilde 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 öğeleri 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();
  }
}

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

Burada, BookRepository arayüzünde tanımladığımız yöntemleri kullanıyoruz: findByAuthor, findByYearGreaterThan, findByAuthorAndYear. Ayrıca save, findAll ve deleteAll olmak üzere üç yerleşik yöntem kullanırız.

saveBook yöntemine bakalım. Başlık, yazar ve yıl için kullanıcı tarafından sağlanan değerleri kullanarak bir Book nesnesi oluştururuz. Gördüğünüz gibi, id değeri sağlamadığımız için bu değer, kaydedildiğinde otomatik olarak ayrılır ve id alanına atanır. save yöntemi, Book türünde bir nesneyi kabul eder ve Cloud Datastore'a kaydeder. id alanı da dahil olmak üzere tüm alanları doldurulmuş bir Book nesnesi döndürür. Sonunda bu nesnenin dize gösterimini döndürürüz.

Diğer yöntemler de benzer şekilde çalışır: Geçirilen parametreleri uygun depo yöntemlerine kabul eder ve dizeleştirilmiş sonuçlar döndürür.

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

Uygulamayı oluşturup 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 (pom.xml dosyasının bulunduğu projenin kökünden datastore-example/) çalıştırın:

$ ./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 Spring logosu gösterilir ve kabuk istemi görünür:

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



shell:>

Artık daha önce tanımladığımız komutlarla denemeler 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 yapma
  3. Belirli bir yazara ait kitapları bulma: find-by-author <author>
  4. Belirli bir yıldan sonra yayınlanan kitapları bulma: find-by-year-after <year>
  5. Belirli bir yazarın belirli bir yılda yayınladığı kitapları bulma: find-by-author-year <author> <year>

9. Web arayüzünü kullanarak Datastore'da depolananları görme

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

5fab21a6c89f45a.png

10. Temizleme

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

shell:> remove-all-books

Uygulamadan çıkmak için quit komutunu ve ardından Ctrl+C tuşunu kullanın.

11. Tebrikler!

Bu codelab'de, Cloud Datastore'dan nesneleri depolayabilen ve alabilen etkileşimli bir KSA 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.