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

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

1. обзор

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

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

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

2. Настройка Google Cloud Storage

2.1. Maven Dependency

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


    com.google.cloud
    google-cloud-storage
    1.17.0

В Maven Central естьlatest version of the library.

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

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

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

  1. Переход кGoogle Cloud Platform Console

  2. Если мы еще не определили проект GCP, мы нажимаем кнопкуcreate и вводим имя проекта, например «example-cloud-tutorial»

  3. В раскрывающемся списке выберите «new service account».

  4. Добавьте имя, например «example-cloud-storage», в поле имени учетной записи.

  5. В разделе «role» выберите «Проект», а затем «Владелец» в подменю.

  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 из инструкцииhere для нашей платформы.

  2. Следуйте быстрому запуску для нашей платформыhere. На шаге 4Initialize the SDK мы выбираем имя проекта на шаге 4 раздела 2.2 выше («example-cloud-storage» или любое другое имя, которое вы использовали).

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

3. Подключение кStorage и созданиеBucket

3.1. Подключиться кStorage

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

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

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

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

3.2. СозданиеBucket

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

Нет ограничений на количество объектов в ведре. GCPlimits количество операций с сегментами иencourages application designers to emphasize operations on objects rather than on buckets.

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

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

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

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

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

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

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

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

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

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

In Google Cloud Storage, objects are stored in Blobs; ИменаBlob могут содержать любой символ Юникода, не более 1024 символов.

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

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

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

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

4.2. Чтение данных сgsutil

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

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

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

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

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

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

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

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

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

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

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

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

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

Page 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://example-1-bucket/my-first-blob
Bye now!

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

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

$ gsutil copy gs://example-1-bucket/my-first-blob my-first-blob
Copying gs://example-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!

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

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

Мы закончим уборкой:

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

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

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

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

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

Примеры кода, как всегда, можно найтиover on GitHub.