Упражнение. Настройка и инициализация клиентской библиотеки
Ниже представлен типичный рабочий процесс для приложений, использующих хранилище BLOB-объектов Azure:
Извлечение конфигурации. При запуске загрузите конфигурацию учетной записи хранения, обычно это строк подключения к учетной записи хранения.
Инициализация клиента: для инициализации клиентской библиотеки служба хранилища Azure используйте строка подключения. Эта инициализация создает объекты, используемые приложением для работы с API хранилища BLOB-объектов.
Использование. Для работы с контейнерами и большими двоичными объектами выполните вызовы API с помощью клиентской библиотеки.
Настройка строки подключения
Перед запуском приложения получите строка подключения для используемой учетной записи хранения. Вы можете использовать любой интерфейс управления Azure, чтобы получить его, включая портал Azure, Azure CLI и Azure PowerShell. При настройке веб-приложения для запуска кода в конце этого модуля используйте Azure CLI, чтобы получить строка подключения для созданной ранее учетной записи хранения.
Строки подключения к учетной записи хранения содержат ключ учетной записи. Рассмотрите ключ учетной записи секрет и всегда храните его безопасно. Здесь вы сохраняете строка подключения в параметре приложения Служба приложений. Служба приложений параметры приложения — это безопасное место для секретов приложений. Эта конструкция не поддерживает локальную разработку и не является надежным комплексным решением.
Внимание
В этом примере кода используется строка подключения для авторизации доступа к учетной записи хранения. Эта конфигурация используется для примера. Строки подключения и ключи доступа к учетной записи должны использоваться с осторожностью в коде приложения. Если ключ доступа к учетной записи потерян или случайно помещен в небезопасное расположение, ваша служба может стать уязвимой. Любой пользователь, имеющий ключ доступа, может авторизовать запросы к учетной записи хранения и эффективно иметь доступ ко всем данным.
Для оптимальной безопасности корпорация Майкрософт рекомендует использовать идентификатор Microsoft Entra с управляемыми удостоверениями для авторизации запросов к blob-объектам, очередям и табличным данным, когда это возможно. Дополнительные сведения см. в статье "Авторизация доступа к BLOB-объектам с помощью идентификатора Microsoft Entra".
Инициализация объектной модели хранилища BLOB-объектов
В SDK службы хранилища Azure для .NET стандартная схема использования хранилища BLOB-объектов выглядит следующим образом:
Создайте экземпляр нового объекта
BlobServiceClient
и укажите строку подключения к своей учетной записи хранения.Чтобы получить
BlobContainerClient
, вызовитеGetBlobContainerClient
вBlobServiceClient
с именем контейнера, с которым вы хотите взаимодействовать или который хотите создать.
В коде эти действия выглядят следующим образом.
BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString);
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName);
В этом коде инициализации вызовы по сети не совершаются. Это означает, что некоторые исключения, возникающие из-за неправильной информации, не создаются до конца. Например, если в конструктор класса BlobServiceClient
передается неправильно отформатированная строка подключения, немедленно выдается исключение. Однако если строка подключения указывает на учетную запись хранения, которая не существует, исключение не возникает, пока не попытается выполнить операцию с учетной записью хранения.
В SDK службы хранилища Azure для Java стандартная схема использования Хранилища BLOB-объектов состоит из перечисленных ниже шагов.
Создайте
BlobServiceClient
, создав новыйBlobServiceClientBuilder
объект, используя строку подключения к своей учетной записи хранения.Получите
BlobContainerClient
, вызвавgetBlobContainerClient
вBlobServiceClient
с именем контейнера, с которым вы хотите взаимодействовать или который хотите создать.
В коде эти действия выглядят следующим образом.
BlobServiceClient blobServiceClient = BlobServiceClientBuilder()
.connectionString(connectionString)
.buildClient();
BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(containerName);
В этом коде инициализации вызовы по сети не совершаются. Это означает, что некоторые исключения, возникающие из-за неправильной информации, не создаются до конца. Например, если в BlobServiceClientBuilder
передается неправильно отформатированная строка подключения, немедленно выдается исключение. Однако если строка подключения указывает на учетную запись хранения, которая не существует, исключение не возникает, пока не попытается выполнить операцию с учетной записью хранения.
Создание контейнеров при запуске
Для создания контейнера при запуске приложения или при первой попытке его использования вызовите метод CreateIfNotExistsAsync
класса BlobContainerClient
.
CreateIfNotExistsAsync
не вызывает исключение, если контейнер уже существует, но он выполняет сетевой вызов к Хранилище BLOB-объектов Azure. Вызовите его только один раз во время инициализации, а не каждый раз при попытке использовать контейнер.
Чтобы создать контейнер при запуске приложения или при первом попытке его использования, вызовите запрос на проверку exists
BlobContainerClient
того, существует ли контейнер. Если он не существует, вызовите create
. Вызовите его только один раз во время инициализации, а не каждый раз при попытке использовать контейнер.
Упражнения
Клонирование и изучение незавершенного приложения
Сначала клонируйте начальную копию приложения из GitHub. Чтобы получить копию исходного кода и открыть ее в редакторе, выполните следующие команды в Azure Shell CLI:
git clone https://github.com/MicrosoftDocs/mslearn-store-data-in-azure.git cd mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start code .
В редакторе откройте файл controllers/FilesController.cs. Здесь нет работы, но у вас есть быстрый взгляд на то, что делает приложение.
Этот контроллер реализует интерфейс API с тремя действиями:
- Индекс: (
GET /api/Files
) возвращает список URL-адресов, по одному для каждого отправленного файла. Интерфейсная часть приложения вызывает этот метод для формирования списка гиперссылок на отправленные файлы. - Отправка: (
POST /api/Files
) получает отправленный файл и сохраняет его. - Скачать: (
GET /api/Files/{filename}
) скачивает отдельный файл по его имени.
Чтобы выполнить свою работу, каждый метод вызывает экземпляр
IStorage
с именемstorage
. Существует неполная реализацияIStorage
в models/BlobStorage.cs для заполнения.- Индекс: (
Добавьте пакет NuGet
Добавьте ссылку на SDK службы хранилища Azure. Выполните следующие команды в Azure Shell CLI:
dotnet add package Azure.Storage.Blobs dotnet restore
Эта команда гарантирует, что вы используете последнюю версию клиентской библиотеки хранилища BLOB-объектов.
Настройка
Необходимые значения конфигурации — это строка подключения учетной записи хранения и имя контейнера, который приложение использует для хранения файлов. В этом модуле вы будете запускать приложение только в службе приложение Azure. Следуйте рекомендациям Служба приложений и сохраните значения в параметрах приложения Служба приложений. Это делается при создании экземпляра Служба приложений. На данный момент ничего не нужно делать.
Когда дело доходит до использования конфигурации, начальная приложение включает в себя необходимый сантехнику. Параметр IOptions<AzureStorageConfig>
конструктора имеет BlobStorage
два свойства: строка подключения учетной записи хранения и имя контейнера, который приложение использует для хранения больших двоичных объектов. В методе ConfigureServices
в файле Startup.cs
есть код, загружающий значения из конфигурации при запуске приложения.
Инициализация
В редакторе откройте models/BlobStorage.cs. В верхней части файла добавьте следующие
using
инструкции, чтобы подготовить его к добавлению кода.using Azure; using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models;
Найдите метод
Initialize
. Приложение вызывает этот метод при первом использованииBlobStorage
. Если вам интересно, вы можете посмотретьConfigureServices
на Startup.cs , чтобы узнать, как выполняется вызов.Initialize
— если контейнер еще не существует, он должен создаваться именно здесь. Замените текущую реализациюInitialize
следующим кодом и сохраните работу с помощью CTRL+S.public Task Initialize() { BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString); BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName); return containerClient.CreateIfNotExistsAsync(); }
Клонирование и изучение незавершенного приложения
Сначала клонируйте начальную копию приложения из GitHub. Чтобы получить копию исходного кода и открыть ее в редакторе, выполните следующие команды в Azure Shell CLI:
git clone https://github.com/MicrosoftDocs/mslearn-store-data-in-azure.git cd mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start code .
В редакторе откройте файл src/main/java/com/microsoft/azure/samples/jsf/IndexBean.java. Здесь нет работы, но у вас есть быстрый взгляд на то, что делает приложение.
Эта область запроса в области bean реализует три действия, которые используются src/main/webapp/index.xhtml странице "Лица сервера Java Server" (JSF):
- listFileNames. Возвращает список имен файлов, по одному для каждого отправленного файла. Страница index.xhtml вызывает этот метод для создания списка гиперссылок к отправленным файлам.
- upload: получает отправленный файл и сохраняет его. Содержимое файла и метаданные вставляются в свойство
uploadedFile
платформой JSF. - download. Скачивает отдельный файл по его имени.
Для выполнения работы каждый метод вызывает экземпляр
Storage
с именемstorage
. Существует неполная реализацияStorage
в src/main/java/com/microsoft/azure/samples/service/BlobStorage.java для заполнения.
Добавление ссылки на SDK службы хранилища Azure для Java.
Мы рекомендуем использовать Azure BOM для добавления клиентских библиотек Azure в проект. Она предоставляет простой и элегантный способ управления использованием нескольких клиентских библиотек Azure, обеспечивая минимальный уровень конфликтов зависимостей.
В редакторе откройте файл pom.xml.
Чтобы добавить Azure BOM в проект, добавьте следующий
dependencyManagement
раздел под тегомproject
XML.<dependencyManagement> <dependencies> <dependency> <groupId>com.azure</groupId> <artifactId>azure-sdk-bom</artifactId> <version>1.0.6</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Чтобы добавить пакет SDK служба хранилища Azure для Java, добавьте следующее
dependency
project/dependencies
в xml-раздел.<dependency> <groupId>com.azure</groupId> <artifactId>azure-storage-blob</artifactId> </dependency>
Настройка
Необходимые значения конфигурации — это учетная запись хранения строка подключения и имя контейнера, который приложение использует для хранения файлов. В этом модуле вы будете запускать приложение только в службе приложение Azure. Следуйте рекомендациям Служба приложений и сохраните значения в параметрах приложения Служба приложений. Это делается при создании экземпляра Служба приложений. На данный момент ничего не нужно делать.
Когда дело доходит до использования конфигурации, параметры приложения Службы приложений передаются в код приложения в виде переменных среды. Вы читаете их в коде инициализации.
Инициализация
В редакторе откройте src/main/java/com/microsoft/azure/samples/service/BlobStorage.java. В верхней части файла добавьте следующие
import
инструкции, чтобы подготовить его к добавлению кода.import java.util.stream.Collectors; import com.azure.storage.blob.BlobClient; import com.azure.storage.blob.BlobContainerClient; import com.azure.storage.blob.BlobServiceClient; import com.azure.storage.blob.BlobServiceClientBuilder; import com.azure.storage.blob.models.BlobItem;
Добавьте свойство класса в
BlobStorage
класс для хранения ссылкиBlobContainerClient
.private BlobContainerClient blobContainerClient;
Совет
Клиенты Azure не отслеживают состояние и являются потокобезопасными. Рекомендуется кэшировать их экземпляры там, где это применимо. Например, приложение, над которым вы работаете, использует один контейнер с постоянным именем, поэтому его лучше кэшировать в области времени существования приложения.
BlobStorage
аннотирован@Singleton
, поэтому рекомендуется хранить ссылкуBlobContainerClient
в его поле.Найдите метод
init
с аннотацией@PostConstruct
. Приложение вызывает этот метод после создания экземпляраBlobStorage
и до первого использования.init
— где создать контейнер, если он еще не существует. Замените текущую реализациюinit
следующим кодом и сохраните изменения.@PostConstruct private void init() { String connectionString = System.getenv("STORAGE_CONNECTION_STRING"); String containerName = System.getenv("STORAGE_CONTAINER_NAME"); BlobServiceClient blobServiceClient = new BlobServiceClientBuilder() .connectionString(connectionString) .buildClient(); blobContainerClient = blobServiceClient.getBlobContainerClient(containerName); if (!blobContainerClient.exists()) { blobContainerClient.create(); } }