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

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

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ ก.พ. 11, 2020
account_circleเขียนโดย Googler

1 ภาพรวม

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 อย่างไร

2 การตั้งค่าและข้อกําหนด

การตั้งค่าสภาพแวดล้อมด้วยตนเอง

หากยังไม่มีบัญชี 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].

3 ตั้งค่าอินสแตนซ์ Memorystore สําหรับ Firestore

เริ่ม 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"

4 ตั้งค่าอินสแตนซ์ของ Compute Engine

สร้างอินสแตนซ์ 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

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

5 ตั้งค่าแอป Spring Boot

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

6 เรียกใช้แอปและเข้าถึงปลายทาง

ตอนนี้คุณพร้อมจะใช้งานแอปแล้ว

$ 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 สําหรับ Firestore โดยใช้ telnet

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

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

KEYS *
hello::bob

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

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

$ GET hello::bob
   Hello bob!

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

8 ล้างข้อมูล

หากต้องการล้าง ให้ลบอินสแตนซ์ 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

9 ยินดีด้วย

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

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

ใบอนุญาต

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