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. הגדרה ודרישות
הגדרת סביבה בקצב עצמאי
- נכנסים למסוף Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. (אם עדיין אין לכם חשבון Gmail או G Suite, עליכם ליצור חשבון).
חשוב לזכור את מזהה הפרויקט, שם ייחודי לכל הפרויקטים ב-Google Cloud (השם שלמעלה כבר תפוס ולא מתאים לכם, סליחה). בהמשך ב-Codelab הזה, היא תיקרא PROJECT_ID
.
- בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים של Google Cloud.
מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. חשוב לבצע את כל ההוראות בקטע 'ניקוי' שמסביר איך להשבית משאבים כדי שלא תצברו חיובים מעבר למדריך הזה. משתמשים חדשים ב-Google Cloud זכאים להשתתף בתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.
הפעלת Cloud Shell
- במסוף Cloud, לוחצים על Activate Cloud Shell .
אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים (בחלק הנגלל) שמתאר מהו. במקרה כזה, לוחצים על המשך (וזה לא יקרה שוב). כך נראה המסך החד-פעמי:
ההקצאה וההתחברות ל-Cloud Shell נמשכת כמה דקות.
למכונה הווירטואלית הזו נטען כל כלי הפיתוח הדרושים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר משמעותית את ביצועי הרשת והאימות. אם לא את כולן, ניתן לבצע חלק גדול מהעבודה ב-Codelab הזה באמצעות דפדפן או 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
בסיום הפעולה, המכונה תהיה מוכנה לשימוש.
כדי לקבל את כתובת ה-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):
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 (התחברות):
במעטפת של המכונה הווירטואלית (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 גנרי.