Использование очереди служба хранилища Azure в приложениях Spring

В этой статье показано, как использовать очередь служба хранилища Azure в приложениях Java, созданных с помощью платформы Spring Framework.

Очередь служба хранилища Azure реализует облачную очередь для обеспечения связи между компонентами распределенного приложения. Каждая очередь поддерживает список сообщений, которые могут быть добавлены компонентом отправителя и обработаны компонентом получателя. Очередь позволяет мгновенно масштабировать приложение для удовлетворения спроса.

Spring Cloud Azure предоставляет различные модули для использования фреймворков Spring для отправки сообщений в очереди служба хранилища Azure и получения сообщений из них. Эти модули можно использовать независимо или объединить их для разных вариантов использования, как описано в следующем списке:

Предварительные условия

Примечание.

Чтобы предоставить вашей учетной записи доступ к ресурсам, в вновь созданной учетной записи служба хранилища Azure назначьте роль Storage Queue Data Contributor учетной записи Microsoft Entra, которую вы используете. Для получения дополнительной информации см. в разделе Назначение ролей Azure в портале Azure.

Внимание

Для выполнения действий, описанных в этом руководстве, требуется Spring Boot версии 2.5 или более поздней.

Подготовьте локальную среду

В этом руководстве конфигурации и код не имеют никаких операций проверки подлинности. Однако для подключения к службе Azure требуется проверка подлинности. Чтобы завершить проверку подлинности, необходимо использовать клиентская библиотека Azure Identity. Spring Cloud Azure использует DefaultAzureCredential, которую предоставляет библиотека удостоверений Azure для получения учетных данных без необходимости изменения кода.

DefaultAzureCredential поддерживает несколько методов проверки подлинности и определяет, какой метод следует использовать во время выполнения. Этот подход позволяет приложению использовать различные методы проверки подлинности в разных средах, таких как локальные или рабочие среды, без реализации кода для конкретной среды. Дополнительные сведения см. в разделе DefaultAzureCredential документа Аутентификация Java-приложений, размещенных в Azure.

Сведения об использовании Azure CLI, IntelliJ или других методов для выполнения проверки подлинности в локальных средах разработки см. в разделе Azure аутентификации в средах разработки Java. Чтобы завершить проверку подлинности в средах размещения Azure, рекомендуется использовать управляемое удостоверение. Дополнительные сведения см. в разделе Управляемые удостоверения для ресурсов Azure?

Использование Spring Cloud Starter для служба хранилища Azure Queue

Модуль Starter Spring Cloud служба хранилища Azure Queue импортирует клиентскую библиотеку служба хранилища Azure Queue для Java для платформы Spring Boot. Вы можете использовать Spring Cloud Azure и Azure SDK вместе в совмещаемом режиме. Таким образом, вы можете продолжать использовать api очереди хранилища Java клиента в приложении Spring.

Добавление зависимостей

Чтобы установить модуль Spring Cloud служба хранилища Azure Queue Starter, добавьте следующие зависимости в файл pom.xml:

  • Акт технических спецификаций Spring Cloud Azure (BOM):

    <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>com.azure.spring</groupId>
           <artifactId>spring-cloud-azure-dependencies</artifactId>
           <version>7.3.0</version>
           <type>pom</type>
           <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
    

    Примечание.

    Если вы используете Spring Boot 4.0.x, обязательно установите версию, указанную в spring-cloud-azure-dependencies, на значение 7.3.0.

    Если вы используете Spring Boot 3.5.x, обязательно задайте версию spring-cloud-azure-dependencies на 6.4.0.

    Если вы используете Spring Boot 3.1.x-3.5.x, обязательно установите для нее версию spring-cloud-azure-dependencies на 5.25.0.

    Если вы используете Spring Boot 2.x, обязательно установите версию spring-cloud-azure-dependencies на 4.20.0.

    Эта ведомость материалов (BOM) должна быть сконфигурирована в <dependencyManagement> разделе файла pom.xml. Это гарантирует, что все зависимости Spring Cloud Azure используют одну и ту же версию.

    Дополнительные сведения о версии, используемой для этого BOM, см. в разделе Какую версию Spring Cloud Azure я должен использовать.

  • Артефакт очереди Spring Cloud Хранилище очередей Azure:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-storage-queue</artifactId>
    </dependency>
    

Код приложения для отправки и получения сообщений

