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) وأنشِئ مشروعًا جديدًا:
تذكَّر معرّف المشروع، وهو اسم فريد في جميع مشاريع 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.
مزيد من المعلومات
- التخزين المؤقت في Spring Boot
- Memorystore
- مشروع Spring على Google Cloud
- مستودع GitHub الخاص بـ Spring على Google Cloud
- Java على Google Cloud
الترخيص
يخضع هذا العمل لترخيص Creative Commons Attribution 2.0 Generic License.