1. ภาพรวม
เฟรมเวิร์ก Spring มีนามธรรม ResourceLoader
เพื่อให้อ่านและเขียนไฟล์จากแหล่งที่มาต่างๆ ได้อย่างง่ายดาย เช่น ระบบไฟล์, classpath หรือเว็บ คุณเพียงแค่ต้องระบุ URI ให้กับทรัพยากรโดยใช้คำนำหน้าโปรโตคอลที่รู้จักกันดี เช่น หากต้องการเข้าถึงไฟล์ในระบบไฟล์ในเครื่อง คุณจะต้องระบุ URI เช่น file:/data/config.yaml
คุณจะต้องเขียนแอป Spring Boot ที่จะเข้าถึงไฟล์ที่เก็บไว้ใน Cloud Storage โดยใช้ Spring Resource Abstraction และคำนำหน้าโปรโตคอล gs:
โดยใช้ Cloud Shell และเครื่องมือบรรทัดคำสั่ง gcloud ของ Cloud SDK
สิ่งที่คุณจะได้เรียนรู้
- วิธีใช้เงื่อนไขเริ่มต้นการเปิดเครื่อง Cloud Storage Spring
- วิธีเข้าถึงไฟล์ใน Cloud Storage ด้วย Spring
- วิธีใช้นามธรรม
Resource
และWritableResource
ของฤดูใบไม้ผลิ
สิ่งที่คุณต้องมี
- โปรเจ็กต์ Google Cloud
- เบราว์เซอร์ เช่น Google Chrome
- มีความคุ้นเคยกับเครื่องมือแก้ไขข้อความมาตรฐานของ Linux เช่น Vim, Emacs และ GNU Nano
คุณจะใช้ Codelab อย่างไร
คุณจะให้คะแนนประสบการณ์ในการสร้างเว็บแอป HTML และ CSS อย่างไร
คุณจะให้คะแนนความพึงพอใจในการใช้บริการ Google Cloud อย่างไร
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก
- ลงชื่อเข้าใช้ Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)
โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีคนใช้แล้ว และจะใช้ไม่ได้ ขออภัย) และจะมีการอ้างอิงใน Codelab ว่า PROJECT_ID
ในภายหลัง
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud
การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี ตรวจสอบว่าคุณได้ทำตามวิธีการใน "การล้างข้อมูล" ซึ่งจะแนะนำคุณเกี่ยวกับวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD
Cloud Shell
คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud
เปิดใช้งาน Cloud Shell
- คลิกเปิดใช้งาน Cloud Shell จาก Cloud Console
หากคุณไม่เคยเริ่มต้นใช้งาน Cloud Shell มาก่อน คุณจะเห็นหน้าจอตรงกลาง (ครึ่งหน้าล่าง) ซึ่งอธิบายว่านี่คืออะไร หากเป็นเช่นนั้น ให้คลิกดำเนินการต่อ (คุณจะไม่เห็นการดำเนินการนี้อีก) หน้าจอแบบครั้งเดียวมีลักษณะดังนี้
การจัดสรรและเชื่อมต่อกับ Cloud Shell ใช้เวลาเพียงไม่กี่นาที
เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ทำงานอย่างต่อเนื่องใน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์หรือ 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
จากนั้นสร้างที่เก็บข้อมูลใหม่ที่ไม่ซ้ำกันใน Cloud Storage และโอนไฟล์ไปยังฐานข้อมูลดังกล่าวโดยใช้ gsutil
$ BUCKET=spring-bucket-$USER $ gsutil makebucket gs://$BUCKET $ gsutil copy my-file.txt gs://$BUCKET
ไปที่เบราว์เซอร์พื้นที่เก็บข้อมูลใน Cloud Storage แล้วยืนยันว่าที่เก็บข้อมูลและไฟล์อยู่ในนั้น
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
ไปยังทรัพยากร Dependency ใน 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 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 คราวนี้ให้แคสต์ฤดูใบไม้ผลิ 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 Abstraction เพื่อเข้าถึงไฟล์ใน Cloud Storage ได้อย่างง่ายดาย คุณได้เขียนเว็บแอป Spring Boot ที่อ่านและเขียนไปยังไฟล์ใน Cloud Storage ได้ และคุณยังได้เรียนรู้เกี่ยวกับ Spring Boot starter สำหรับ Cloud Storage ที่เปิดใช้ฟังก์ชันดังกล่าวด้วย
ดูข้อมูลเพิ่มเติม
- พื้นที่เก็บข้อมูลระบบคลาวด์
- เฟรมเวิร์กฤดูใบไม้ผลิบน Google Cloud
- ฤดูใบไม้ผลิบนที่เก็บ GitHub ของ Google Cloud
- Java ใน Google Cloud
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0