Перейти к основному содержимому

Введение в Google Cloud Storage с Java

· 7 мин. чтения

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. Переход в консоль Google Cloud Platform
  2. Если мы еще не определили проект GCP, мы нажимаем кнопку « Создать » и вводим имя проекта, например « foreach-cloud-tutorial » .
  3. В раскрывающемся списке выберите « новая учетная запись службы ».
  4. Добавьте имя, например « foreach-cloud-storage », в поле имени учетной записи.
  5. В разделе « роль » выберите «Проект», а затем «Владелец» в подменю.
  6. Выберите «Создать», и консоль загрузит файл закрытого ключа.

Роль на шаге 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. Установите Cloud SDK из инструкций здесь для нашей платформы.
  2. Следуйте краткому руководству по нашей платформе здесь. На шаге 4 Initialize the SDK мы выбираем имя проекта в шаге 4 раздела 2.2 выше (« foreach-cloud-storage » или любое другое имя, которое вы использовали).

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("foreach-cloud-tutorial").build().getService();

3.2. Создание ведра

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

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

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

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

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

3.3. Изучение ведра с помощью gsutil

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

Откроем командную строку и посмотрим:

$ gsutil ls -L -b gs://foreach-1-bucket/
gs://foreach-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://foreach-1-bucket/ вместе с несколькими другими параметрами.

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

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

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

В Google Cloud Storage объекты хранятся в BLOB- объектах ; Имена 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://foreach-1-bucket/
gs://foreach-1-bucket/my-first-blob

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

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

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

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

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

Blob-объектам присваивается BlobId при создании.

Самый простой способ получить Blob — использовать BlobId :

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

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

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

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

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

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

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

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

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

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

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

$ gsutil copy gs://foreach-1-bucket/my-first-blob my-first-blob
Copying gs://foreach-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://foreach-1-bucket/my-first-blob
Removing gs://foreach-1-bucket/my-first-blob...
/ [1 objects]
Operation completed over 1 objects.
$ gsutil ls gs://foreach-1-bucket/
$

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

5. Вывод

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

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

Образцы кода, как всегда, можно найти на GitHub .