เข้าถึงไฟล์ใน Cloud Storage ด้วย Spring Resource Abstraction

เข้าถึงไฟล์ใน Cloud Storage ด้วย Spring Resource Abstraction

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

subjectอัปเดตล่าสุดเมื่อ เม.ย. 20, 2023
account_circleเขียนโดย meltsufin

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 การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก

  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

คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud

เปิดใช้งาน 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 สร้างไฟล์ใน 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 ได้ด้วย

cloud-editor.png

$ 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 ที่เปิดใช้ฟังก์ชันดังกล่าวด้วย

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

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0