שמירת נתונים במטמון מאפליקציית Spring Boot באמצעות Memorystore

1. סקירה כללית

Memorystore for Redis הוא שירות Redis מנוהל באופן מלא ל-Google Cloud. שימוש בשירות Redis המאובטח, הזמין והניתן להתאמה לעומס, כדי להגיע לביצועי שיא באפליקציות שמריצים ב-Google Cloud, בלי שתצטרכו לנהל בעצמכם פריסות מורכבות של Redis. אפשר להשתמש בו כבק-אנד לאחסון נתונים במטמון כדי לשפר את הביצועים של אפליקציות Spring Boot. ב-codelab מוסבר איך להגדיר את התכונה.

מה תלמדו

  • איך משתמשים ב-Memorystore כבק-אנד של מטמון לאפליקציית Spring Boot.

מה תצטרכו

  • פרויקט ב-Google Cloud
  • דפדפן, כמו Google Chrome
  • היכרות עם כלים לעריכת טקסט של Linux, כמו Vim, ‏ Emacs ו-GNU Nano

איך תשתמשו ב-codelab?

קריאה בלבד קריאה והשלמת התרגילים

איזה דירוג מתאים לדעתך לחוויית השימוש שלך בשירותי Google Cloud?

מתחילים ביניים מומחים

‫2. הגדרה ודרישות

הגדרת סביבה בקצב אישי

  1. נכנסים אל Cloud Console ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. (אם עדיין אין לכם חשבון Gmail או G Suite, אתם צריכים ליצור חשבון).

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

חשוב לזכור את מזהה הפרויקט, שהוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם שלמעלה כבר תפוס ולא יתאים לכם, מצטערים!). בהמשך ה-codelab הזה נתייחס אליו כאל PROJECT_ID.

  1. לאחר מכן, תצטרכו להפעיל את החיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.

העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. חשוב לפעול לפי ההוראות בקטע 'ניקוי' כדי להשבית את המשאבים, וכך לא תחויבו אחרי שתסיימו את המדריך הזה. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

הפעלת Cloud Shell

  1. ב-Cloud Console, לוחצים על Activate Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים (בחלק הנגלל) עם תיאור של Cloud Shell. במקרה כזה, לוחצים על המשך (והמסך הזה לא יוצג לכם יותר). כך נראה המסך החד-פעמי:

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

הקצאת המשאבים והחיבור ל-Cloud Shell נמשכים רק כמה רגעים.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

המכונה הווירטואלית הזו כוללת את כל הכלים שדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את רוב העבודה ב-codelab הזה, אם לא את כולה, באמצעות דפדפן או 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 for Redis

מפעילים את Cloud Shell.

אחרי שמפעילים את Cloud Shell, משתמשים בשורת הפקודה כדי להפעיל את Memorystore API וליצור מופע חדש של Memorystore.

$ gcloud services enable redis.googleapis.com
$ gcloud redis instances create myinstance --size=1 --region=us-central1

אחרי שהפעולה תסתיים, תוכלו להשתמש במופע.

מריצים את הפקודה הבאה כדי לקבל את כתובת ה-IP של מארח redis של המופע. תשתמשו בו שוב בהמשך כשתיצרו את אפליקציית 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 > Compute Engine > VM instances וללחוץ על SSH בעמודה Connect:

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

מוסיפים את השורה הבאה עם כתובת ה-IP של Memorystore for 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. היא משמשת בשילוב עם ערך הפרמטר כמפתח מטמון. בהמשך ה-Code Lab תראו דוגמה.

בשלב הבא, נפעיל שמירה במטמון בכיתת האפליקציה 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 for 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.

מוחקים את מכונת ה-Compute:

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

מוחקים את מכונת Memorystore for Redis:

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

9. מעולה!

יצרתם Memorystore for Redis ומכונה של Compute Engine. בנוסף, הגדרתם אפליקציית Spring Boot לשימוש ב-Memorystore עם Spring Boot caching.

מידע נוסף

רישיון

עבודה זו מורשית תחת רישיון Creative Commons שמותנה בייחוס 2.0 כללי.