אפליקציית אתחול לאביב עם Cloud Datastore

אפליקציית אתחול לאביב עם Cloud Datastore

מידע על Codelab זה

subjectהעדכון האחרון: פבר׳ 10, 2020
account_circleנכתב על ידי גוגלר

1.‏ סקירה כללית

Google Cloud Datastore הוא מסד נתונים למסמכים ב-NoSQL, המיועד להתאמה אוטומטית של ביצועים, לביצועים טובים ולקלות בפיתוח האפליקציות.

מה תלמדו

  • איך משתמשים ב-Cloud Datastore כדי לשמור ולאחזר אובייקטים של JavaScript ב-Spring אתחול

מה תצטרך להכין

  • פרויקט של Google Cloud Platform
  • דפדפן, למשל Chrome או Firefox

איך תשתמשו במדריך הזה?

איזה דירוג מתאים לדעתך לחוויית השימוש בשירותי Google Cloud Platform?

2.‏ הגדרה ודרישות

הגדרת סביבה בקצב עצמי

אם עדיין אין לכם חשבון Google (Gmail או Google Apps), עליכם ליצור חשבון. נכנסים למסוף ב-Google Cloud Platform (console.cloud.google.com) ויוצרים פרויקט חדש:

צילום מסך מ-2016-02-10 12:45:26.png

חשוב לזכור את מזהה הפרויקט הוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם הקודם כבר תפוס, והוא לא יעבוד בשבילך.) נתייחס אליו מאוחר יותר ב-codelab הזה בתור PROJECT_ID.

לאחר מכן, עליך להפעיל חיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.

התהליך של קוד Lab זה לא אמור לעלות יותר מדולר אחד, אבל יכול להיות שתצטרכו לשלם על משאבים נוספים או להשאיר אותו פעיל (עיינו בקטע "cleanup" בסוף המסמך).

משתמשים חדשים ב-Google Cloud Platform זכאים לתקופת ניסיון בחינם בשווי 300$.

הפעלת Google Cloud Shell

במסוף GCP, לוחצים על הסמל של Cloud Shell בסרגל הכלים שבפינה השמאלית העליונה:

לאחר מכן לוחצים על "Start Cloud Shell":

יחלפו רק כמה רגעים עד שההקצאה והחיבור לסביבת העבודה יושלמו:

המכונה הווירטואלית הזו נטענת באמצעות כל כלי הפיתוח הדרושים לך. יש בה ספריית בית בנפח עקבי של 5GB, והיא פועלת ב-Google Cloud, וכך משפרת באופן משמעותי את הביצועים ואת האימות של הרשת. את רוב העבודה שלכם בשיעור ה-Lab הזה (אם לא כולם) אפשר לבצע בדפדפן או ב-Google Chromebook.

לאחר החיבור ל-Cloud Shell, אתם אמורים לראות שכבר בוצע אימות, ושהפרויקט כבר מוגדר ב-PROJECT_ID.

מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שאתם מאומתים:

gcloud auth list

פלט הפקודה

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

פלט הפקודה

[core]
project = <PROJECT_ID>

אם לא, אפשר להגדיר אותה באמצעות הפקודה הבאה:

gcloud config set project <PROJECT_ID>

פלט הפקודה

Updated property [core/project].

3.‏ הפעלה של Cloud Datastore

במסוף GCP, מנווטים אל תפריט -> Datastore (בקטע 'אחסון').

אם אף פעם לא השתמשתם ב-Datastore בפרויקט הנוכחי, יוצג לכם המסך "יש לבחור מצב Cloud Firestore". בוחרים באפשרות "Datastore&" .

לאחר מכן מופיע המסך " בוחרים היכן לאחסן את הנתונים". בוחרים באפשרות us-איסט1 או בכל מיקום אזורי אחר ולוחצים על "יצירת מסד נתונים":

4.‏ אפליקציית Bootstrap חדשה ב-Spring Java

מסביבת CloudShell, משתמשים בפקודה הבאה כדי להפעיל ולהפעיל מחדש את אפליקציית Spring Boot החדשה:

$ 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 -

פעולה זו תיצור ספרייה חדשה ב-datastore-example/ עם פרויקט Maven החדש, יחד עם קובץ pom.xml של Maven, wrapper של Maven ונקודת כניסה לאפליקציה.

האפליקציה שלנו תספק CLI עבור משתמשים כדי להזין פקודות ולראות תוצאות. אנחנו ניצור כיתה שתייצג ספר ואז תשמור אותו ב-Cloud Datastore באמצעות מאגר הנתונים של Datastore.

כמו כן, עלינו להוסיף עוד תלות נחוצה אחת ל-pom.xml.

פותחים את Web Code Editor בלחיצה על הפעלת עורך קוד בתפריט Cloud Shell.

אחרי שהעורך ייטען, יש לשנות את הקובץ pom.xml כדי להוסיף את התלות של ספר האתחול של Spring Data Cloud ב-Spring:

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>

5.‏ יצירת כיתת הספר

באמצעות העורך, יוצרים את הכיתה Book עם התוכן הבא:

datastore-example/src/main/javascript/com/example/demo/Book.JavaScript

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 +
                               
'}';
       
}
}

כפי שאפשר לראות, זוהי נקודת עניין פשוטה. הכיתה מקבלת הערות עם @Entity כדי לציין שניתן לאחסן אותה ב-Datastore ולספק את השם שלה (למשל, כטבלה במסדי נתונים של SQL, יש לעיין בתיעוד לקבלת פרטים נוספים). שם המיון הוא אופציונלי – אם הוא לא קיים, שם הסוג ייווצר על סמך שם המחלקה.

