Compartilhar via


Spring Cloud Stream com Barramento de Serviço do Azure

Este artigo mostra como usar o Spring Cloud Stream Binder para enviar e receber mensagens de queues e topics do Barramento de Serviço.

O Azure fornece uma plataforma de mensagens assíncrona chamada Barramento de Serviço do Azure ("Barramento de Serviço") baseada no padrão Advanced Message Queueing Protocol 1.0 ("AMQP 1.0"). O Barramento de Serviço pode ser usado em todas as plataformas compatíveis do Azure.

Pré-requisitos

Observação

Para conceder à sua conta acesso aos seus recursos do Barramento de Serviços do Azure, atribua Azure Service Bus Data Sender e a função Azure Service Bus Data Receiver à conta do Microsoft Entra que você está usando no momento. Para obter mais informações sobre como conceder funções de acesso, consulte Atribuir funções do Azure usando o portal do Azure e Autenticar e autorizar um aplicativo com a ID do Microsoft Entra para acessar entidades do Barramento de Serviço do Azure.

Importante

É necessário o Spring Boot versão 2.5 ou posterior para concluir as etapas neste artigo.

Enviar e receber mensagens do Barramento de Serviços do Azure

Com uma fila ou tópico para o Barramento de Serviço do Azure, você pode enviar e receber mensagens usando o Barramento de Serviço do Azure Spring Cloud Stream Binder

Para instalar o módulo do Barramento de Serviço do Azure Spring Cloud Stream Binder, adicione as seguintes dependências ao arquivo pom.xml:

  • A lista de materiais (BOM) do Azure Spring Cloud:

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

    Observação

    Se você estiver usando o Spring Boot 2.x, certifique-se de definir a spring-cloud-azure-dependencies versão como 4.19.0. Esta lista de materiais (BOM) deve ser configurada na <dependencyManagement> seção do arquivo pom.xml. Isso garante que todas as dependências do Azure Spring Cloud estejam usando a mesma versão. Para obter mais informações sobre a versão usada para esta BOM, consulte Qual versão do Azure Spring Cloud devo usar.

  • O artefato de Barramento de serviço do Spring Cloud Azure Stream Binder:

    <dependency>
         <groupId>com.azure.spring</groupId>
         <artifactId>spring-cloud-azure-stream-binder-servicebus</artifactId>
    </dependency>
    

Codificar o aplicativo