В этом разделе показано, как использовать клиенты Хранилище очередей Azure в контексте приложения Spring. У вас есть следующие два варианта:

  • Используйте автоматическую настройку Spring Boot и используйте встроенные клиенты из контекста Spring (рекомендуется).
  • Создайте клиент программным способом.

При автоматической настройке производится автосвязывание клиентских бинов из контейнера инверсии управления Spring (IoC). Этот подход обеспечивает более гибкий и эффективный опыт при работе с клиентами Storage Queue. Автонастройка имеет следующие преимущества:

  • Автонастройка использует внешнюю конфигурацию , чтобы работать с одинаковым кодом приложения в разных средах.

  • Вы можете делегировать фреймворку Spring Boot процесс освоения шаблона проектирования 'строитель' и регистрации клиентов в контексте приложения. Вы сосредоточены только на том, как использовать клиентов с собственными бизнес-требованиями.

  • Индикатор работоспособности можно использовать для проверки состояния и работоспособности приложения и внутренних компонентов.

Примеры кода в следующих разделах показывают, как использовать QueueClient с двумя описанными вариантами.

Совет

пакет SDK Azure Java для очереди хранилища предоставляет несколько клиентов для взаимодействия с очередью хранилища. Стартер также обеспечивает автоматическую настройку для всех клиентов очереди хранилища и билдера клиентов. Эта статья использует только QueueClient в качестве примера.

Использование автоматической настройки Spring Boot

Чтобы отправлять сообщения и получать сообщения из очередей служба хранилища Azure, выполните следующие действия, чтобы настроить приложение:

  1. Настройте имя учетной записи хранения и имя очереди, как показано в следующем примере:

    spring.cloud.azure.storage.queue.account-name=<your-storage-account-name>
    spring.cloud.azure.storage.queue.queue-name=<your-storage-queue-name>
    
  2. Вставьте QueueClient в ваше Spring-приложение и вызовите соответствующие API для отправки сообщений, как показано в следующем примере:

    import com.azure.storage.queue.QueueClient;
    import com.azure.storage.queue.models.QueueMessageItem;
    import com.azure.storage.queue.models.SendMessageResult;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class StorageQueueClientApplication implements CommandLineRunner {
    
        private final static Logger logger = LoggerFactory.getLogger(StorageQueueClientApplication.class);
    
        @Autowired
        private QueueClient queueClient;
    
        public static void main(String[] args) {
            SpringApplication.run(StorageQueueClientApplication.class, args);
        }
    
        @Override
        public void run(String... args) {
         // Using the QueueClient object, call the create method to create the queue in your storage account.
            queueClient.create();
            SendMessageResult sendMessageResult = queueClient.sendMessage("Hello world");
            logger.info("Send message id: {}", sendMessageResult.getMessageId());
    
            QueueMessageItem queueMessageItem = queueClient.receiveMessage();
            logger.info("Received message: {}", new String(queueMessageItem.getBody().toBytes()));
        }
    
    }
    
  3. Запустите приложение. После запуска приложение создает журналы, аналогичные следующему примеру:

    Send message id: ...
    Received message: Hello world
    

Создание клиента программным способом

Вы можете создать клиентские компоненты самостоятельно, но процесс сложный. В приложениях Spring Boot необходимо управлять свойствами, изучать шаблон построителя и регистрировать клиенты в контексте приложения Spring. Ниже показано, как это сделать.

  1. Создайте клиент программным способом в приложении Spring, как показано в следующем примере. Обязательно замените <storage-account-name> заполнитель собственным значением.

    import com.azure.identity.DefaultAzureCredentialBuilder;
    import com.azure.storage.queue.QueueClient;
    import com.azure.storage.queue.QueueClientBuilder;
    import com.azure.storage.queue.models.QueueMessageItem;
    import com.azure.storage.queue.models.SendMessageResult;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class StorageQueueClientApplication implements CommandLineRunner {
    
        private final static String queueName = "test-queue";
        private final static String endpoint = "https://<storage-account-name>.queue.core.windows.net/";
        private final static Logger logger = LoggerFactory.getLogger(StorageQueueClientApplication.class);
    
        QueueClient queueClient = new QueueClientBuilder()
            .endpoint(endpoint)
            .queueName(queueName)
            .credential(new DefaultAzureCredentialBuilder().build())
            .buildClient();
    
        public static void main(String[] args) {
            SpringApplication.run(StorageQueueClientApplication.class, args);
        }
    
        @Override
        public void run(String... args) {
         // Using the QueueClient object, call the create method to create the queue in your storage account.
            queueClient.create();
            SendMessageResult sendMessageResult = queueClient.sendMessage("Hello world");
            logger.info("Send message id: {}", sendMessageResult.getMessageId());
    
            QueueMessageItem queueMessageItem = queueClient.receiveMessage();
            logger.info("Received message: {}", new String(queueMessageItem.getBody().toBytes()));
        }
    
    }
    
  2. Запустите приложение. После запуска приложение создает журналы, аналогичные следующему примеру:

    Send message id: ...
    Received message: Hello world
    

