تخزين البيانات في ذاكرة التخزين المؤقت من تطبيق Spring Boot باستخدام Memorystore

‫Memorystore for Redis هي خدمة Redis مُدارة بالكامل على Google Cloud. يمكن للتطبيقات التي تعمل على Google Cloud تحقيق أداء فائق من خلال الاستفادة من خدمة Redis الآمنة والمتاحة والقابلة للتوسّع بشكل كبير بدون عبء إدارة عمليات نشر Redis المعقّدة. يمكن استخدامها كخادم خلفي لتخزين البيانات مؤقتًا من أجل تحسين أداء تطبيقات Spring Boot. توضّح تجربة البرمجة كيفية إعدادها.

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

  • كيفية استخدام Memorystore كخادم خلفي للتخزين المؤقت لتطبيق Spring Boot

المتطلبات

  • مشروع Google Cloud
  • متصفّح، مثل Google Chrome
  • الإلمام بأدوات تحرير النصوص العادية في Linux، مثل Vim وEmacs وGNU Nano

كيف ستستخدم هذا الدرس العملي؟

القراءة فقط القراءة وإكمال التمارين

كيف تقيّم تجربتك مع خدمات Google Cloud؟

مبتدئ متوسط متقدّم

إعداد البيئة بالسرعة التي تناسبك

إذا لم يكن لديك حساب على Google (Gmail أو Google Apps)، عليك إنشاء حساب. سجِّل الدخول إلى "وحدة تحكّم Google Cloud Platform" (console.cloud.google.com) وأنشِئ مشروعًا جديدًا:

لقطة شاشة من 2016-02-10 12:45:26.png

تذكَّر معرّف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (الاسم أعلاه مستخدَم حاليًا ولن يكون متاحًا لك، نأسف لذلك). سيتم الإشارة إليه لاحقًا في هذا الدرس العملي باسم 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].

إنشاء Cloud Shell

بعد تشغيل Cloud Shell، يمكنك استخدام سطر الأوامر لإنشاء مثيل Memorystore جديد.

$ gcloud redis instances create myinstance --size=1 --region=us-central1

إذا لم يتم تفعيل واجهة برمجة التطبيقات Memorystore API، سيُطلب منك تحديد ما إذا كنت تريد تفعيلها. الإجابة y

API [redis.googleapis.com] not enabled on project [204466653457].
Would you like to enable and retry (this will take a few minutes)?
(y/N)?  y
Enabling service redis.googleapis.com on project 204166153457...
Waiting for async operation operations/tmo-acf.c8909997-1b4e-1a62-b6f5-7da75cce1416 to complete...
Operation finished successfully. The following command can describe the Operation details:
 gcloud services operations describe operations/tmo-acf.c8909997-1b4e-1a62-b6f5-7da75cce1416
Create request issued for: [myinstance]
Waiting for operation [operation-1538645026454-57763b937ad39-2564ab37-3fea7701] to complete...done.
Created instance [myinstance].

بعد اكتمال العملية، سيصبح الجهاز الظاهري جاهزًا للاستخدام.

احصل على عنوان IP لمضيف Redis الخاص بالمثيل من خلال تنفيذ الأمر التالي. ستستخدمها مرة أخرى لاحقًا عند ضبط تطبيق Spring Boot.

$ gcloud redis instances describe myinstance --region=us-central1 \
  | grep host
host: 10.0.0.4

إذا انتقلت إلى التخزين > Memorystore في Google Cloud Console، من المفترض أن تتمكّن من رؤية مثيلك في الحالة "جاهز":

أنشئ آلة افتراضية في Compute Engine في المنطقة نفسها.

$ gcloud compute instances create instance-1 --zone us-central1-c

بعد اكتمال العملية، سيصبح الجهاز الظاهري جاهزًا للاستخدام.

اتّصِل بالجهاز الافتراضي من خلال SSH عن طريق الانتقال إلى Compute > Compute Engine > الأجهزة الافتراضية، ثم انقر على SSH في عمود اتصال:

في shell الخاص بمثيل الجهاز الافتراضي (VM) (وليس Cloud Shell)، ثبِّت OpenJDK وMaven وtelnet:

$ sudo apt-get install openjdk-8-jdk-headless maven telnet

انتظِر إلى أن يكتمل التثبيت، ثم انتقِل إلى الخطوة التالية.

أنشئ مشروع Spring Boot جديدًا مع التبعيات web وredis وcache:

$ curl https://start.spring.io/starter.tgz \
  -d dependencies=web,redis,cache -d language=java -d baseDir=cache-app \
  | tar -xzvf - && cd cache-app

