Mengakses file di Cloud Storage dengan abstraksi Resource Spring

1. Ringkasan

Spring Framework menyediakan abstraksi ResourceLoader untuk membaca dan menulis file dengan mudah dari berbagai sumber, seperti sistem file, classpath, atau web. Anda hanya perlu menentukan URI ke resource menggunakan awalan protokol yang dikenal. Misalnya, untuk mengakses file di sistem file lokal, Anda perlu menentukan URI seperti file:/data/config.yaml.

Anda akan menulis aplikasi Spring Boot yang akan mengakses file yang disimpan di Cloud Storage menggunakan abstraksi Resource Spring dan awalan protokol gs:.

Anda akan melakukannya dengan menggunakan Cloud Shell dan alat command line gcloud Cloud SDK.

Yang akan Anda pelajari

  • Cara menggunakan pemicu Spring Boot Cloud Storage
  • Cara mengakses file di Cloud Storage dengan Spring
  • Cara menggunakan abstraksi Resource dan WritableResource Spring

Yang Anda butuhkan

  • Project Google Cloud
  • Browser, seperti Google Chrome
  • Pemahaman tentang editor teks Linux standar, seperti Vim, Emacs, dan GNU Nano

Bagaimana Anda akan menggunakan codelab?

Hanya baca Membaca dan menyelesaikan latihan

Bagaimana Anda menilai pengalaman Anda membuat aplikasi web HTML dan CSS?

Pemula Menengah Mahir

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?

Pemula Menengah Mahir

2. Penyiapan dan persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. (Jika belum memiliki akun Gmail atau G Suite, Anda harus membuatnya.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Ingat project ID, nama unik di semua project Google Cloud (maaf, nama di atas telah digunakan dan tidak akan berfungsi untuk Anda!) Project ID tersebut selanjutnya akan dirujuk di codelab ini sebagai PROJECT_ID.

  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan resource Google Cloud.

Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Pastikan untuk mengikuti petunjuk yang ada di bagian "Membersihkan" yang memberi tahu Anda cara menonaktifkan resource sehingga tidak menimbulkan penagihan di luar tutorial ini. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Cloud Shell

Anda akan menggunakan Cloud Shell, yakni lingkungan command line yang berjalan di Google Cloud.

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Jika belum pernah memulai Cloud Shell, Anda akan melihat layar perantara (di paruh bawah) yang menjelaskan apa itu Cloud Shell. Jika demikian, klik Lanjutkan (dan Anda tidak akan pernah melihatnya lagi). Berikut tampilan layar sekali-tampil tersebut:

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

Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan hanya dengan browser atau Chromebook.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3. Membuat file di Cloud Storage

Setelah Cloud Shell diluncurkan, Anda dapat mulai membuat file dan mentransfernya ke Cloud Storage.

Buat file bernama my-file.txt:

$ echo "Hello World from GCS" > my-file.txt

Kemudian, buat bucket unik baru di Cloud Storage dan transfer file ke bucket tersebut menggunakan gsutil.

$ BUCKET=spring-bucket-$USER
$ gsutil makebucket gs://$BUCKET
$ gsutil copy my-file.txt gs://$BUCKET

Buka browser penyimpanan di Cloud Storage, dan pastikan bucket dan file ada di sana.

4. Melakukan inisialisasi aplikasi Spring Boot

Mulai tulis aplikasi dengan menggunakan command line untuk menghasilkan aplikasi Spring Boot baru dengan 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 -

Perhatikan bahwa Initializr akan otomatis menambahkan spring-boot-starter-web dan spring-cloud-gcp-starter-storage ke dependensi Anda di pom.xml aplikasi template.

Ubah ke direktori aplikasi template:

$ cd spring-gcs

Pastikan JAVA_HOME disetel ke versi JDK yang benar:

$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

Bangun dan jalankan aplikasi menggunakan Maven.

$ ./mvnw spring-boot:run

Aplikasi akan mulai memproses di port 8080. Buka tab Cloud Shell baru dan jalankan curl untuk mengakses aplikasi.

$ curl localhost:8080

Anda akan mendapatkan respons 404 karena aplikasi belum melakukan hal yang berguna.

Kembali ke tab Cloud Shell sebelumnya tempat aplikasi berjalan, lalu hentikan dengan Control+C (Command+C di Macintosh).

5. Membaca file di Cloud Storage

Ubah aplikasi Spring Boot untuk mengakses my-file.txt, file yang sebelumnya Anda simpan di Cloud Storage. Tujuan Anda adalah untuk menampilkan isi file melalui HTTP.

Dalam petunjuk berikut, Anda akan menggunakan Vim untuk mengedit file, tetapi Anda juga dapat menggunakan Emacs, GNU Nano, atau editor kode bawaan di Cloud Shell:

cloud-editor.png

$ cd ~/spring-gcs

Tambahkan pengontrol REST GcsController ke aplikasi.

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

Tempel kode berikut, dan jangan lupa untuk memperbaiki URI resource dengan bucket yang Anda buat sebelumnya. Anda dapat memeriksa bucket dengan menjalankan perintah 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());
  }
}

Bangun dan jalankan aplikasi dengan Maven:

$ ./mvnw spring-boot:run

Aplikasi mulai memproses di port 8080. Buka tab Cloud Shell baru dan jalankan curl untuk mengakses aplikasi.

$ curl localhost:8080

Sekarang Anda akan melihat bahwa konten file yang ditampilkan dari aplikasi. Buka tab Cloud Shell sebelumnya tempat aplikasi berjalan dan hentikan dengan Control+C (Command+C di Macintosh).

6. Menulis pada file di Cloud Storage

Anda membaca konten file di Cloud Storage dan mengeksposnya melalui pengontrol REST Spring. Sekarang, ubah isi file dengan memposting konten file baru ke endpoint HTTP yang sama.

Anda perlu menambahkan metode lain ke GcsController yang akan merespons HTTP POST dan menulis data ke file Anda di Cloud Storage. Kali ini, transmisikan Spring Resource ke WritableResource.

Update GcsController dengan impor tambahan yang Anda perlukan.

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;

Tambahkan metode endpoint baru ke pengontrol.

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";
  }
  ...
}

Bangun dan jalankan aplikasi dengan Maven:

$ ./mvnw spring-boot:run

Aplikasi mulai memproses di port 8080. Buka tab Cloud Shell baru dan jalankan curl untuk memposting pesan ke aplikasi.

$ curl -d 'new message' -H 'Content-Type: text/plain' localhost:8080

Anda akan melihat konfirmasi bahwa konten file telah diperbarui. Namun, verifikasi hal tersebut dengan melakukan GET.

$ curl localhost:8080

Anda akan melihat konten file yang diupdate yang ditampilkan dari aplikasi. Kembali ke tab Cloud Shell sebelumnya tempat aplikasi berjalan, lalu hentikan dengan Control+C (Command+C di Macintosh).

7. Selamat!

Anda telah mempelajari cara menggunakan abstraksi Spring Resource untuk mengakses file dengan mudah di Cloud Storage. Anda telah menulis aplikasi web Spring Boot yang dapat membaca dan menulis ke file di Cloud Storage. Anda juga telah mempelajari starter Spring Boot untuk Cloud Storage yang mengaktifkan fungsi tersebut.

Pelajari Lebih Lanjut

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.