เข้าถึงไฟล์ใน Cloud Storage ด้วยนามธรรมของทรัพยากร Spring

เข้าถึงไฟล์ใน Cloud Storage ด้วยนามธรรมของทรัพยากร Spring

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

subjectอัปเดตล่าสุดเมื่อ ก.พ. 10, 2020
account_circleเขียนโดย meltsufin

1 ภาพรวม

ฤดูใบไม้ผลิของ Spring Framework มีนามธรรม ResourceLoader สําหรับการอ่านและเขียนไฟล์จากแหล่งที่มาต่างๆ เช่น ระบบไฟล์, classpath หรือเว็บ เพียงแค่ระบุ URI ไปยังทรัพยากรโดยใช้คํานําหน้าโปรโตคอลที่รู้จักกันดี เช่น หากต้องการเข้าถึงไฟล์ในระบบไฟล์ในเครื่อง คุณจะระบุ URI เช่น file:/data/config.yaml

คุณจะเขียนแอป Spring Boot ที่เข้าถึงไฟล์ที่จัดเก็บไว้ใน Cloud Storage โดยใช้นามธรรมของทรัพยากร Spring และคํานําหน้าโปรโตคอล gs:

ซึ่งจะทําได้โดยใช้ Cloud Shell และเครื่องมือบรรทัดคําสั่ง gcloud ของ Cloud SDK

สิ่งที่จะได้เรียนรู้

  • วิธีใช้การเริ่มต้น Cloud Storage Spring
  • วิธีเข้าถึงไฟล์ใน Cloud Storage ด้วย Spring
  • วิธีใช้นามธรรม Resource และ WritableResource ของ Spring&#39

สิ่งที่ต้องมี

  • โปรเจ็กต์ Google Cloud
  • เบราว์เซอร์ เช่น Google Chrome
  • ทําความคุ้นเคยกับเครื่องมือแก้ไขข้อความ Linux มาตรฐาน เช่น Vim, Emacs และ GNU Nano

คุณจะใช้ Codelab อย่างไร

คุณจะให้คะแนนประสบการณ์ในการสร้างเว็บแอป HTML และ CSS อย่างไร

คุณจะให้คะแนนประสบการณ์ในการใช้บริการของ Google Cloud อย่างไร

2 การตั้งค่าและข้อกําหนด

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

หากยังไม่มีบัญชี Google (Gmail หรือ Google Apps) คุณต้องสร้างบัญชี ลงชื่อเข้าใช้คอนโซล Google Cloud Platform (console.cloud.google.com) และสร้างโปรเจ็กต์ใหม่ ดังนี้

ภาพหน้าจอจาก 2016-02-10 12:45:26.png

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

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

การเรียกใช้ Codelab นี้ไม่ควรมีค่าใช้จ่ายเกิน 2-3 ดอลลาร์ แต่อาจมากกว่านั้นหากคุณตัดสินใจใช้ทรัพยากรเพิ่มเติมหรือปล่อยให้ทรัพยากรทํางาน (ดู "cleanup" ในตอนท้ายของเอกสารนี้)

ผู้ใช้ใหม่ของ Google Cloud Platform มีสิทธิ์รับช่วงทดลองใช้ฟรี $300

Cloud Shell

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

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

จากคอนโซล GCP ให้คลิกไอคอน Cloud Shell บนแถบเครื่องมือด้านขวาบน ดังนี้

จากนั้นคลิก "เริ่ม Cloud Shell"

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

เครื่องเสมือนนี้โหลดด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหน้าแรกขนาด 5 GB ถาวรและทํางานอยู่ใน Google Cloud ซึ่งช่วยปรับปรุงประสิทธิภาพและการตรวจสอบสิทธิ์ของเครือข่ายได้อย่างมาก ไม่เพียงเท่านั้น งานของคุณในห้องทดลองนี้ก็ทําได้โดยใช้เพียงเบราว์เซอร์หรือ Google Chromebook

เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ระบบจะตรวจสอบว่าคุณตรวจสอบสิทธิ์แล้ว และมีการตั้งค่าโปรเจ็กต์เป็น PROJECT_ID แล้ว

เรียกใช้คําสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์

gcloud auth list

เอาต์พุตจากคําสั่ง

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
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 Initializr ดังนี้

$ curl https://start.spring.io/starter.tgz \
-d dependencies=web,cloud-gcp-storage -d baseDir=spring-gcs | tar -xzvf -

โปรดทราบว่าคู่มือเริ่มต้นจะเพิ่ม spring-boot-starter-web และ spring-cloud-gcp-starter-storage ในทรัพยากร Dependency ใน pom.xml ของแอปเทมเพลตโดยอัตโนมัติ

วิธีเปลี่ยนเป็นไดเรกทอรีของแอปเทมเพลต

$ cd spring-gcs

สร้างและเรียกใช้แอปโดยใช้ 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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GcsController {

 
@Value("gs://REPLACE_WITH_YOUR_BUCKET/my-file.txt")
 
private Resource gcsFile;

 
@RequestMapping(value = "/", method = RequestMethod.GET)
 
public String readGcsFile() throws IOException {
   
return StreamUtils.copyToString(
        gcsFile
.getInputStream(),
       
Charset.defaultCharset()) + "\n";
 
}
}

สร้างและเรียกใช้แอปด้วย Maven

$ ./mvnw spring-boot:run

แอปเริ่มฟังในพอร์ต 8080 เปิดแท็บ Cloud Shell ใหม่และเรียกใช้ curl เพื่อเข้าถึงแอป

$ curl localhost:8080

ตอนนี้คุณควรจะเห็นเนื้อหาของไฟล์ที่ส่งคืนมาจากแอป ไปที่แท็บ Cloud Shell ก่อนหน้าซึ่งแอปทํางานอยู่และยุติลงด้วย Control+C (Command+C ใน Macintosh)

6 เขียนไฟล์ใน Cloud Storage

คุณอ่านเนื้อหาในไฟล์ใน Cloud Storage แล้วเปิดเผยผ่านตัวควบคุม Spring REST จากนั้นเปลี่ยนเนื้อหาของไฟล์โดยการโพสต์เนื้อหาของไฟล์ใหม่ไปยังปลายทาง 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;

เพิ่มเมธอดปลายทางใหม่ลงในตัวควบคุม

src/main/java/com/example/demo/GcsController.java

@RestController
public class GcsController {
 
@RequestMapping(value = "/", method = RequestMethod.POST)
 
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 2.0