لمحة عن هذا الدرس التطبيقي حول الترميز
1. نظرة عامة
Google Cloud Datastore هي قاعدة بيانات لمستندات NoSQL تم إنشاؤها للتوسع التلقائي والأداء العالي وسهولة تطوير التطبيقات.
ما ستتعرّف عليه
- كيفية استخدام Cloud Datastore لحفظ كائنات JavaScript واستردادها في Spring Bot
الأشياء التي تحتاج إليها
كيف ستستخدم هذا البرنامج التعليمي؟
كيف تقيّم تجربتك في استخدام خدمات Google Cloud Platform؟
2. الإعداد والمتطلّبات
إعداد البيئة الذاتية
إذا لم يكن لديك حساب على Google (Gmail أو Google Apps)، يجب إنشاء حساب. تسجيل الدخول إلى وحدة تحكُّم Google Cloud Platform (console.cloud.google.com) وإنشاء مشروع جديد:
عذرًا! وسيُشار إليه لاحقًا في هذا الدرس التطبيقي بعنوان 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>
جرّب ما يلي:
- إنشاء بضعة كتب باستخدام الأمر
save-book
- إجراء بحث باستخدام الأمر
find-all-books
- البحث عن كتب لمؤلف محدد (
find-by-author <author>
) - البحث عن كتب تم نشرها بعد عام معيّن (
find-by-year-after <year>
) - البحث عن كتب حسب المؤلف والسنة المحدَّدة (
find-by-author-year <author> <year>
)
9. معرفة ما يتم تخزينه في Datastore باستخدام واجهة الويب
لمعرفة كيفية تخزين الكيانات في Cloud Datastore، انتقِل إلى Google Cloud Console وانتقِل إلى القائمة -> مخزن البيانات (في قسم مساحة التخزين) -> الكيانات (اختَر "؛[default]"مساحة الاسم &"books"النوع، إذا لزم الأمر).
10. تنظيف
لإزالة البرامج غير المرغوب فيها، أزِل جميع الكتب باستخدام الأمر الذي يحمل اسم remove-all-books
من واجهة برمجة التطبيقات.
shell:> remove-all-books
وللخروج من التطبيق، استخدِم الأمر إنهاء، ثم اضغط على Ctrl+C.
11. تهانينا.
في هذا الدرس التطبيقي حول الترميز، تكون قد أنشأت تطبيق CLI تفاعليًا يمكنه تخزين العناصر واستردادها من Cloud Datastore.
مزيد من المعلومات
- Cloud Datastore: https://cloud.google.com/datastore/
- Spring Shell: https://projects.spring.io/spring-shell/
- الربيع في مشروع Google Cloud Platform: http://cloud.spring.io/spring-cloud-gcp/
- فصل الربيع في مستودع GitHub في Google Cloud Platform: https://github.com/spring-cloud/spring-cloud-gcp
- جافا على Google Cloud Platform: https://cloud.google.com/java/
الترخيص
يخضع هذا العمل لترخيص بموجب رخصة المشاع الإبداعي مع نسب العمل إلى مؤلفه 2.0.