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

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

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

Вы сделаете это с помощью Cloud Shell и инструмента командной строки Cloud SDK gcloud.

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

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

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

  • Облачный проект Google
  • Браузер, например Google Chrome
  • Знакомство со стандартными текстовыми редакторами Linux, такими как Vim, Emacs и GNU Nano.

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

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

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

Новичок Средний Опытный

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

Новичок Средний Опытный

Самостоятельная настройка среды

Если у вас еще нет учетной записи Google (Gmail или Google Apps), вы должны создать ее. Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и создайте новый проект:

Скриншот от 10 февраля 2016 г., 12:45:26.png

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

Затем вам нужно включить выставление счетов в облачной консоли, чтобы использовать ресурсы Google Cloud.

Прохождение этой кодовой лаборатории не должно стоить вам больше нескольких долларов, но может стоить больше, если вы решите использовать больше ресурсов или оставите их работающими (см. раздел «Очистка» в конце этого документа).

Новые пользователи Google Cloud Platform имеют право на бесплатную пробную версию стоимостью 300 долларов США .

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

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

Активировать облачную оболочку Google

В консоли GCP щелкните значок Cloud Shell на верхней правой панели инструментов:

Затем нажмите «Запустить Cloud Shell»:

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

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

Обратите внимание, что Initializr автоматически добавит spring-boot-starter-web и spring-cloud-gcp-starter-storage в ваши зависимости в 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 , который вы ранее сохранили в облачном хранилище. Ваша цель — просто вернуть содержимое файла через 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).

Вы читаете содержимое файла в облачном хранилище и предоставляете его через контроллер Spring REST. Теперь измените содержимое файла, разместив новое содержимое файла в той же конечной точке HTTP.

Вам нужно добавить еще один метод в GcsController , который будет отвечать на HTTP POST и записывать данные в ваш файл в облачном хранилище. На этот раз приведите 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;

Добавьте новый метод конечной точки в контроллер.

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 для простого доступа к файлам в облачном хранилище. Вы написали веб-приложение Spring Boot, которое может читать и записывать файл в облачном хранилище. Вы также узнали о стартере Spring Boot для облачного хранилища, который обеспечивает эту функциональность.

Учить больше

Лицензия

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