Доступ к файлам в облачном хранилище с помощью абстракции ресурсов Spring.

1. Обзор

Spring Framework предоставляет абстракцию ResourceLoader для удобного чтения и записи файлов из различных источников, таких как файловая система, classpath или веб-браузер. Вам просто нужно указать URI ресурса, используя общеизвестный префикс протокола. Например, для доступа к файлу в локальной файловой системе вы укажете URI вида file:/data/config.yaml .

Вам предстоит написать приложение Spring Boot, которое будет получать доступ к файлам, хранящимся в Cloud Storage, используя абстракцию Spring Resource и префикс протокола gs:

Это можно сделать с помощью Cloud Shell и инструмента командной строки gcloud из Cloud SDK.

Что вы узнаете

  • Как использовать Spring Boot Starter для облачного хранилища
  • Как получить доступ к файлам в облачном хранилище с помощью Spring
  • Как использовать абстракции Resource и WritableResource в Spring

Что вам понадобится

  • Проект Google Cloud
  • Браузер, например, Google Chrome
  • Знание стандартных текстовых редакторов Linux, таких как Vim, Emacs и GNU Nano.

Как вы будете использовать этот практический курс?

Только для чтения Прочитайте и выполните упражнения.

Как бы вы оценили свой опыт разработки веб-приложений на HTML и CSS?

Новичок Средний Профессионал

Как бы вы оценили свой опыт использования сервисов Google Cloud?

Новичок Средний Профессионал

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в Cloud Console и создайте новый проект или используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Запомните идентификатор проекта (Project ID) — уникальное имя для всех проектов Google Cloud (указанное выше имя уже занято и вам не подойдёт, извините!). В дальнейшем в этом практическом занятии оно будет обозначаться как PROJECT_ID .

  1. Далее вам потребуется включить оплату в Cloud Console, чтобы использовать ресурсы Google Cloud.

Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Обязательно следуйте инструкциям в разделе «Очистка», где указано, как отключить ресурсы, чтобы избежать дополнительных расходов после завершения этого урока. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Облачная оболочка

Вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud.

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать Cloud Shell» . H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ .

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Если вы никогда раньше не запускали Cloud Shell, вам будет показан промежуточный экран (внизу), описывающий его назначение. В этом случае нажмите «Продолжить» (и вы больше никогда его не увидите). Вот как выглядит этот одноразовый экран:

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

Подготовка и подключение к Cloud Shell займут всего несколько минут.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, работа в этом практическом задании может быть выполнена с помощью обычного браузера или вашего 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 Shell вы можете начать создавать файлы и переносить их в облачное хранилище.

Создайте файл с именем 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

Убедитесь, что 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 на Mac).

5. Прочитайте файл в облачном хранилище.

Измените ваше 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 на Mac).

6. Запись в файл в облачном хранилище.

Вы прочитали содержимое файла в 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 на Mac).

7. Поздравляем!

Вы научились использовать абстракцию Spring Resource для простого доступа к файлам в Cloud Storage. Вы написали веб-приложение Spring Boot, которое может читать и записывать данные в файл в Cloud Storage. Вы также изучили стартовый пакет Spring Boot для Cloud Storage, который обеспечивает эту функциональность.

Узнать больше

Лицензия

Данная работа распространяется под лицензией Creative Commons Attribution 2.0 Generic.