1. ภาพรวม
Spring Framework มีResourceLoaderการแยกข้อมูลเพื่อให้อ่านและเขียนไฟล์จากแหล่งที่มาต่างๆ ได้อย่างง่ายดาย เช่น ระบบไฟล์ Classpath หรือเว็บ คุณเพียงแค่ต้องระบุ URI ไปยังทรัพยากรโดยใช้คำนำหน้าโปรโตคอลที่รู้จักกันดี ตัวอย่างเช่น หากต้องการเข้าถึงไฟล์ในระบบไฟล์ในเครื่อง คุณจะต้องระบุ URI เช่น file:/data/config.yaml
คุณจะเขียนแอป Spring Boot ที่จะเข้าถึงไฟล์ที่จัดเก็บไว้ใน Cloud Storage โดยใช้แอบสแตรกชัน Spring Resource และคำนำหน้าโปรโตคอล gs:
โดยคุณจะทำได้โดยใช้ Cloud Shell และเครื่องมือบรรทัดคำสั่ง gcloud ของ Cloud SDK
สิ่งที่คุณจะได้เรียนรู้
- วิธีใช้ Cloud Storage Spring Boot Starter
- วิธีเข้าถึงไฟล์ใน Cloud Storage ด้วย Spring
- วิธีใช้การแยกส่วน
ResourceและWritableResourceของ Spring
สิ่งที่คุณต้องมี
- โปรเจ็กต์ Google Cloud
- เบราว์เซอร์ เช่น Google Chrome
- คุ้นเคยกับโปรแกรมแก้ไขข้อความมาตรฐานของ Linux เช่น Vim, Emacs และ GNU Nano
คุณจะใช้ Codelab อย่างไร
คุณจะให้คะแนนประสบการณ์ในการสร้างเว็บแอป HTML และ CSS เท่าใด
คุณจะให้คะแนนประสบการณ์การใช้บริการ Google Cloud เท่าใด
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)
โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนถูกใช้ไปแล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud
การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย โปรดทำตามวิธีการในส่วน "การล้างข้อมูล" ซึ่งจะแนะนำวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
Cloud Shell
คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud
เปิดใช้งาน Cloud Shell
- จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell
หากไม่เคยเริ่มใช้ Cloud Shell มาก่อน คุณจะเห็นหน้าจอระดับกลาง (ครึ่งหน้าล่าง) ที่อธิบายว่า Cloud Shell คืออะไร ในกรณีนี้ ให้คลิกต่อไป (และคุณจะไม่เห็นหน้าจอนี้อีก) หน้าจอแบบครั้งเดียวจะมีลักษณะดังนี้
การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน
เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานในโค้ดแล็บนี้ได้โดยใช้เพียงเบราว์เซอร์หรือ Chromebook
เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นว่าคุณได้รับการตรวจสอบสิทธิ์แล้วและโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์ของคุณแล้ว
- เรียกใช้คำสั่งต่อไปนี้ใน 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. สร้างไฟล์ใน Cloud Storage
หลังจากเปิด Cloud Shell แล้ว คุณจะเริ่มสร้างไฟล์และโอนไปยัง Cloud Storage ได้
สร้างไฟล์ชื่อ my-file.txt:
$ echo "Hello World from GCS" > my-file.txt
จากนั้นสร้าง Bucket ใหม่ที่ไม่ซ้ำกันใน Cloud Storage แล้วโอนไฟล์ไปยัง Bucket นั้นโดยใช้ gsutil
$ BUCKET=spring-bucket-$USER $ gsutil makebucket gs://$BUCKET $ gsutil copy my-file.txt gs://$BUCKET
ไปที่เบราว์เซอร์พื้นที่เก็บข้อมูลใน Cloud Storage แล้วตรวจสอบว่ามี Bucket และไฟล์อยู่
4. เริ่มต้นแอป Spring Boot
เริ่มเขียนแอปโดยใช้บรรทัดคำสั่งเพื่อสร้างแอป Spring Boot ใหม่ด้วย Spring Initializr ดังนี้
$ curl https://start.spring.io/starter.tgz \ -d type=maven-project \ -d dependencies=web,cloud-gcp-storage -d baseDir=spring-gcs | tar -xzvf -
โปรดทราบว่า Initializr จะเพิ่ม spring-boot-starter-web และ spring-cloud-gcp-starter-storage ลงในการขึ้นต่อกันใน pom.xml ของแอปเทมเพลตโดยอัตโนมัติ
เปลี่ยนไปยังไดเรกทอรีของแอปเทมเพลตโดยใช้คำสั่งต่อไปนี้
$ cd spring-gcs
ตรวจสอบว่า JAVA_HOME ตั้งค่าเป็น JDK เวอร์ชันที่ถูกต้อง
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
สร้างและเรียกใช้แอปโดยใช้ Maven
$ ./mvnw spring-boot:run
แอปจะเริ่มฟังบนพอร์ต 8080 เปิดแท็บ Cloud Shell ใหม่แล้วเรียกใช้ curl เพื่อเข้าถึงแอป
$ curl localhost:8080
คุณควรได้รับการตอบกลับ 404 เนื่องจากแอปยังไม่มีประโยชน์ใดๆ
กลับไปที่แท็บ Cloud Shell ก่อนหน้าซึ่งแอปกำลังทำงานอยู่ แล้วหยุดแอปด้วย Control+C (Command+C ใน Macintosh)
5. อ่านไฟล์ใน Cloud Storage
แก้ไขแอป Spring Boot เพื่อเข้าถึง my-file.txt ซึ่งเป็นไฟล์ที่คุณจัดเก็บไว้ก่อนหน้านี้ใน Cloud Storage เป้าหมายของคุณคือการส่งคืนเนื้อหาของไฟล์ผ่าน HTTP
ในวิธีการต่อไปนี้ คุณจะใช้ Vim เพื่อแก้ไขไฟล์ แต่จะใช้ Emacs, GNU Nano หรือตัวแก้ไขโค้ดในตัวใน Cloud Shell ก็ได้