В следующем списке показаны причины, по которым этот код не является гибким или изящным:

  • Названия учетной записи хранения и очередей жёстко закодированы.
  • Если вы используете @Value для получения конфигураций из среды Spring, в файле application.properties невозможно указать IDE.
  • Если у вас есть среда микросервисов, необходимо дублировать код в каждом проекте, и легко допустить ошибки, а также сложно поддерживать согласованность.

К счастью, с Spring Cloud Azure не требуется самостоятельно создавать клиентские бины. Вместо этого можно напрямую внедрить их и использовать свойства конфигурации, с которыми вы уже знакомы для настройки очереди хранилища. Для получения дополнительной информации см. в разделе свойства конфигурации Spring Cloud Azure.

Spring Cloud Azure также предоставляет следующие глобальные конфигурации для различных сценариев. Для получения дополнительной информации см. глобальные свойства конфигурации Spring Cloud Azure.

  • Параметры прокси-сервера.
  • Варианты повтора.

Вы также можете подключиться к разным Azure облакам. Для получения дополнительной информации см. раздел Подключение к различным облакам Azure.

Использование очереди служба хранилища Azure Spring Messaging

Модуль Spring Messaging служба хранилища Azure Queue предоставляет поддержку платформы Spring Messaging с Хранилище очередей Azure.

Если вы используете Spring Messaging служба хранилища Azure очередь сообщений, вы можете использовать функцию StorageQueueTemplate для асинхронной и синхронной отправки сообщений в очереди хранилища.

В следующих разделах показано, как использовать Spring Messaging для отправки и получения сообщений в очередях хранилища Azure.

Добавление зависимостей

Чтобы установить модуль очереди Spring Messaging служба хранилища Azure, добавьте следующие зависимости в файл pom.xml:

  • Акт технических спецификаций Spring Cloud Azure (BOM):

    <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>com.azure.spring</groupId>
           <artifactId>spring-cloud-azure-dependencies</artifactId>
           <version>7.3.0</version>
           <type>pom</type>
           <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
    

    Примечание.

    Если вы используете Spring Boot 4.0.x, обязательно установите версию, указанную в spring-cloud-azure-dependencies, на значение 7.3.0.

    Если вы используете Spring Boot 3.5.x, обязательно задайте версию spring-cloud-azure-dependencies на 6.4.0.

    Если вы используете Spring Boot 3.1.x-3.5.x, обязательно установите для нее версию spring-cloud-azure-dependencies на 5.25.0.

    Если вы используете Spring Boot 2.x, обязательно установите версию spring-cloud-azure-dependencies на 4.20.0.

    Эта ведомость материалов (BOM) должна быть сконфигурирована в <dependencyManagement> разделе файла pom.xml. Это гарантирует, что все зависимости Spring Cloud Azure используют одну и ту же версию.

    Дополнительные сведения о версии, используемой для этого BOM, см. в разделе Какую версию Spring Cloud Azure я должен использовать.

  • Начальные артефакты очереди хранилища Spring Cloud Azure и Spring Messaging:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-messaging-azure-storage-queue</artifactId>
    </dependency>
    

