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
Uma assinatura do Azure – crie uma gratuitamente.
Java Development Kit (JDK) versão 8 ou superior.
Apache Maven, versão 3.2 ou superior.
O cURL ou um utilitário HTTP semelhante para testar a funcionalidade.
Uma fila ou tópico para o Barramento de Serviço do Azure. Se você não tiver uma, crie uma fila do Barramento de Serviço ou crie um tópico do Barramento de Serviço.
Um aplicativo Spring Boot. Caso não tiver um, crie um projeto Maven com o Spring Initializr. Certifique-se de selecionar Projeto Maven e em Dependências, adicione as dependências Spring Web e Suporte do Azure e selecione Java versão 8 ou superior.
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 como4.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.
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
outopic
.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. 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?
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