$ cd ~/spring-gcs
เพิ่ม REST Controller GcsController ลงในแอป
$ vi src/main/java/com/example/demo/GcsController.java
วางโค้ดต่อไปนี้ และอย่าลืมแก้ไข URI ของทรัพยากรด้วยที่เก็บข้อมูลที่คุณสร้างไว้ก่อนหน้านี้ คุณตรวจสอบที่เก็บข้อมูลได้โดยเรียกใช้คำสั่ง echo $BUCKET
src/main/java/com/example/demo/GcsController.java
package com.example.demo;
import java.io.IOException;
import java.nio.charset.Charset;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GcsController {
@Value("gs://REPLACE_WITH_YOUR_BUCKET/my-file.txt")
private Resource gcsFile;
@GetMapping("/")
public String readGcsFile() throws IOException {
return StreamUtils.copyToString(
gcsFile.getInputStream(),
Charset.defaultCharset());
}
}
สร้างและเรียกใช้แอปด้วย Maven โดยทำดังนี้
$ ./mvnw spring-boot:run
แอปจะเริ่มฟังบนพอร์ต 8080 เปิดแท็บ Cloud Shell ใหม่แล้วเรียกใช้ curl เพื่อเข้าถึงแอป
$ curl localhost:8080
ตอนนี้คุณควรเห็นเนื้อหาของไฟล์ที่ส่งคืนจากแอปแล้ว ไปที่แท็บ Cloud Shell ก่อนหน้าซึ่งแอปกำลังทำงานอยู่ แล้วปิดแอปด้วย Control+C (Command+C ใน Macintosh)
6. เขียนไปยังไฟล์ใน Cloud Storage
คุณอ่านเนื้อหาของไฟล์ใน Cloud Storage และแสดงผ่านตัวควบคุม REST ของ Spring ตอนนี้ให้เปลี่ยนเนื้อหาของไฟล์โดยโพสต์เนื้อหาไฟล์ใหม่ไปยังปลายทาง HTTP เดียวกัน
คุณต้องเพิ่มอีกวิธีใน GcsController ที่จะตอบสนองต่อ HTTP POST และเขียนข้อมูลลงในไฟล์ใน Cloud Storage คราวนี้แคสต์ Spring Resource ไปยัง WritableResource
อัปเดต GcsController ด้วยการนำเข้าเพิ่มเติมที่ต้องการ
src/main/java/com/example/demo/GcsController.java
import java.io.OutputStream;
import org.springframework.core.io.WritableResource;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PostMapping;
เพิ่มเมธอดปลายทางใหม่ลงในตัวควบคุม
src/main/java/com/example/demo/GcsController.java
@RestController
public class GcsController {
@PostMapping("/")
String writeGcs(@RequestBody String data) throws IOException {
try (OutputStream os = ((WritableResource) gcsFile).getOutputStream()) {
os.write(data.getBytes());
}
return "file was updated\n";
}
...
}
สร้างและเรียกใช้แอปด้วย Maven โดยทำดังนี้
$ ./mvnw spring-boot:run
แอปจะเริ่มฟังบนพอร์ต 8080 เปิดแท็บ Cloud Shell ใหม่แล้วเรียกใช้ curl เพื่อโพสต์ข้อความไปยังแอป
$ curl -d 'new message' -H 'Content-Type: text/plain' localhost:8080
คุณจะเห็นข้อความยืนยันว่าเนื้อหาของไฟล์ได้รับการอัปเดตแล้ว แต่คุณสามารถยืนยันได้โดยการทำGET
$ curl localhost:8080
คุณควรเห็นเนื้อหาที่อัปเดตของไฟล์ที่ส่งคืนจากแอป กลับไปที่แท็บ Cloud Shell ก่อนหน้าซึ่งแอปกำลังทำงานอยู่ แล้วปิดแอปด้วย Control+C (Command+C ใน Macintosh)
7. ยินดีด้วย
คุณได้เรียนรู้วิธีใช้แอบสแตรกชัน Spring Resource เพื่อเข้าถึงไฟล์ใน Cloud Storage ได้อย่างง่ายดาย คุณเขียนเว็บแอป Spring Boot ที่อ่านและเขียนไปยังไฟล์ใน Cloud Storage ได้ นอกจากนี้ คุณยังได้เรียนรู้เกี่ยวกับ Spring Boot Starter สำหรับ Cloud Storage ที่เปิดใช้ฟังก์ชันดังกล่าว
ดูข้อมูลเพิ่มเติม
- Cloud Storage
- Spring Framework ใน Google Cloud
- ที่เก็บ Spring บน Google Cloud ใน GitHub
- Java บน Google Cloud
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 2.0 แบบทั่วไป