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

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

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

  1. ลงชื่อเข้าใช้ Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนถูกใช้ไปแล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้

  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud

การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย โปรดทำตามวิธีการในส่วน "การล้างข้อมูล" ซึ่งจะแนะนำวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

Cloud Shell

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

เปิดใช้งาน Cloud Shell

  1. จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

หากไม่เคยเริ่มใช้ Cloud Shell มาก่อน คุณจะเห็นหน้าจอระดับกลาง (ครึ่งหน้าล่าง) ที่อธิบายว่า Cloud Shell คืออะไร ในกรณีนี้ ให้คลิกต่อไป (และคุณจะไม่เห็นหน้าจอนี้อีก) หน้าจอแบบครั้งเดียวจะมีลักษณะดังนี้

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานในโค้ดแล็บนี้ได้โดยใช้เพียงเบราว์เซอร์หรือ 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

จากนั้นสร้าง 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 ก็ได้

cloud-editor.png

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

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

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 2.0 แบบทั่วไป