Код приложения для отправки и получения сообщений

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

  1. Настройте имя учетной записи служба хранилища Azure для очередей хранилища, как показано в следующем примере:

    spring.cloud.azure.storage.queue.account-name=<your-storage-account-name>
    
  2. Подключите отправителя и получателя для отправки и получения сообщений с помощью Spring, как показано в следующем примере. Обязательно замените <storage-queue-name> заполнитель собственным значением.

    import com.azure.spring.messaging.AzureHeaders;
    import com.azure.spring.messaging.checkpoint.Checkpointer;
    import com.azure.spring.messaging.storage.queue.core.StorageQueueTemplate;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.messaging.Message;
    import org.springframework.messaging.support.MessageBuilder;
    import java.time.Duration;
    
    @SpringBootApplication
    public class StorageQueueMessagingApplication implements CommandLineRunner {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(StorageQueueMessagingApplication.class);
        private static final String STORAGE_QUEUE_NAME = "<storage-queue-name>";
    
        @Autowired
        StorageQueueTemplate storageQueueTemplate;
    
        public static void main(String[] args) {
            SpringApplication.run(StorageQueueMessagingApplication.class, args);
        }
    
        @Override
        public void run(String... args) {
            storageQueueTemplate
                .sendAsync(STORAGE_QUEUE_NAME, MessageBuilder.withPayload("Hello world").build())
                .subscribe();
            LOGGER.info("Message was sent successfully.");
    
            Message<?> message = storageQueueTemplate.receiveAsync(STORAGE_QUEUE_NAME, Duration.ofSeconds(30)).block();
            LOGGER.info("Received message: {}", new String((byte[]) message.getPayload()));
        }
    
    }
    
  3. Запустите приложение. После запуска приложение создает журналы, аналогичные следующему примеру:

    Message was sent successfully.
    ...
    Received message: Hello World
    

Использование очереди хранилища Azure в интеграции Spring

Модуль Spring Integration служба хранилища Azure Queue предоставляет поддержку для фреймворка Spring Integration с использованием очередей хранилища.

Если приложение Spring использует каналы сообщений Spring Integration, вы можете направлять сообщения между каналами сообщений и очередью хранилища с помощью адаптеров каналов. Адаптер входящего канала пересылает сообщения из очереди хранилища в канал сообщений. Адаптер канала исходящих сообщений публикует сообщения из канала сообщений в очередь для хранения.

В следующих разделах показано, как использовать очередь Spring Integration служба хранилища Azure для отправки и получения сообщений в очереди хранилища и из нее.

Добавление зависимостей

Чтобы установить модуль очереди Spring Integration служба хранилища Azure, добавьте следующие зависимости в файл pom.xml:

  • Акт технических спецификаций Spring Cloud Azure (BOM):

    <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>com.azure.spring</groupId>
           <artifactId>spring-cloud-azure-dependencies</artifactId>
           <version>7.3.0</version>
           <type>pom</type>
           <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
    

    Примечание.

    Если вы используете Spring Boot 4.0.x, обязательно установите версию, указанную в spring-cloud-azure-dependencies, на значение 7.3.0.

    Если вы используете Spring Boot 3.5.x, обязательно задайте версию spring-cloud-azure-dependencies на 6.4.0.

    Если вы используете Spring Boot 3.1.x-3.5.x, обязательно установите для нее версию spring-cloud-azure-dependencies на 5.25.0.

    Если вы используете Spring Boot 2.x, обязательно установите версию spring-cloud-azure-dependencies на 4.20.0.

    Эта ведомость материалов (BOM) должна быть сконфигурирована в <dependencyManagement> разделе файла pom.xml. Это гарантирует, что все зависимости Spring Cloud Azure используют одну и ту же версию.

    Дополнительные сведения о версии, используемой для этого BOM, см. в разделе Какую версию Spring Cloud Azure я должен использовать.

  • Артефакты интеграции Spring с очередью служба хранилища Azure:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-integration-storage-queue</artifactId>
    </dependency>
    

