איך ניגשים לקבצים ב-Cloud Storage באמצעות הפשטה של Spring Resource

1. סקירה כללית

‫Spring Framework מספק ResourceLoader הפשטה לקריאה וכתיבה קלות של קבצים ממקורות שונים, כמו מערכת הקבצים, נתיב המחלקה או האינטרנט. פשוט מציינים את ה-URI למשאב באמצעות קידומת הפרוטוקול המוכרת. לדוגמה, כדי לגשת לקובץ במערכת הקבצים המקומית, צריך לציין URI כמו file:/data/config.yaml.

תכתבו אפליקציית Spring Boot שתגשת לקבצים שמאוחסנים ב-Cloud Storage באמצעות הפשטת המשאבים של Spring והתחילית של הפרוטוקול gs:.

תעשו את זה באמצעות Cloud Shell וכלי שורת הפקודה של Google Cloud.

מה תלמדו

  • איך משתמשים ב-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 (השם שלמעלה כבר תפוס ולא יתאים לכם, מצטערים!). בהמשך ה-codelab הזה נתייחס אליו כאל PROJECT_ID.

  1. לאחר מכן, תצטרכו להפעיל את החיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.

העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. חשוב לפעול לפי ההוראות שבקטע 'ניקוי' כדי להשבית את המשאבים, וכך לא תחויבו על שימוש מעבר למה שמוסבר במדריך הזה. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

Cloud Shell

תשתמשו ב- Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud.

הפעלת Cloud Shell

  1. ב-Cloud Console, לוחצים על Activate 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

המכונה הווירטואלית הזו כוללת את כל הכלים שדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-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 לתלות שלכם ב-pom.xml של אפליקציית התבנית.

עוברים לספרייה של אפליקציית התבנית:

$ cd spring-gcs

מוודאים שגרסת ה-JDK הנכונה מוגדרת ב-JAVA_HOME:

$ 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 והצגתם אותו באמצעות בקר Spring REST. עכשיו משנים את התוכן של הקובץ על ידי פרסום התוכן החדש של הקובץ באותה נקודת קצה של HTTP.

צריך להוסיף עוד שיטה ל-GcsController שתגיב ל-HTTP POST ותכתוב את הנתונים לקובץ ב-Cloud Storage. הפעם, מפעילים Cast של 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 כדי לגשת בקלות לקבצים ב-Cloud Storage. כתבתם אפליקציית אינטרנט של Spring Boot שיכולה לקרוא ולכתוב קובץ ב-Cloud Storage. למדתם גם על Spring Boot starter ל-Cloud Storage שמאפשר את הפונקציונליות הזו.

מידע נוסף

רישיון

העבודה הזו בשימוש במסגרת רישיון Creative Commons שמותנה בייחוס כללי מגרסה 2.0.