לידיעתך, עדכנו את הנכס id עם @Id. כלומר, אנחנו רוצים שהשדה הזה ישמש כחלק מהמזהה של מפתח Datastore. לכל ישות של מאגר נתונים נדרש מזהה. הסוגים הנתמכים הם String ו-Long.

אנחנו מחליפים את השיטה toString כדי שייצוג המחרוזת של האובייקטים יהיה קריא יותר. האפשרות הזו תהיה שימושית כשמדפיסים אותם.

לא לשכוח לשמור את הקובץ!

6.‏ יצירת הממשק של BookRepository

יש ליצור את הכיתה BookRepository עם התוכן הבא:

datastore-example/src/main/javascript/com/example/demo/BookRepository.JavaScript

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);

}

הממשק מתרחב ל-DatastoreRepository<Book, Long> כאשר Book הוא סיווג הדומיין ו-Long הוא הסוג Id. אנחנו מכריזים על שלוש שיטות שאילתה במאגר שלנו שהטמעות נוצרות באופן אוטומטי מאחורי הקלעים.

הפריט הראשון הוא findByAuthor. כפי שאפשר לשער, יישום השיטה הזו יפעיל שאילתה שישתמשה בערך שסופק על ידי המשתמש במסנן התנאים לשוויון בשדה המחבר.

השיטה findByYearGreaterThan מפעילה שאילתה שמסנן לפי שדה שנה גדול מהערך שסופק על ידי המשתמש.

הפונקציה findByAuthorAndYear מבצעת שאילתה שמחפשת ישויות שבהן השדות 'מחבר' ו'שנה' תואמים לערכים שסופקו על ידי משתמשים.

7.‏ יצירה של אפליקציית ה-CLI האינטראקטיבית

יש לפתוח את הכיתה הראשית של האפליקציה DemoApplication ולשנות אותה כך:

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

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. כך אנחנו מודיעים לאביב שאנחנו רוצים להשתמש בכיתה הזו כמקור לפקודות CLI. השיטות המסומנות עם @ShellMethod נחשפות כפקודות CLI באפליקציה שלנו.

כאן אנחנו משתמשים בשיטות שהכרזנו עליהן בממשק של BookRepository: findByAuthor, findByYearGreaterThan, findByAuthorAndYear. יש לנו גם שלוש שיטות מובנות: save, findAll וdeleteAll.

נבחן את השיטה של saveBook . אנחנו יוצרים אובייקט Book באמצעות ערכים שסופקו על ידי המשתמשים עבור שם הספר, שם המחבר והשנה. כפי שאפשר לראות, אנחנו לא מספקים ערך ל-id, לכן הוא יוקצה באופן אוטומטי ויוקצה לשדה המזהה ב-save. השיטה save מקבלת אובייקט מסוג Book ושומרת אותו ב-Cloud Datastore. הוא מחזיר אובייקט Book עם כל השדות המאוכלסים, כולל השדה id. בסופו של דבר, אנחנו מחזירים ייצוג מחרוזת של אובייקט זה.

שאר השיטות פועלות באופן דומה: הן מקבלות פרמטרים לשיטות המאגר המתאימות ומחזירות תוצאות עם מחרוזת.

8.‏ הפעלת האפליקציה

כדי ליצור ולהפעיל את האפליקציה, יש להפעיל את הפקודה הבאה ב-Cloud Shell (מהשורש של הפרויקט datastore-example/, שבו נמצא pom.xml) :

$ mvn spring-boot:run

לאחר ששלב ה-build מוצלח יופיע הלוגו של האביב, וההודעה על סמל המעטפת תופיע:

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


shell:> 

עכשיו אפשר לנסות את הפקודות שהגדרנו קודם. כדי להציג את רשימת הפקודות, משתמשים בפקודת העזרה:

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>

אפשר לנסות לבצע את הפעולות הבאות:

  1. יוצרים כמה ספרים באמצעות הפקודה save-book
  2. חיפוש באמצעות הפקודה find-all-books
  3. חיפוש ספרים לפי מחבר ספציפי (find-by-author <author>)
  4. חיפוש ספרים שפורסמו אחרי שנה ספציפית (find-by-year-after <year>)
  5. חיפוש ספרים לפי מחבר ושנה ספציפיים (find-by-author-year <author> <year>)

9.‏ הצגה של מה שמאוחסן ב-Datastore באמצעות ממשק אינטרנט

כדי לראות איך הישויות מאוחסנות ב-Cloud Datastore, עוברים למסוף GCP ועוברים אל תפריט -> Datastore (בקטע 'אחסון') -> ישויות (select "[default]" namespace, &"books" type, אם יש צורך).

10.‏ הסרת עותקים כפולים

כדי לנקות, יש להסיר את מעטפת האפליקציה בעזרת פקודת remove-all-books בשם הקיים.

shell:> remove-all-books

כדי לצאת מהאפליקציה, השתמשו בפקודת 'יציאה' ולאחר מכן ב-Ctrl+C.

11.‏ מעולה!

ב-Codelab הזה יצרתם אפליקציית CLI אינטראקטיבית שיכולה לאחסן ולאחזר אובייקטים מ-Cloud Datastore!

למידע נוסף

רישיון

היצירה הזו ברישיון תחת רישיון Creative Commons Attribution 2.0.