1. نظرة عامة
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؟
2. الإعداد والمتطلبات
إعداد بيئة ذاتية
- سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو G Suite، عليك إنشاء حساب.)
يُرجى تذكُّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون مناسبًا لك). ستتم الإشارة إليها لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT_ID
.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.
إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "الحذف سريعًا". الذي يقدم لك نصائح حول كيفية إيقاف تشغيل الموارد حتى لا تتكبّد أي فواتير خارج نطاق هذا البرنامج التعليمي. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج الفترة التجريبية المجانية التي تبلغ قيمتها 300 دولار أمريكي.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell .
إذا لم يسبق لك بدء تشغيل Cloud Shell، ستظهر لك شاشة وسيطة (الجزء السفلي غير المرئي من الصفحة) تصف ماهيتها. وفي هذه الحالة، انقر على متابعة (ولن تظهر لك مرة أخرى). إليك ما تبدو عليه هذه الشاشة التي تُستخدم لمرة واحدة:
من المفترَض أن تستغرق عملية توفير المتطلبات اللازمة والاتصال بخدمة Cloud Shell بضع دقائق فقط.
يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح أو جهاز Chromebook.
بعد الربط بخدمة Cloud Shell، من المفترض أن يظهر لك أنّه قد تمت مصادقتك وأنّ المشروع معيّن سبق أن تم ضبطه على رقم تعريف مشروعك.
- شغِّل الأمر التالي في Cloud Shell لتأكيد مصادقتك:
gcloud auth list
مخرجات الأمر
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
مخرجات الأمر
[core] project = <PROJECT_ID>
إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:
gcloud config set project <PROJECT_ID>
مخرجات الأمر
Updated property [core/project].
3- إعداد Memorystore لمثيل Redis
إنشاء Cloud Shell
بعد إطلاق Cloud Shell، استخدِم سطر الأوامر لتفعيل Memorystore API وإنشاء مثيل جديد في Memorystore.
$ gcloud services enable redis.googleapis.com $ gcloud redis instances create myinstance --size=1 --region=us-central1
بعد اكتمال العملية، سيكون المثيل جاهزًا للاستخدام.
احصل على redis Host ip-address للمثيل من خلال تنفيذ الأمر التالي. وستستخدمه مرة أخرى لاحقًا عند ضبط تطبيق Spring Boot.
$ gcloud redis instances describe myinstance --region=us-central1 \ | grep host host: 10.0.0.4
في Google Cloud Console، انتقِل إلى Databases (قواعد البيانات) > Memorystore > Redis: يجب أن تكون حالة المثيل "جاهزة" الولاية :
4. إعداد مثيل Compute Engine
أنشِئ مثيل Compute Engine في المنطقة نفسها.
$ gcloud compute instances create instance-1 --zone us-central1-c
بعد اكتمال العملية، سيكون المثيل جاهزًا للاستخدام.
اتصِل بالمثيل من خلال بروتوكول النقل الآمن (SSH) باستخدام الأمر التالي:
$ gcloud compute ssh instance-1 --zone us-central1-c
بدلاً من ذلك، انتقِل إلى الحوسبة >. Compute Engine > المثيلات الافتراضية، وانقر على SSH في العمود ربط:
في هيكل المثيل للجهاز الافتراضي (VM) (وليس Cloud Shell)، ثبِّت أدوات OpenJDK وMaven وRedis:
$ sudo apt-get install openjdk-17-jdk-headless maven redis-tools
انتظر حتى يكتمل التثبيت، ثم تابِع إلى الخطوة التالية.
5- إعداد تطبيق Spring Boot
إنشاء مشروع جديد في Spring Boot باستخدام الموارد التابعة web
وredis
وcache
:
$ curl https://start.spring.io/starter.tgz \ -d dependencies=web,redis,cache -d language=java -d baseDir=cache-app \ -d type=maven-project \ | tar -xzvf - && cd cache-app
عدِّل ملف application.properties
لإعداد التطبيق من أجل استخدام عنوان IP لمثيل Memorystore لمضيف Redis.
$ nano src/main/resources/application.properties
أضِف السطر التالي إلى Memorystore لعنوان IP الخاص بخدمة Redis (قبل بضع خطوات):
spring.data.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);
}
}
6- تشغيل التطبيق والوصول إلى نقطة النهاية
تأكَّد من ضبط JAVA_HOME
على الإصدار الصحيح:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
أنت الآن جاهز لتشغيل التطبيق!
$ 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)
تستدعي الطلب. وذلك لأنه تم تنفيذ الطريقة الفعلية مرة واحدة فقط وتم وضع النتيجة في ذاكرة التخزين المؤقت. ويعرض كل استدعاء لاحق النتيجة مباشرةً من ذاكرة التخزين المؤقت.
7. مراجعة العناصر المخزّنة مؤقتًا
يمكنك الاطلاع بالضبط على ما تم تخزينه في ذاكرة التخزين المؤقت للتطبيق. من الوحدة الطرفية نفسها التي استخدمتها في الخطوة السابقة، يمكنك الربط بأداة Memorystore لمضيف Redis باستخدام الأمر redis-cli:
$ redis-cli -h <memorystore-host-ip-address>
للاطّلاع على قائمة مفاتيح ذاكرة التخزين المؤقت، استخدِم الأمر التالي:
:6379> KEYS * 1) "hello::bob"
كما ترى، يتم استخدام اسم ذاكرة التخزين المؤقت كبادئة للمفتاح ويتم استخدام قيمة المعلمة كالجزء الثاني.
لاسترداد القيمة، استخدِم الأمر GET
:
:6379> GET hello::bob Hello bob!
استخدِم الأمر exit
للخروج.
8. تَنظيم
لإزالة البيانات، يمكنك حذف مثيلات Compute Engine وMemorystore من Cloud Shell.
حذف مثيل الحوسبة:
$ gcloud compute instances delete instance-1 --zone us-central1-c
حذف Memorystore لمثيل Redis:
$ gcloud redis instances delete myinstance --region=us-central1
9. تهانينا!
لقد أنشأت Memorystore لـ Redis ومثيل Compute Engine. بالإضافة إلى ذلك، ضبطت تطبيق Spring Boot لاستخدام Memorystore مع التخزين المؤقت لـ Spring Boot
مزيد من المعلومات
الترخيص
هذا العمل مرخّص بموجب رخصة المشاع الإبداعي 2.0 مع نسب العمل إلى مؤلف عام.