แคชข้อมูลจากแอป Spring Boot ด้วย Memorystore

Memorystore สำหรับ Redis คือบริการ Redis ที่มีการจัดการครบวงจรสำหรับ Google Cloud แอปที่ทำงานบน Google Cloud จะมีประสิทธิภาพสูงมากได้โดยใช้ประโยชน์จากบริการ Redis ที่ปรับขนาดได้สูง พร้อมใช้งาน และปลอดภัยโดยไม่ต้องรับภาระในการจัดการการติดตั้งใช้งาน Redis ที่ซับซ้อน โดยสามารถใช้เป็นแบ็กเอนด์สำหรับการแคชข้อมูลเพื่อปรับปรุงประสิทธิภาพของแอป 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.cloud.google.com) แล้วสร้างโปรเจ็กต์ใหม่โดยทำดังนี้

ภาพหน้าจอจาก 2016-02-10 12:45:26.png

โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนถูกใช้ไปแล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้

จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud

การทำ Codelab นี้ไม่ควรมีค่าใช้จ่ายเกิน 2-3 ดอลลาร์ แต่ก็อาจมีค่าใช้จ่ายมากกว่านี้หากคุณตัดสินใจใช้ทรัพยากรเพิ่มเติมหรือปล่อยให้ทรัพยากรทำงานต่อไป (ดูส่วน "การล้างข้อมูล" ที่ท้ายเอกสารนี้)

ผู้ใช้ใหม่ของ Google Cloud Platform มีสิทธิ์ทดลองใช้ฟรี$300

เปิดใช้งาน Google Cloud Shell

จาก GCP Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

จากนั้นคลิก "เริ่ม Cloud Shell"

การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่คงอยู่ถาวร และทำงานบน 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].

หลังจากดำเนินการเสร็จแล้ว อินสแตนซ์จะพร้อมใช้งาน

รับ redis host ip-address ของอินสแตนซ์โดยเรียกใช้คำสั่งต่อไปนี้ คุณจะต้องใช้ข้อมูลนี้อีกครั้งในภายหลังเมื่อกำหนดค่าแอป Spring Boot

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

หากไปที่พื้นที่เก็บข้อมูล > Memorystore ใน Google Cloud Console คุณควรจะเห็นอินสแตนซ์อยู่ในสถานะ "พร้อม" ดังนี้

สร้างอินสแตนซ์ Compute Engine ในภูมิภาคเดียวกัน

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

หลังจากดำเนินการเสร็จแล้ว อินสแตนซ์จะพร้อมใช้งาน

เชื่อมต่อกับอินสแตนซ์ผ่าน SSH โดยไปที่ Compute > Compute Engine > อินสแตนซ์ VM แล้วคลิก SSH ในคอลัมน์เชื่อมต่อ

ในเชลล์อินสแตนซ์เครื่องเสมือน (VM) (ไม่ใช่ 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 สำหรับ Redis (จาก 2 ขั้นตอนก่อนหน้า)

spring.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" โดยใช้ร่วมกับค่าพารามิเตอร์เป็นคีย์แคช คุณจะเห็นตัวอย่างในภายหลังในโค้ดแล็บ

นอกจากนี้ คุณยังต้องเปิดใช้การแคชในคลาสแอป 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

โปรดสังเกตว่าครั้งแรกที่คำขอใช้เวลา 5 วินาที แต่ครั้งถัดไปเร็วกว่ามากแม้ว่าคุณจะมีThread.sleep(5000)การเรียกใช้ในเมธอดก็ตาม เนื่องจากระบบจะเรียกใช้วิธีการจริงเพียงครั้งเดียวและนำผลลัพธ์ไปใส่ไว้ในแคช การเรียกใช้ครั้งต่อๆ ไปจะแสดงผลลัพธ์จากแคชโดยตรง

คุณจะเห็นสิ่งที่แอปแคชไว้ได้อย่างชัดเจน จากเทอร์มินัลเดียวกันกับที่ใช้ในขั้นตอนก่อนหน้า ให้เชื่อมต่อกับโฮสต์ Memorystore สำหรับ Redis โดยใช้ Telnet ดังนี้

$ telnet <memorystore-host-ip-address> 6379

หากต้องการดูรายการคีย์แคช ให้ใช้คำสั่งต่อไปนี้

KEYS *
hello::bob

ดังที่เห็น ชื่อแคชจะใช้เป็นคำนำหน้าสำหรับคีย์ และค่าพารามิเตอร์จะใช้เป็นส่วนที่ 2

หากต้องการดึงค่า ให้ใช้คำสั่ง GET

$ GET hello::bob
   Hello bob!

ใช้คำสั่ง QUIT เพื่อออก

หากต้องการล้างข้อมูล ให้ลบอินสแตนซ์ Compute Engine และ Memorystore ออกจาก Cloud Shell

ลบอินสแตนซ์ Compute โดยทำดังนี้

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

ลบอินสแตนซ์ Memorystore สำหรับ Redis โดยทำดังนี้

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

คุณได้สร้าง Memorystore สำหรับ Redis และอินสแตนซ์ Compute Engine นอกจากนี้ คุณยังกำหนดค่าแอป Spring Boot ให้ใช้ Memorystore กับการแคช Spring Boot ด้วย

ดูข้อมูลเพิ่มเติม

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 2.0 แบบทั่วไป