تطبيق Spring Kiosk باستخدام Cloud Datastore

تطبيق Spring Kiosk باستخدام Cloud Datastore

لمحة عن هذا الدرس التطبيقي حول الترميز

subjectتاريخ التعديل الأخير: فبراير 10, 2020
account_circleتأليف موظف Google

1. نظرة عامة

Google Cloud Datastore هي قاعدة بيانات لمستندات NoSQL تم إنشاؤها للتوسع التلقائي والأداء العالي وسهولة تطوير التطبيقات.

ما ستتعرّف عليه

  • كيفية استخدام Cloud Datastore لحفظ كائنات JavaScript واستردادها في Spring Bot

الأشياء التي تحتاج إليها

  • مشروع 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

عذرًا! وسيُشار إليه لاحقًا في هذا الدرس التطبيقي بعنوان PROJECT_ID.

بعد ذلك، ستحتاج إلى تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.

من المفترض ألا يكلفك العمل على هذا الدرس التطبيقي أكثر من بضعة دولارات، ولكن قد يترتّب عليك أكثر إذا قررت استخدام المزيد من الموارد أو إذا تركتها قيد التشغيل (راجع قسم "عرض الأسعار التقديري" في نهاية هذا المستند).

يكون المستخدمون الجدد لخدمة Google Cloud Platform مؤهَّلين للاستفادة من فترة تجريبية مجانية تبلغ 300 دولار أمريكي.

تفعيل Google Cloud Shell

من وحدة تحكّم Google Cloud Platform، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:

ثم انقر على "بدء Cloud Shell":

ينبغي ألا تستغرق إدارة الحسابات والاتصال بالبيئة أكثر من بضع لحظات.

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفِّر هذه الآلة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتمّ تشغيله على Google Cloud، ما يحسّن كثيرًا أداء الشبكة والمصادقة. ويمكن إتمام معظم عملك إن لم يكن كلّه في هذا الدرس ببساطة من خلال متصفّح أو جهاز 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

في وحدة تحكم Google Cloud Platform، انتقِل إلى القائمة -> مخزن البيانات (في قسم مساحة التخزين).

إذا لم يسبق لك استخدام Datastore في المشروع الحالي، ستظهر لك شاشة "اختيار وضع Cloud Firestore&. اختَر "Datastore mode".

بعد ذلك، سترى شاشة "اختَر مكان تخزين البيانات&. اختَر us-east1 أو أي موقع إقليمي آخر وانقر على "إنشاء قاعدة بيانات":

4. تشغيل تطبيق Spring Power Java جديد

من بيئة CloudShell، استخدِم الأمر التالي لإعداد تطبيق Spring Kiosk جديد وتشغيله.

$ 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، برنامج تضمين Maven، بالإضافة إلى نقطة إدخال التطبيق.

سيوفّر تطبيقنا واجهة سطر الأوامر للمستخدمين لإدخال الأوامر والاطّلاع على النتائج. سننشئ صفًا لتمثيل كتاب ثم نحفظه في Cloud Datastore باستخدام مستودع Datastore.

يلزمنا أيضًا إضافة اعتمادية أخرى ضرورية إلى pom.xml.

افتَح "محرّر رموز الويب" بالنقر على إطلاق مُحرِّر الرموز من قائمة Cloud Shell.

بعد تحميل المحرِّر، عدِّل ملف pom.xml لإضافة اعتمادية Spring Data Cloud Spring Start Starter:

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

كما ترى، هذا هو طلب شراء بسيط. يتم وضع تعليق توضيحي للصف الدراسي باستخدام @Entity للإشارة إلى أنه يمكن تخزينه في Datastore وتقديم اسم النوع (فكّر في نوع كجدول في قواعد بيانات SQL، راجع المستندات للحصول على مزيد من التفاصيل). اسم النوع اختياري - في حال حذفه، سيتم إنشاء اسم النوع بناءً على اسم الفئة.

ملاحظة: تمت إضافة تعليق توضيحي إلى الموقع الإلكتروني id باستخدام @Id. ويعني ذلك أننا نريد استخدام هذا الحقل باعتباره جزء المعرّف من مفتاح تخزين البيانات. يجب توفير معرّف لكل كيان مخزن بيانات. الأنواع المتوافقة هي String وLong.