عدِّل ملف application.properties لضبط التطبيق لاستخدام عنوان IP الخاص بمثيل Memorystore لمضيف Redis.

$ nano src/main/resources/application.properties

أضِف السطر التالي مع عنوان IP الخاص بخدمة Memorystore for Redis (من الخطوات السابقة):

spring.redis.host=<memorystore-host-ip-address> 

أضِف سطرًا جديدًا بعد ذلك وأنشئ فئة Java لوحدة تحكّم REST:

$ nano src/main/java/com/example/demo/HelloWorldController.java

أدرِج المحتوى التالي في الملف:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {
@Autowired
private StringRedisTemplate template;

@RequestMapping("/hello/{name}")
@Cacheable("hello")
public String hello(@PathVariable String name) throws InterruptedException {
  Thread.sleep(5000);
  return "Hello " + name;
 }
}

تعرض التعليق التوضيحي @RequestMapping الطريقة كنقطة نهاية HTTP وتربط جزءًا من المسار بمعلَمة الطريقة (كما هو موضّح في التعليق التوضيحي @PathVariable).

تشير التعليق التوضيحي @Cacheable("hello") إلى أنّه يجب تخزين تنفيذ الطريقة مؤقتًا وأنّ اسم ذاكرة التخزين المؤقت هو "hello". ويتم استخدامها مع قيمة المَعلمة كمفتاح لذاكرة التخزين المؤقت. ستظهر لك أمثلة لاحقًا في ورشة الترميز.

عليك أيضًا تفعيل التخزين المؤقت في فئة تطبيق Spring Boot.

تعديل DemoApplication.java:

$ nano src/main/java/com/example/demo/DemoApplication.java

استورِد org.springframework.cache.annotation.EnableCaching وأضِف هذه التعليقات التوضيحية إلى الصف. يجب أن تبدو النتيجة على النحو التالي:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class DemoApplication {

public static void main(String[] args) {
  SpringApplication.run(DemoApplication.class, args);
 }
}

أنت الآن جاهز لتشغيل التطبيق.

$ mvn spring-boot:run

افتح اتصال SSH آخر بمثيلك بالطريقة نفسها التي اتّبعتها سابقًا. في نافذة SSH الجديدة، يمكنك الوصول إلى نقطة نهاية /hello/ عدة مرات، مع تمرير "bob" كاسم.

$ time curl http://localhost:8080/hello/bob 
Hello bob!

real        0m5.408s
user        0m0.036s
sys        0m0.009s

$ time curl http://localhost:8080/hello/bob 
Hello bob!

real        0m0.092s
user        0m0.021s
sys        0m0.027s

لاحظ أنّ الطلب استغرق خمس ثوانٍ في المرة الأولى، لكنّه كان أسرع بكثير في المرة التالية على الرغم من أنّ لديك Thread.sleep(5000)استدعاء في الطريقة. ويرجع ذلك إلى أنّ الطريقة الفعلية تم تنفيذها مرة واحدة فقط وتم وضع النتيجة في ذاكرة التخزين المؤقت. تعرض كل مكالمة لاحقة النتيجة مباشرةً من ذاكرة التخزين المؤقت.

يمكنك الاطّلاع على المحتوى الذي خزّنه التطبيق مؤقتًا. من وحدة التحكّم نفسها التي استخدمتها في الخطوة السابقة، اتّصِل بمضيف Memorystore for Redis باستخدام telnet:

$ telnet <memorystore-host-ip-address> 6379

للاطّلاع على قائمة بمفاتيح ذاكرة التخزين المؤقت، استخدِم الأمر التالي:

KEYS *
hello::bob

كما ترى، يتم استخدام اسم ذاكرة التخزين المؤقت كبادئة للمفتاح، ويتم استخدام قيمة المَعلمة كالجزء الثاني.

لاسترداد القيمة، استخدِم الأمر GET:

$ GET hello::bob
   Hello bob!

استخدِم الأمر QUIT للخروج.

لإجراء عملية تنظيف، احذف مثيلات Compute Engine وMemorystore من Cloud Shell.

احذف الجهاز الظاهري:

$ gcloud compute instances delete instance-1 --zone us-central1-c

احذف مثيل Memorystore for Redis:

$ gcloud redis instances delete myinstance --region=us-central1

أنشأت مثيلاً من Memorystore for Redis ومثيلاً من Compute Engine. لقد أعددت أيضًا تطبيق Spring Boot لاستخدام Memorystore مع التخزين المؤقت في Spring Boot.

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

الترخيص

يخضع هذا العمل لترخيص Creative Commons Attribution 2.0 Generic License.