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

Memorystore สําหรับ Firestore คือบริการ GPT ที่มีการจัดการครบวงจรสําหรับ Google Cloud แอปที่ทํางานใน Google Cloud จะทํางานได้อย่างมีประสิทธิภาพสูงสุดด้วยการใช้ประโยชน์จากบริการ GPT ที่รองรับการปรับขนาด ความพร้อมใช้งานสูง และปลอดภัยโดยไม่ต้องจัดการการทําให้ใช้งานได้ที่ซับซ้อนของ GPT โดยใช้เป็นแบ็กเอนด์สําหรับการแคชข้อมูลเพื่อปรับปรุงประสิทธิภาพแอป 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 ทั้งหมด (ชื่อข้างต้นมีผู้อื่นนําไปใช้แล้ว ขออภัยในความไม่สะดวก) และจะเรียกใน Codelab นี้ว่า PROJECT_ID ในภายหลัง

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

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

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

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

จากคอนโซล GCP ให้คลิกไอคอน 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].

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

รับที่อยู่ IP โฮสต์ของการเลิกใช้งานของอินสแตนซ์โดยเรียกใช้คําสั่งต่อไปนี้ คุณจะใช้รหัสผ่านนี้อีกครั้งเมื่อกําหนดค่าแอป Spring Boot

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

หากคุณไปที่พื้นที่เก็บข้อมูล &gt หน่วยความจําใน Google Cloud Console คุณควรเห็นอินสแตนซ์ใน "Ready"

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

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

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

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

ในอินสแตนซ์อินสแตนซ์ของเครื่องเสมือน (VM) (ไม่ใช่ Cloud Shell) ให้ติดตั้ง OpenJDK, Maven, telnet:

$ sudo apt-get install openjdk-8-jdk-headless maven telnet

รอให้ติดตั้งเสร็จก่อนแล้วไปยังขั้นตอนถัดไป

สร้างโปรเจ็กต์ใหม่ในช่วงฤดูใบไม้ผลิโดยใช้ทรัพยากร Dependency ของ 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 สําหรับโฮสต์ Firestore

$ nano src/main/resources/application.properties

เพิ่มบรรทัดต่อไปนี้ด้วยที่อยู่ IP ของ Memorystore for Firestore (จากไม่กี่ขั้นตอนที่ผ่านมา)

spring.redis.host=<memorystore-host-ip-address> 

หลังจากนั้นให้เพิ่มบรรทัดใหม่ แล้วสร้างคลาส Java Controller ของ 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 สําหรับ Firestore โดยใช้ telnet

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

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

KEYS *
hello::bob

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

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

$ GET hello::bob
   Hello bob!

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

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

วิธีลบอินสแตนซ์การประมวลผล

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

วิธีลบอินสแตนซ์ Memorystore for ActiveSync

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

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

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

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตทั่วไปของ Creative Commons Attribution 2.0