«1. Обзор

Google Cloud Storage предлагает онлайн-хранилище, адаптированное к потребностям отдельного приложения в зависимости от местоположения, частоты доступа и стоимости. В отличие от Amazon Web Services, Google Cloud Storage использует единый API для высоко-, средне- и низкочастотного доступа.

Как и большинство облачных платформ, Google предлагает бесплатный уровень доступа; подробности о ценах здесь.

В этом руководстве мы подключимся к хранилищу, создадим корзину, запишем, прочитаем и обновим данные. При использовании API для чтения и записи данных мы также будем использовать утилиту облачного хранилища gsutil.

2. Настройка облачного хранилища Google

2.1. Зависимость Maven

Нам нужно добавить одну зависимость в наш pom.xml:

<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-storage</artifactId>
    <version>1.17.0</version>
</dependency>

Maven Central имеет последнюю версию библиотеки.

2.2. Создайте ключ аутентификации

Прежде чем мы сможем подключиться к Google Cloud, нам нужно настроить аутентификацию. Приложения Google Cloud Platform (GCP) загружают закрытый ключ и информацию о конфигурации из файла конфигурации JSON. Мы генерируем этот файл через консоль GCP. Для доступа к консоли требуется действующая учетная запись Google Cloud Platform.

Мы создаем нашу конфигурацию следующим образом:

  1. Going to the Google Cloud Platform Console
  2. If we haven’t yet defined a GCP project, we click the create button and enter a project name, such as “baeldung-cloud-tutorial
  3. Select “new service account” from the drop-down list
  4. Add a name such as “baeldung-cloud-storage” into the account name field.
  5. Under “role” select Project, and then Owner in the submenu.
  6. Select create, and the console downloads a private key file.

Роль на шаге 6 разрешает учетной записи доступ к ресурсам проекта. Для простоты мы предоставили этой учетной записи полный доступ ко всем ресурсам проекта.

Для производственной среды мы бы определили роль, которая соответствует доступу, необходимому приложению.

2.3. Установите ключ аутентификации

Затем мы копируем файл, загруженный из консоли GCP, в удобное место и указываем на него переменную среды GOOGLE_APPLICATION_CREDENTIALS. Это самый простой способ загрузить учетные данные, хотя ниже мы рассмотрим другой вариант.

Для Linux или Mac:

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/file"

Для Windows:

set GOOGLE_APPLICATION_CREDENTIALS="C:\path\to\file"

2.4. Установите облачные инструменты

Google предоставляет несколько инструментов для управления своей облачной платформой. В этом руководстве мы собираемся использовать gsutil для чтения и записи данных вместе с API.

Мы можем сделать это в два простых шага:

  1. Install the Cloud SDK from the instructions here for our platform.
  2. Follow the Quickstart for our platform here. In step 4 of Initialize the SDK, we select the project name in step 4 of section 2.2 above (“baeldung-cloud-storage” or whichever name you used).

gsutil теперь установлен и настроен для чтения данных из нашего облачного проекта.

3. Подключение к хранилищу и создание корзины

3.1. Подключитесь к хранилищу

Прежде чем мы сможем использовать хранилище Google Cloud, мы должны создать объект службы. Если мы уже настроили переменную среды GOOGLE_APPLICATION_CREDENTIALS, мы можем использовать экземпляр по умолчанию:

Storage storage = StorageOptions.getDefaultInstance().getService();

Если мы не хотим использовать переменную среды, мы должны создать экземпляр Credentials и передать его в хранилище с помощью название проекта:

Credentials credentials = GoogleCredentials
  .fromStream(new FileInputStream("path/to/file"));
Storage storage = StorageOptions.newBuilder().setCredentials(credentials)
  .setProjectId("baeldung-cloud-tutorial").build().getService();

3.2. Создание корзины

Теперь, когда мы подключены и аутентифицированы, мы можем создать корзину. Ведра — это контейнеры, в которых хранятся объекты. Их можно использовать для организации и контроля доступа к данным.

Количество объектов в корзине не ограничено. GCP ограничивает количество операций с сегментами и побуждает разработчиков приложений делать акцент на операциях с объектами, а не с сегментами.

Для создания корзины требуется BucketInfo:

Bucket bucket = storage.create(BucketInfo.of("baeldung-bucket"));

Для этого простого примера мы вводим имя корзины и принимаем свойства по умолчанию. Имена сегментов должны быть глобально уникальными. Если мы выберем имя, которое уже используется, create() завершится ошибкой.

3.3. Изучение корзины с помощью gsutil

Поскольку теперь у нас есть корзина, мы можем проверить ее с помощью gsutil.

Давайте откроем командную строку и посмотрим:

