แคชข้อมูลจากแอป 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 ทั้งหมด (ชื่อด้านบนมีผู้ใช้แล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้

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

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

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

  1. จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

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

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

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

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานในโค้ดแล็บนี้ได้โดยใช้เพียงเบราว์เซอร์หรือ 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 Console ให้ไปที่ฐานข้อมูล > 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 > Compute Engine > อินสแตนซ์ VM แล้วคลิก SSH ในคอลัมน์เชื่อมต่อ

a87bd437a0c8c7b4.png

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

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

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

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

สร้างโปรเจ็กต์ Spring Boot ใหม่ที่มีการขึ้นต่อกันของ 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

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

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

จากนั้นเราจะเปิดใช้การแคชในคลาสแอป 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 for Redis โดยใช้ redis-cli ดังนี้

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

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

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

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

หากต้องการเรียกข้อมูลค่า ให้ใช้คำสั่ง GET

:6379> GET hello::bob
   Hello bob!

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

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

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

9. ยินดีด้วย

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

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

ใบอนุญาต

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