Usar o Spring Kafka com os Hubs de Eventos do Azure para a API do Kafka
Este tutorial mostra como configurar um Spring Cloud Stream Binder baseado em Java para usar os Hubs de Eventos do Azure para Kafka para enviar e receber mensagens com os Hubs de Eventos do Azure. Para obter mais informações, consulte Usar os Hubs de Eventos do Azure de aplicativos Apache Kafka.
Neste tutorial, incluiremos dois métodos de autenticação: Autenticação do Microsoft Entra e autenticação SAS (Assinaturas de Acesso Compartilhado). A guia Sem senha mostra a autenticação do Microsoft Entra e a guia Cadeia de conexão mostra a autenticação SAS.
A autenticação do Microsoft Entra é um mecanismo para se conectar aos Hubs de Eventos do Azure para Kafka usando identidades definidas no Microsoft Entra ID. Com a autenticação do Microsoft Entra, você pode gerenciar as identidades de usuários do banco de dados e outros serviços da Microsoft em uma só localização central, o que simplifica o gerenciamento de permissões.
A autenticação SAS usa a cadeia de conexão do namespace dos Hubs de Eventos do Azure para o acesso delegado aos Hubs de Eventos para Kafka. Se você optar por usar Assinaturas de Acesso Compartilhado como credenciais, precisará gerenciar a cadeia de conexão por conta própria.
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.
Azure Cloud Shell ou CLI do Azure 2.37.0 ou superior.
Um Hub de Eventos do Azure. Se você não tiver um, crie um hub de eventos usando o portal do Azure.
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, Spring para Apache Kafka e Cloud Stream e, em seguida, selecione Java versão 8 ou superior.
Importante
É necessário o Spring Boot versão 2.5 ou superior para concluir as etapas neste tutorial.
Preparar credenciais
Os Hubs de Eventos do Azure dão suporte ao uso do Microsoft Entra ID para autorizar solicitações aos recursos dos Hubs de Eventos. Com o Microsoft Entra ID, você pode usar o RBAC (controle de acesso baseado em função) do Azure para conceder permissões a uma entidade de segurança, que pode ser um usuário ou entidade de serviço de aplicativo.
Se você quiser executar este exemplo localmente com a autenticação do Microsoft Entra, verifique se sua conta de usuário foi autenticada por meio do Kit de ferramentas do Azure para IntelliJ, plug-in de conta do Azure do Visual Studio Code ou CLI do Azure. Além disso, certifique-se de que a conta tenha recebido permissões suficientes.
Observação
Ao usar conexões sem senha, você precisa conceder à sua conta acesso aos recursos. Nos Hubs de Eventos do Azure, atribua a função Azure Event Hubs Data Receiver
e Azure Event Hubs Data Sender
à 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 Autorizar o acesso aos recursos dos Hubs de Eventos usando a ID do Microsoft Entra.
Enviar e receber mensagens dos Hubs de Eventos do Azure
Com um hub de eventos do Azure, você pode enviar e receber mensagens usando o Azure Spring Cloud.
Para instalar o módulo do Iniciador do Azure Spring Cloud, 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 Iniciador do Azure Spring Cloud:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter</artifactId> </dependency>
Codificar o aplicativo
Use as etapas a seguir para configurar seu aplicativo para produzir e consumir mensagens usando os Hubs de Eventos do Azure.
Configure as credenciais do hub de eventos adicionando as seguintes propriedades ao arquivo application.properties.
spring.cloud.stream.kafka.binder.brokers=${AZ_EVENTHUBS_NAMESPACE_NAME}.servicebus.windows.net:9093 spring.cloud.function.definition=consume;supply spring.cloud.stream.bindings.consume-in-0.destination=${AZ_EVENTHUB_NAME} spring.cloud.stream.bindings.consume-in-0.group=$Default spring.cloud.stream.bindings.supply-out-0.destination=${AZ_EVENTHUB_NAME}
Dica
Se você estiver usando a versão
spring-cloud-azure-dependencies:4.3.0
, deverá adicionar a propriedadespring.cloud.stream.binders.<kafka-binder-name>.environment.spring.main.sources
com o valorcom.azure.spring.cloud.autoconfigure.kafka.AzureKafkaSpringCloudStreamConfiguration
.Como
4.4.0
, essa propriedade será adicionada automaticamente, portanto, não há necessidade de adicioná-la manualmente.A tabela seguinte descreve os campos da configuração:
Campo Descrição spring.cloud.stream.kafka.binder.brokers
Especifica o ponto de extremidade dos Hubs de Eventos do Azure. spring.cloud.stream.bindings.consume-in-0.destination
Especifica o hub de eventos de destino de entrada, que, neste tutorial, é o hub que você criou anteriormente. spring.cloud.stream.bindings.consume-in-0.group
Especifica um Grupo de Consumidores dos Hubs de Eventos do Azure, que você pode definir como $Default
para usar o grupo de consumidores básico que foi criado quando você criou sua instância do Hubs de Eventos do Azure.spring.cloud.stream.bindings.supply-out-0.destination
Especifica o hub de eventos de destino de saída, que, neste tutorial, é o mesmo que o destino de entrada. Observação
Se você habilitar a criação automática de tópicos, adicione o item de configuração
spring.cloud.stream.kafka.binder.replicationFactor
, com valor de pelo menos 1. Para obter mais informações, confira Guia de referência do Kafka Binder do Spring Cloud Stream.Edite o arquivo de classe de inicialização para mostrar o conteúdo a seguir.
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.GenericMessage; import reactor.core.publisher.Flux; import reactor.core.publisher.Sinks; import java.util.function.Consumer; import java.util.function.Supplier; @SpringBootApplication public class EventHubKafkaBinderApplication implements CommandLineRunner { private static final Logger LOGGER = LoggerFactory.getLogger(EventHubKafkaBinderApplication.class); private static final Sinks.Many<Message<String>> many = Sinks.many().unicast().onBackpressureBuffer(); public static void main(String[] args) { SpringApplication.run(EventHubKafkaBinderApplication.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->LOGGER.info("New message received: '{}'", message.getPayload()); } @Override public void run(String... args) { many.emitNext(new GenericMessage<>("Hello World"), 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:
Kafka version: 3.0.1 Kafka commitId: 62abe01bee039651 Kafka startTimeMs: 1622616433956 New message received: 'Hello World'
Implantar no Azure Spring Apps
Agora que você tem o aplicativo Spring Boot em execução localmente, é hora de movê-lo para produção. Os Aplicativos Spring do Azure facilita a implantação de aplicativos Spring Boot no Azure sem nenhuma alteração no código. O serviço gerencia a infraestrutura dos aplicativos do Spring para que os desenvolvedores possam se concentrar no código. O Azure Spring Apps fornece gerenciamento de ciclo de vida usando monitoramento e diagnóstico abrangentes, gerenciamento de configuração, descoberta de serviços, integração de CI/CD, implantações em “blue-green” e muito mais. Para implantar seu aplicativo nos Aplicativos Spring do Azure, consulte Implantar seu primeiro aplicativo nos Aplicativos Spring do Azure.