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

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) ויוצרים פרויקט חדש:

Screenshot from 2016-02-10 12:45:26.png

חשוב לזכור את מזהה הפרויקט, שהוא שם ייחודי בכל הפרויקטים ב-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.

מידע נוסף

רישיון

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