เกี่ยวกับ Codelab นี้
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) และสร้างโปรเจ็กต์ใหม่ ดังนี้
โปรดทราบว่ารหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ํากันสําหรับโปรเจ็กต์ 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
หากคุณไปที่พื้นที่เก็บข้อมูล > หน่วยความจําใน Google Cloud Console คุณควรเห็นอินสแตนซ์ใน "Ready"
4 ตั้งค่าอินสแตนซ์ของ Compute Engine
สร้างอินสแตนซ์ Compute Engine ในภูมิภาคเดียวกัน
$ gcloud compute instances create instance-1 --zone us-central1-c
หลังจากดําเนินการเสร็จสิ้นแล้ว อินสแตนซ์ของคุณจะพร้อมใช้งาน
เชื่อมต่อกับอินสแตนซ์ผ่าน SSH โดยไปที่ Compute >, Compute Engine >, อินสแตนซ์ 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
ดูข้อมูลเพิ่มเติม
- การแคชฤดูใบไม้ผลิ
- หน่วยความจํา
- โปรเจ็กต์ Spring on Google Cloud
- ที่เก็บข้อมูล Spring on Google Cloud GitHub
- Java ใน Google Cloud
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตทั่วไปของ Creative Commons Attribution 2.0