نلغي طريقة toString لجعل تمثيل السلسلة للعناصر أكثر سهولة، وسيكون هذا مفيدًا عند طباعتها.

لا تنسَ حفظ الملف.

6. إنشاء واجهة BookRepository

إنشاء الصف BookRepository مع المحتوى التالي:

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

}

تمتد الواجهة إلى DatastoreRepository<Book, Long> حيث تكون Book فئة النطاق وLong هي نوع Id. أعلنّا عن ثلاث طرق لطلب البحث في مستودعنا يتم فيها تنفيذ عمليات التنفيذ تلقائيًا خلف الكواليس.

الْخِيَارُ الْأَوَّلْ هُوَ findByAuthor. وكما يمكنك التخمين، سيؤدي تنفيذ هذه الطريقة إلى تنفيذ طلب بحث يستخدم قيمة يوفرها المستخدم في فلتر الشرط للتساوي في حقل المؤلف.

تنفّذ الطريقة findByYearGreaterThan طلبًا لفلترة حقل السنة أكبر من القيمة المقدّمة من المستخدم.

ينفِّذ findByAuthorAndYear طلب بحث يبحث عن الكيانات التي تطابق فيها حقول المؤلف والسنة مع القيم التي يُدخلها المستخدم.

7. إنشاء تطبيق سطر الأوامر التفاعلي

افتح فئة التطبيق DemoApplication الرئيسية وعدّلها لتبدو كما يلي:

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. وهذا يُعلِم الربيع بأننا نريد استخدام هذه الفئة كمصدر لأوامر واجهة سطر الأوامر. سيتم عرض الطرق التي تم إدخال تعليقات توضيحية عليها باستخدام @ShellMethod كأوامر سطر الأوامر (CLI) في تطبيقنا.

نستخدِم هنا الطرق التي أعلنّا عنها في واجهة BookRepository: findByAuthor، findByYearGreaterThan، findByAuthorAndYear. ونستخدم أيضًا ثلاث طرق مدمجة: save وfindAll وdeleteAll.

لنلقِ نظرة على طريقة saveBook . يتم إنشاء عنصر Book باستخدام القيم التي يقدّمها المستخدم للعنوان والمؤلف والسنة. كما ترى، نحن لا نقدم قيمة id، لذا سيتم تخصيصها تلقائيًا وإسنادها إلى حقل المعرّف عند الحفظ. تقبل الطريقة save كائنًا من النوع Book وتحفظه في Cloud Datastore. ويعرض عنصر Book مع ملء جميع الحقول، بما في ذلك الحقل id. في النهاية، يتم عرض تمثيل سلسلة لهذا العنصر.

وتعمل بقية الطرق بالطريقة نفسها، حيث تقبل تلك المعلّمات التي يتم تمريرها في المعلّمات إلى طرق المستودع المناسبة وتعرض النتائج المسلسلة.

8. تشغيل التطبيق

لإنشاء التطبيق وبدء تشغيله، نفِّذ هذا الأمر في Cloud Shell (من جذر المشروع datastore-example/ الذي يتوفّر فيه pom.xml) :

$ mvn spring-boot:run

بعد مرحلة تصميم ناجحة، سيظهر الشعار الربيعي وسيظهر إشعار واجهة المستخدم:

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


shell:> 

يمكنك الآن تجربة الأوامر التي سبق لنا تحديدها. للاطّلاع على قائمة الأوامر، استخدِم الأمر help:

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، انتقِل إلى Google Cloud Console وانتقِل إلى القائمة -> مخزن البيانات (في قسم مساحة التخزين) -> الكيانات (اختَر &quot؛[default]"مساحة الاسم &"books"النوع، إذا لزم الأمر).

10. تنظيف

لإزالة البرامج غير المرغوب فيها، أزِل جميع الكتب باستخدام الأمر الذي يحمل اسم remove-all-books من واجهة برمجة التطبيقات.

shell:> remove-all-books

وللخروج من التطبيق، استخدِم الأمر إنهاء، ثم اضغط على Ctrl+C.

11. تهانينا.

في هذا الدرس التطبيقي حول الترميز، تكون قد أنشأت تطبيق CLI تفاعليًا يمكنه تخزين العناصر واستردادها من Cloud Datastore.

مزيد من المعلومات

الترخيص

يخضع هذا العمل لترخيص بموجب رخصة المشاع الإبداعي مع نسب العمل إلى مؤلفه 2.0.