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

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