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

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. الإعداد والمتطلبات

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو G Suite، عليك إنشاء حساب.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

يُرجى تذكُّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون مناسبًا لك). ستتم الإشارة إليها لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT_ID.

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

إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "الحذف سريعًا". الذي يقدم لك نصائح حول كيفية إيقاف تشغيل الموارد حتى لا تتكبّد أي فواتير خارج نطاق هذا البرنامج التعليمي. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج الفترة التجريبية المجانية التي تبلغ قيمتها 300 دولار أمريكي.

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

إذا لم يسبق لك بدء تشغيل Cloud Shell، ستظهر لك شاشة وسيطة (الجزء السفلي غير المرئي من الصفحة) تصف ماهيتها. وفي هذه الحالة، انقر على متابعة (ولن تظهر لك مرة أخرى). إليك ما تبدو عليه هذه الشاشة التي تُستخدم لمرة واحدة:

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

من المفترَض أن تستغرق عملية توفير المتطلبات اللازمة والاتصال بخدمة Cloud Shell بضع دقائق فقط.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح أو جهاز Chromebook.

بعد الربط بخدمة Cloud Shell، من المفترض أن يظهر لك أنّه قد تمت مصادقتك وأنّ المشروع معيّن سبق أن تم ضبطه على رقم تعريف مشروعك.

  1. شغِّل الأمر التالي في 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: يجب أن تكون حالة المثيل "جاهزة" الولاية :

ee90b43f15a6dc1f.png

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 في العمود ربط:

a87bd437a0c8c7b4.png

في هيكل المثيل للجهاز الافتراضي (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 مع نسب العمل إلى مؤلف عام.