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

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

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

subjectอัปเดตล่าสุดเมื่อ เม.ย. 22, 2024
account_circleเขียนโดย Googler

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