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

1. ภาพรวม

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

มือใหม่ ระดับกลาง ผู้ชำนาญ

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

การตั้งค่าสภาพแวดล้อมในแบบของคุณ

  1. ลงชื่อเข้าใช้ Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

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

การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี ตรวจสอบว่าคุณได้ทำตามวิธีการใน "การล้างข้อมูล" ซึ่งจะแนะนำคุณเกี่ยวกับวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD

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

  1. คลิกเปิดใช้งาน Cloud Shell กริ๊งๆๆๆ จาก Cloud Console

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

หากคุณไม่เคยเริ่มต้นใช้งาน Cloud Shell มาก่อน คุณจะเห็นหน้าจอตรงกลาง (ครึ่งหน้าล่าง) ซึ่งอธิบายว่านี่คืออะไร หากเป็นเช่นนั้น ให้คลิกดำเนินการต่อ (คุณจะไม่เห็นการดำเนินการนี้อีก) หน้าจอแบบครั้งเดียวมีลักษณะดังนี้

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

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

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ทำงานอย่างต่อเนื่องใน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์หรือ Chromebook เท่านั้น

เมื่อเชื่อมต่อกับ Cloud Shell คุณควรเห็นว่าได้รับการตรวจสอบสิทธิ์แล้ว และโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์แล้ว

  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list

เอาต์พุตจากคำสั่ง

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

เอาต์พุตจากคำสั่ง

[core]
project = <PROJECT_ID>

หากไม่ใช่ ให้ตั้งคำสั่งด้วยคำสั่งนี้

gcloud config set project <PROJECT_ID>

เอาต์พุตจากคำสั่ง

Updated property [core/project].

3. ตั้งค่า Memorystore สำหรับอินสแตนซ์ Redis

เริ่มต้น Cloud Shell

หลังจากเปิดตัว Cloud Shell ให้ใช้บรรทัดคำสั่งเพื่อเปิดใช้ Memorystore API และสร้างอินสแตนซ์ Memorystore ใหม่

$ gcloud services enable redis.googleapis.com
$ gcloud redis instances create myinstance --size=1 --region=us-central1

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

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

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

ในคอนโซล Google Cloud ให้ไปที่ฐานข้อมูล > Memorystore > Redis อินสแตนซ์ของคุณควรอยู่ในสถานะ "พร้อม" รัฐ :

ee90b43f15a6dc1f.png

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

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

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

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

เชื่อมต่อกับอินสแตนซ์ผ่าน SSH ด้วยคำสั่งต่อไปนี้

$ gcloud compute ssh instance-1 --zone us-central1-c

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

a87bd437a0c8c7b4.png

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

$ sudo apt-get install openjdk-17-jdk-headless maven redis-tools

โปรดรอให้การติดตั้งเสร็จสมบูรณ์ แล้วจึงทำขั้นตอนถัดไป

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 \
  -d type=maven-project \
  | tar -xzvf - && cd cache-app

แก้ไขไฟล์ application.properties เพื่อกำหนดค่าแอปให้ใช้ที่อยู่ IP ของอินสแตนซ์ Memorystore สำหรับโฮสต์ Redis

$ nano src/main/resources/application.properties

เพิ่มบรรทัดต่อไปนี้ด้วย Memorystore สำหรับที่อยู่ IP ของ Redis (จาก 2-3 ขั้นตอนที่ผ่านมา)

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

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

ตรวจสอบว่าได้ตั้งค่า JAVA_HOME เป็นเวอร์ชันที่ถูกต้องแล้ว

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

ตอนนี้คุณพร้อมที่จะเรียกใช้แอปแล้ว

$ 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 สำหรับโฮสต์ Redis โดยใช้ redis-cli ดังนี้

$ redis-cli -h <memorystore-host-ip-address>

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

:6379> KEYS *
1) "hello::bob"

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

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

:6379> GET hello::bob
   Hello bob!

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

8. ล้างข้อมูล

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

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

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

ลบอินสแตนซ์ Memorystore สำหรับ Redis

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

9. ยินดีด้วย

คุณได้สร้าง Memorystore สำหรับ Redis และอินสแตนซ์ Compute Engine แล้ว รวมถึงได้กำหนดค่าแอป Spring Boot ให้ใช้ Memorystore กับการแคชการเปิดเครื่องช่วงฤดูใบไม้ผลิด้วย

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

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0