$ gsutil ls -L -b gs://baeldung-1-bucket/
gs://baeldung-1-bucket/ :
	Storage class:			STANDARD
	Location constraint:		US
	Versioning enabled:		None
	Logging configuration:		None
	Website configuration:		None
	CORS configuration: 		None
	Lifecycle configuration:	None
	Requester Pays enabled:		None
	Labels:				None
	Time created:			Sun, 11 Feb 2018 21:09:15 GMT
	Time updated:			Sun, 11 Feb 2018 21:09:15 GMT
	Metageneration:			1
	ACL:
	  [
	    {
	      "entity": "project-owners-385323156907",
	      "projectTeam": {
	        "projectNumber": "385323156907",
	        "team": "owners"
	      },
	      "role": "OWNER"
	    },
	    ...
	  ]
	Default ACL:
	  [
	    {
	      "entity": "project-owners-385323156907",
	      "projectTeam": {
	        "projectNumber": "385323156907",
	        "team": "owners"
	      },
	      "role": "OWNER"
	    },
            ...
	  ]

gsutil очень похож на команды оболочки, и любой, кто знаком с командной строкой Unix, должен чувствовать себя здесь очень комфортно. Обратите внимание, что мы передали путь к нашей корзине в виде URL-адреса: gs://baeldung-1-bucket/ вместе с несколькими другими параметрами.

Параметр ls создает список объектов или сегментов, а параметр -L указывает, что нам нужен подробный список, поэтому мы получили подробную информацию о сегменте, включая время создания и элементы управления доступом.

Давайте добавим некоторые данные в нашу корзину!

4. Чтение, запись и обновление данных

В Google Cloud Storage объекты хранятся в больших двоичных объектах; Имена BLOB-объектов могут содержать любой символ Юникода, но не более 1024 символов.

4.1. Запись данных

Давайте сохраним строку в нашу корзину:

String value = "Hello, World!";
byte[] bytes = value.getBytes(UTF_8);
Blob blob = bucket.create("my-first-blob", bytes);

«

«Как видите, объекты — это просто массивы байтов в корзине, поэтому мы сохраняем строку, просто оперируя ее необработанными байтами.

4.2. Чтение данных с помощью gsutil

Теперь, когда у нас есть ведро с объектом, давайте взглянем на gsutil.

$ gsutil ls gs://baeldung-1-bucket/
gs://baeldung-1-bucket/my-first-blob

Давайте начнем с перечисления содержимого нашей корзины:

Мы снова передали gsutil параметр ls, но пропустили -b и -L, поэтому мы попросили краткий список объектов. Мы получаем список URI для каждого объекта, который в нашем случае один.

$ gsutil cat gs://baeldung-1-bucket/my-first-blob
Hello World!

Давайте рассмотрим объект:

Cat объединяет содержимое объекта в стандартный вывод. Мы видим строку, которую мы записали в Blob.

4.3. Чтение данных

Блобам присваивается BlobId при создании.

Blob blob = storage.get(blobId);
String value = new String(blob.getContent());

Самый простой способ получить BLOB-объект — использовать BlobId:

Мы передаем id в Storage и получаем Blob взамен, а getContent() возвращает байты.

Page<Blob> blobs = bucket.list();
for (Blob blob: blobs.getValues()) {
    if (name.equals(blob.getName())) {
        return new String(blob.getContent());
    }
}

Если у нас нет BlobId, мы можем искать Bucket по имени:

4.4. Обновление данных

String newString = "Bye now!";
Blob blob = storage.get(blobId);
WritableByteChannel channel = blob.writer();
channel.write(ByteBuffer.wrap(newString.getBytes(UTF_8)));
channel.close();

Мы можем обновить большой двоичный объект, извлекая его и затем обращаясь к его WriteableByteChannel:

$ gsutil cat gs://baeldung-1-bucket/my-first-blob
Bye now!

Давайте рассмотрим обновленный объект:

4.5. Сохранить объект в файл, затем удалить

$ gsutil copy gs://baeldung-1-bucket/my-first-blob my-first-blob
Copying gs://baeldung-1-bucket/my-first-blob...
/ [1 files][    9.0 B/    9.0 B]
Operation completed over 1 objects/9.0 B.
Grovers-Mill:~ egoebelbecker$ cat my-first-blob
Bye now!

Давайте сохраним обновленный объект в файл:

Как и ожидалось, опция копирования копирует объект в файл с именем, указанным в командной строке.

gsutil может скопировать любой объект из Google Cloud Storage в локальную файловую систему, если для его хранения достаточно места.

$ gsutil rm gs://baeldung-1-bucket/my-first-blob
Removing gs://baeldung-1-bucket/my-first-blob...
/ [1 objects]
Operation completed over 1 objects.
$ gsutil ls gs://baeldung-1-bucket/
$

Закончим очисткой:

rm (del тоже работает) удаляет указанный объект

5. Заключение

В этом кратком руководстве мы создали учетные данные для Google Cloud Storage и подключились к инфраструктуре. Мы создали корзину, записали данные, а затем прочитали и изменили их. Поскольку мы работаем с API, мы также использовали gsutil для проверки облачного хранилища при создании и чтении данных.

Мы также обсудили, как использовать сегменты и эффективно записывать и изменять данные.