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

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

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

מה תלמדו

  • איך להשתמש ב-Memorystore כקצה עורפי של מטמון לאפליקציית Spring Boot

מה צריך להכין

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

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

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

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

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

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

הגדרת סביבה בקצב עצמאי

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

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

  1. בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים של Google Cloud.

מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. חשוב לבצע את כל ההוראות בקטע 'ניקוי' שמסביר איך להשבית משאבים כדי שלא תצברו חיובים מעבר למדריך הזה. משתמשים חדשים ב-Google Cloud זכאים להשתתף בתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.

הפעלת Cloud Shell

  1. במסוף Cloud, לוחצים על Activate Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RWzVad_4nCwUyfp1RWzVad_4nCwlZUDZ5LtFCZUHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RWzVad_4nCwZlZ5Lt.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

אם זו הפעם הראשונה שאתם מפעילים את 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 ל-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 של המארח מחדש של המכונה, מריצים את הפקודה הבאה. ייעשה בו שימוש שוב מאוחר יותר בעת ההגדרה של אפליקציית Spring Boot.

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

במסוף Google Cloud, נכנסים אל Databases (מסדי נתונים) > Memorystore > Redis המכונה צריכה להיות במצב Ready (מוכן) מדינה (State):

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

יוצרים פרויקט Springboot חדש עם יחסי תלות של 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 חושפת את השיטה כנקודת קצה (endpoint) של 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

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

מוחקים את מכונת המחשוב:

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

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

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

9. מעולה!

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

מידע נוסף

רישיון

היצירה הזו בשימוש ברישיון Creative Commons Attribution 2.0 גנרי.