Код приложения для отправки и получения сообщений

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

  1. Настройте имя учетной записи служба хранилища Azure для ваших очередей хранения.

    spring.cloud.azure.storage.queue.account-name=<your-storage-account-name>
    
  2. Создайте класс QueueReceiveConfiguration Java, как показано в следующем примере. Этот класс используется для определения приемника сообщений. Обязательно замените <storage-queue-name> заполнитель собственным значением.

    import com.azure.spring.integration.storage.queue.inbound.StorageQueueMessageSource;
    import com.azure.spring.messaging.AzureHeaders;
    import com.azure.spring.messaging.checkpoint.Checkpointer;
    import com.azure.spring.messaging.storage.queue.core.StorageQueueTemplate;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.integration.annotation.InboundChannelAdapter;
    import org.springframework.integration.annotation.Poller;
    import org.springframework.integration.annotation.ServiceActivator;
    import org.springframework.messaging.handler.annotation.Header;
    
    @Configuration
    public class QueueReceiveConfiguration {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(QueueReceiveConfiguration.class);
        private static final String STORAGE_QUEUE_NAME = "<storage-queue-name>";
        private static final String INPUT_CHANNEL = "input";
    
        @Bean
        @InboundChannelAdapter(channel = INPUT_CHANNEL, poller = @Poller(fixedDelay = "1000"))
        public StorageQueueMessageSource storageQueueMessageSource(StorageQueueTemplate storageQueueTemplate) {
            return new StorageQueueMessageSource(STORAGE_QUEUE_NAME, storageQueueTemplate);
        }
    
        @ServiceActivator(inputChannel = INPUT_CHANNEL)
        public void messageReceiver(byte[] payload, @Header(AzureHeaders.CHECKPOINTER) Checkpointer checkpointer) {
            String message = new String(payload);
            LOGGER.info("Received message: {}", message);
        }
    
    }
    
  3. Создайте класс QueueSendConfiguration Java, как показано в следующем примере. Этот класс используется для определения отправителя сообщения. Обязательно замените <storage-queue-name> заполнитель собственным значением.

    import com.azure.spring.integration.core.handler.DefaultMessageHandler;
    import com.azure.spring.messaging.storage.queue.core.StorageQueueTemplate;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.integration.annotation.MessagingGateway;
    import org.springframework.integration.annotation.ServiceActivator;
    import org.springframework.messaging.MessageHandler;
    import org.springframework.util.concurrent.ListenableFutureCallback;
    
    @Configuration
    public class QueueSendConfiguration {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(QueueSendConfiguration.class);
        private static final String STORAGE_QUEUE_NAME = "<storage-queue-name>";
        private static final String OUTPUT_CHANNEL = "output";
    
        @Bean
        @ServiceActivator(inputChannel = OUTPUT_CHANNEL)
        public MessageHandler messageSender(StorageQueueTemplate storageQueueTemplate) {
            DefaultMessageHandler handler = new DefaultMessageHandler(STORAGE_QUEUE_NAME, storageQueueTemplate);
            handler.setSendCallback(new ListenableFutureCallback<Void>() {
                @Override
                public void onSuccess(Void result) {
                    LOGGER.info("Message was sent successfully.");
                }
    
                @Override
                public void onFailure(Throwable ex) {
                    LOGGER.info("There was an error sending the message.");
                }
            });
            return handler;
        }
    
        @MessagingGateway(defaultRequestChannel = OUTPUT_CHANNEL)
        public interface StorageQueueOutboundGateway {
            void send(String text);
        }
    
    }
    
  4. Подключите отправителя и получателя, чтобы отправлять и получать сообщения с использованием Spring.

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.integration.config.EnableIntegration;
    
    @SpringBootApplication
    @EnableIntegration
    @Configuration(proxyBeanMethods = false)
    public class StorageQueueIntegrationApplication {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext applicationContext = SpringApplication.run(StorageQueueIntegrationApplication.class, args);
            QueueSendConfiguration.StorageQueueOutboundGateway storageQueueOutboundGateway = applicationContext.getBeanQueueSendConfiguration.StorageQueueOutboundGateway.class);
            storageQueueOutboundGateway.send("Hello World");
        }
    
    }
    

    Совет

    Не забудьте добавить аннотацию @EnableIntegration, которая включает инфраструктуру Spring Integration.

  5. Запустите приложение. После запуска приложение создает журналы, аналогичные следующему примеру:

    Message was sent successfully.
    Received message: Hello World
    

Развертывание в Приложения Azure Spring

Теперь, когда у вас есть приложение Spring Boot, работающее локально, пришло время переместить его в рабочую среду. Приложения Azure Spring упрощает развертывание приложений Spring Boot для Azure без каких-либо изменений кода. Эта служба управляет инфраструктурой приложений Spring, благодаря чему разработчики могут сосредоточиться на коде. Приложения Azure Spring обеспечивает управление жизненным циклом с помощью комплексного мониторинга и диагностики, управления конфигурацией, обнаружения служб, интеграции CI/CD, развертывания по схеме blue-green и прочее. Чтобы развернуть ваше приложение в Приложения Azure Spring, см. раздел Как развернуть первое приложение в Приложения Azure Spring.

Следующие шаги

См. также

Дополнительные сведения о стартеры Spring Boot, доступных для Microsoft Azure, см. в статье Что такое Spring Cloud Azure?