ฤดูใบไม้ผลิของ 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'
สิ่งที่ต้องมี
- โปรเจ็กต์ Google Cloud
- เบราว์เซอร์ เช่น Google Chrome
- ทําความคุ้นเคยกับเครื่องมือแก้ไขข้อความ Linux มาตรฐาน เช่น Vim, Emacs และ GNU Nano
คุณจะใช้ Codelab อย่างไร
คุณจะให้คะแนนประสบการณ์ในการสร้างเว็บแอป HTML และ CSS อย่างไร
คุณจะให้คะแนนประสบการณ์ในการใช้บริการของ Google Cloud อย่างไร
การตั้งค่าสภาพแวดล้อมด้วยตนเอง
หากยังไม่มีบัญชี Google (Gmail หรือ Google Apps) คุณต้องสร้างบัญชี ลงชื่อเข้าใช้คอนโซล Google Cloud Platform (console.cloud.google.com) และสร้างโปรเจ็กต์ใหม่ ดังนี้
โปรดทราบว่ารหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ํากันสําหรับโปรเจ็กต์ 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].
หลังจากเปิดตัว 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 แล้วยืนยันว่าที่เก็บข้อมูลและไฟล์อยู่ในนั้น
เริ่มเขียนแอปโดยใช้บรรทัดคําสั่งเพื่อสร้างแอป 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)
แก้ไขแอป 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)
คุณอ่านเนื้อหาในไฟล์ใน 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)
คุณรู้วิธีใช้นามแฝง Spring Resource เพื่อเข้าถึงไฟล์ต่างๆ ใน Cloud Storage ได้ง่ายๆ คุณเขียนเว็บแอป Spring Boot ที่อ่านและเขียนไฟล์ลงใน Cloud Storage ได้ และคุณได้เรียนรู้เกี่ยวกับ Spring Boot Starter สําหรับ Cloud Storage ที่เปิดใช้ฟังก์ชันการทํางานนั้นแล้ว
ดูข้อมูลเพิ่มเติม
- พื้นที่เก็บข้อมูลระบบคลาวด์
- โปรเจ็กต์ Google Cloud ของ Spring Cloud
- ที่เก็บข้อมูล Spring on Google Cloud GitHub
- Java ใน Google Cloud
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตทั่วไปของ Creative Commons Attribution 2.0