Use as etapas a seguir para configurar seu aplicativo para usar uma fila ou tópico do Barramento de Serviço para enviar e receber mensagens.

  1. Configure as credenciais do Barramento de Serviço no arquivo de configuração application.properties.

     spring.cloud.azure.servicebus.namespace=${AZURE_SERVICEBUS_NAMESPACE}
     spring.cloud.stream.bindings.consume-in-0.destination=${AZURE_SERVICEBUS_QUEUE_NAME}
     spring.cloud.stream.bindings.supply-out-0.destination=${AZURE_SERVICEBUS_QUEUE_NAME}
     spring.cloud.stream.servicebus.bindings.consume-in-0.consumer.auto-complete=false
     spring.cloud.stream.servicebus.bindings.supply-out-0.producer.entity-type=queue
     spring.cloud.function.definition=consume;supply;
     spring.cloud.stream.poller.fixed-delay=60000 
     spring.cloud.stream.poller.initial-delay=0
    

    A tabela seguinte descreve os campos da configuração:

    Campo Descrição
    spring.cloud.azure.servicebus.namespace Especifique o namespace que você obteve em seu Barramento de Serviços no portal do Azure.
    spring.cloud.stream.bindings.consume-in-0.destination Especifique a fila ou o tópico do Barramento de Serviço usado neste tutorial.
    spring.cloud.stream.bindings.supply-out-0.destination Especifique o mesmo valor usado para o destino de entrada.
    spring.cloud.stream.servicebus.bindings.consume-in-0.consumer.auto-complete Especifique se deseja liquidar as mensagens automaticamente. Se definido como falso, um cabeçalho de mensagem de Checkpointer será adicionado para habilitar que os desenvolvedores liquidem as mensagens manualmente.
    spring.cloud.stream.servicebus.bindings.supply-out-0.producer.entity-type Especifique o tipo de entidade para a associação de saída, pode ser queue ou topic.
    spring.cloud.function.definition Especifique qual bean funcional deve ser associado aos destinos externos expostos pelas associações.
    spring.cloud.stream.poller.fixed-delay Especifique o atraso fixo para o pesquisador padrão em milissegundos. O valor padrão é 1000 L. O valor recomendado é 60000.
    spring.cloud.stream.poller.initial-delay Especifique o atraso inicial para gatilhos. O valor padrão é 0.
  2. Edite o arquivo de classe de inicialização para mostrar o conteúdo a seguir.

    import com.azure.spring.messaging.checkpoint.Checkpointer;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.messaging.Message;
    import org.springframework.messaging.support.MessageBuilder;
    import reactor.core.publisher.Flux;
    import reactor.core.publisher.Sinks;
    import java.util.function.Consumer;
    import java.util.function.Supplier;
    import static com.azure.spring.messaging.AzureHeaders.CHECKPOINTER;
    
    @SpringBootApplication
    public class ServiceBusQueueBinderApplication implements CommandLineRunner {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(ServiceBusQueueBinderApplication.class);
        private static final Sinks.Many<Message<String>> many = Sinks.many().unicast().onBackpressureBuffer();
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceBusQueueBinderApplication.class, args);
        }
    
        @Bean
        public Supplier<Flux<Message<String>>> supply() {
            return ()->many.asFlux()
                           .doOnNext(m->LOGGER.info("Manually sending message {}", m))
                           .doOnError(t->LOGGER.error("Error encountered", t));
        }
    
        @Bean
        public Consumer<Message<String>> consume() {
            return message->{
                Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);
                LOGGER.info("New message received: '{}'", message.getPayload());
                checkpointer.success()
                            .doOnSuccess(s->LOGGER.info("Message '{}' successfully checkpointed", message.getPayload()))
                            .doOnError(e->LOGGER.error("Error found", e))
                            .block();
            };
        }
    
        @Override
        public void run(String... args) {
            LOGGER.info("Going to add message {} to Sinks.Many.", "Hello World");
            many.emitNext(MessageBuilder.withPayload("Hello World").build(), Sinks.EmitFailureHandler.FAIL_FAST);
        }
    
    }
    

    Dica

    Neste tutorial, não há operações de autenticação nas configurações ou no código. No entanto, a conexão com os serviços do Azure requer autenticação. Para concluir a autenticação, você precisa usar a Identidade do Azure. O Azure Spring Cloud usa DefaultAzureCredential, que a biblioteca Azure Identity fornece para ajudá-lo a obter credenciais sem nenhuma alteração de código.

    DefaultAzureCredential dá suporte a vários métodos de autenticação e determina qual método usar no runtime. Essa abordagem habilita seu aplicativo a usar diferentes métodos de autenticação em diferentes ambientes, como ambientes locais e de produção, sem implementar código específico do ambiente. Para obter mais informações, consulte DefaultAzureCredential.

    Para concluir a autenticação em ambientes de desenvolvimento locais, você pode usar a CLI do Azure, o Visual Studio Code, o PowerShell ou outros métodos. Para obter mais informações, consulte Autenticação do Azure em ambientes de desenvolvimento Java. Para concluir a autenticação em ambientes de hospedagem do Azure, recomendamos o uso de identidade gerenciada atribuída pelo usuário. Para obter mais informações, confira O que são as identidades gerenciadas para recursos do Azure?

  3. Inicie o aplicativo. Mensagens como o exemplo seguinte serão postadas no log do aplicativo:

    New message received: 'Hello World'
    Message 'Hello World' successfully checkpointed
    

Próximas etapas