Memorystore for Redis הוא שירות Redis מנוהל באופן מלא ל-Google Cloud. שימוש בשירות Redis המאובטח, הזמין והניתן להתאמה לעומס, כדי להגיע לביצועי שיא באפליקציות שמריצים ב-Google Cloud, בלי שתצטרכו לנהל פריסות מורכבות של Redis. אפשר להשתמש בו כקצה עורפי (backend) לאחסון נתונים במטמון כדי לשפר את הביצועים של אפליקציות Spring Boot. ב-codelab מוסבר איך להגדיר את התכונה.
מה תלמדו
- איך משתמשים ב-Memorystore כקצה עורפי של מטמון לאפליקציית Spring Boot.
מה צריך להכין
- פרויקט ב-Google Cloud
- דפדפן, כמו Google Chrome
- היכרות עם כלים לעריכת טקסט של Linux, כמו Vim, Emacs ו-GNU Nano
איך תשתמשו ב-codelab?
איזה דירוג מתאים לדעתך לחוויית השימוש שלך בשירותי Google Cloud?
הגדרת סביבה בקצב אישי
אם עדיין אין לכם חשבון Google (Gmail או Google Apps), אתם צריכים ליצור חשבון. נכנסים ל-Google Cloud Platform Console (console.cloud.google.com) ויוצרים פרויקט חדש:
חשוב לזכור את מזהה הפרויקט, שהוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם שמופיע למעלה כבר תפוס ולא יתאים לכם, מצטערים!). בהמשך ה-codelab הזה, נתייחס אליו כאל PROJECT_ID
.
בשלב הבא, תצטרכו להפעיל את החיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.
העלות של התרגיל הזה לא אמורה להיות גבוהה, אבל היא יכולה להיות גבוהה יותר אם תחליטו להשתמש ביותר משאבים או אם תשאירו אותם פועלים (ראו את הקטע 'ניקוי' בסוף המסמך הזה).
משתמשים חדשים ב-Google Cloud Platform זכאים לתקופת ניסיון בחינם בשווי 300$.
הפעלת Google Cloud Shell
ב-GCP Console, לוחצים על סמל Cloud Shell בסרגל הכלים שבפינה השמאלית העליונה:
לאחר מכן לוחצים על 'הפעלת Cloud Shell':
יחלפו כמה רגעים עד שההקצאה והחיבור לסביבת העבודה יושלמו:
המכונה הווירטואלית הזו כוללת את כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-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
אם עוברים אל Storage > Memorystore במסוף Google Cloud, אמור להופיע המופע במצב 'מוכן':
יוצרים מכונה של Compute Engine באותו אזור.
$ gcloud compute instances create instance-1 --zone us-central1-c
אחרי שהפעולה תסתיים, תוכלו להשתמש במופע.
כדי להתחבר למכונה באמצעות SSH, עוברים אל Compute > Compute Engine > VM instances ולוחצים על SSH בעמודה Connect:
במעטפת של המכונה הווירטואלית (לא ב-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 controller:
$ 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); } }
עכשיו אפשר להפעיל את האפליקציה.
$ 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 caching.
מידע נוסף
- שמירה במטמון ב-Spring Boot
- Memorystore
- פרויקט Spring on Google Cloud
- מאגר GitHub של Spring ב-Google Cloud
- Java ב-Google Cloud
רישיון
העבודה הזו בשימוש במסגרת רישיון Creative Commons כללי מגרסה 2.0 המותנה בייחוס.