Cloud Datastore ile Spring Boot uygulaması

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

Kendi hızınızda ortam kurulumu

Henüz bir Google Hesabınız (Gmail veya Google Apps) yoksa oluşturmanız gerekir. Google Cloud Platform Console'da (console.cloud.google.com) oturum açın ve yeni bir proje oluşturun:

Screenshot from 2016-02-10 12:45:26.png

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 size birkaç dolardan fazla maliyet getirmemelidir. Ancak daha fazla kaynak kullanmaya karar verirseniz veya kaynakları çalışır durumda bırakırsanız maliyet daha yüksek olabilir (bu belgenin sonundaki "temizleme" bölümüne bakın).

Google Cloud Platform'un yeni kullanıcıları 300 ABD doları değerindeki ücretsiz deneme sürümünden yararlanabilir.

Google Cloud Shell'i etkinleştir

GCP Console'da sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:

Ardından "Cloud Shell'i başlat"ı tıklayın:

Ortamın sağlanması ve bağlantının kurulması yalnızca birkaç saniye sürer:

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde iyileştirilir. Bu laboratuvardaki çalışmalarınızın neredeyse tamamını yalnızca bir tarayıcı veya Google Chromebook'unuzla yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra kimliğinizin zaten doğrulandığını ve projenin PROJECT_ID'nize göre ayarlandığını görürsünüz.

Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:

gcloud auth list

Komut çıkışı

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

GCP Console'da Menü -> Datastore (Depolama bölümünde)'a gidin.

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

Ardından "Verilerinizi nerede depolayacağınızı seçin" ekranını görürsünüz. us-east1 veya başka bir bölgesel konum seçip "Veritabanı Oluştur"u tıklayın:

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 baseDir=datastore-example \
  -d bootVersion=2.1.1.RELEASE | tar -xzvf -

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 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 edecek bir sınıf oluşturup 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 Launch code editor'u (Kod düzenleyiciyi başlat) tıklayarak Web Code Editor'ı açın.

Düzenleyici yüklendikten sonra, Spring Data Cloud Datastore Spring Boot başlatıcı bağımlılığını eklemek için pom.xml dosyasını değiştirin:

pom.xml

<project>
  ...
  <dependencies>
        ...
        <!-- Add GCP Datastore Starter -->
        <dependency>
                <groupId>org.springframework.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>2.0.0.RELEASE</version>
        </dependency>

  </dependencies>
</project>

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

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

package com.example.demo;

import org.springframework.cloud.gcp.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'dur. 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ğine @Id ek açıklaması 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 Datastore 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.

Dosyayı kaydetmeyi unutmayın.

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 org.springframework.cloud.gcp.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ütür.

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.

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 notlandırdığımıza 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ğlamıyoruz. Bu nedenle, kaydedildiğinde otomatik olarak ayrılır ve kimlik alanına atanır. save yöntemi, Book türünde bir nesneyi kabul eder ve Cloud Datastore'a kaydeder. Book alanını da içeren tüm alanların doldurulduğu bir id 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.

Uygulamayı oluşturup başlatmak için Cloud Shell'de (pom.xml dosyasının bulunduğu datastore-example/ projesinin kökünden) şu komutu çalıştırın:

$ mvn spring-boot:run

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

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)


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 çalıştırma
  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>)

Varlıkların Cloud Datastore'da nasıl depolandığını görmek için GCP Console'a gidip Menü -> Datastore (Depolama bölümünde) -> Varlıklar'a gidin (gerekirse "[default]" ad alanını ve "books" türünü seçin).

Temizlemek için uygulama kabuğunda 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şlarını kullanın.

Bu codelab'de, Cloud Datastore'da nesneleri depolayabilen ve 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.