Uso de Spring Kafka con Azure Event Hubs para Kafka API
En este tutorial se muestra cómo configurar una instancia de Spring Cloud Stream Binder basada en Java para usar Azure Event Hubs para Kafka para enviar y recibir mensajes con Azure Event Hubs. Para obtener más información, consulte Uso de Azure Event Hubs desde aplicaciones de Apache Kafka.
En este tutorial, incluiremos dos métodos de autenticación: Autenticación de Microsoft Entra y Autenticación de firmas de acceso compartido (SAS). La pestaña Sin contraseña muestra la autenticación de Microsoft Entra y la pestaña Cadena de conexión muestra la autenticación de SAS.
La autenticación de Microsoft Entra es un mecanismo para conectarse a Azure Event Hubs para Kafka mediante identidades definidas en Microsoft Entra ID. Con la autenticación de Microsoft Entra, puede administrar las identidades de los usuarios de la base de datos y otros servicios de Microsoft en una ubicación central, lo que simplifica la administración de permisos.
La autenticación de SAS usa la cadena de conexión del espacio de nombres de Azure Event Hubs para el acceso delegado a Event Hubs para Kafka. Si decide usar firmas de acceso compartido como credenciales, debe administrar la cadena de conexión por su cuenta.
Requisitos previos
Una suscripción a Azure: cree una cuenta gratuita.
Kit de desarrollo de Java (JDK) versión 8 o posterior.
Apache Maven, versión 3.2 o posterior.
cURL o una utilidad HTTP similar para probar la funcionalidad.
Azure Cloud Shell o CLI de Azure 2.37.0 o superior.
Un centro de eventos de Azure. Si no tiene ninguno, cree un centro de eventos mediante Azure Portal.
Una aplicación de Spring Boot. Si no tiene ninguna, cree un proyecto de Maven con Spring Initializr. Asegúrese de seleccionar Proyecto Maven y, en Dependencias, agregue las dependencias Spring Web, Spring for Apache Kafka y Cloud Stream y, a continuación, seleccione Java versión 8 o superior.
Importante
Se necesita Spring Boot versión 2.5 o superior para completar los pasos descritos en este tutorial.
Preparación de credenciales
Azure Event Hubs admite el uso de Microsoft Entra ID para autorizar solicitudes a los recursos de Event Hubs. Con Microsoft Entra ID, puede utilizar el control de acceso basado en roles de Azure (Azure RBAC) para otorgar permisos a una entidad de seguridad, que puede ser un usuario o una entidad de servicio de aplicación.
Si quiere ejecutar este ejemplo localmente con la autenticación de Microsoft Entra, asegúrese de que la cuenta de usuario se ha autenticado a través de Azure Toolkit for IntelliJ, el complemento de cuenta de Azure de Visual Studio Code o la CLI de Azure. Además, asegúrese de que a la cuenta se le han concedido permisos suficientes.
Nota:
Al usar conexiones sin contraseña, debe conceder a la cuenta acceso a los recursos. En Azure Event Hubs, asigne el rol Azure Event Hubs Data Receiver
y Azure Event Hubs Data Sender
a la cuenta de Microsoft Entra que está usando actualmente. Para obtener más información sobre cómo conceder roles de acceso, consulte Asignación de roles de Azure mediante Azure Portal y Autorización del acceso a recursos de Event Hubs mediante Microsoft Entra ID.
Envío y recepción de mensajes de Azure Event Hubs
Con un centro de eventos de Azure, puede enviar y recibir mensajes mediante Spring Cloud Azure.
Para instalar el módulo Spring Cloud Azure Starter, agregue las siguientes dependencias al archivo pom.xml :
La lista de materiales (BOM) de Azure de 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>
Nota:
Si usa Spring Boot 2.x, asegúrese de establecer la versión de
spring-cloud-azure-dependencies
en4.19.0
. Esta lista de materiales (BOM) debe configurarse en la sección<dependencyManagement>
del archivo pom.xml. Esto garantiza que todas las dependencias de Spring Cloud Azure usen la misma versión. Para obtener más información sobre la versión que se usa para esta lista de materiales, consulte Qué versión de Spring Cloud Azure debo usar.El artefacto de Spring Cloud Azure Starter:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter</artifactId> </dependency>
Incorporación del código de la aplicación
Siga estos pasos para configurar la aplicación para generar y consumir mensajes mediante Azure Event Hubs.
Configure las credenciales del centro de eventos agregando las siguientes propiedades al archivo 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}
Sugerencia
Si usa la versión
spring-cloud-azure-dependencies:4.3.0
, debe agregar la propiedadspring.cloud.stream.binders.<kafka-binder-name>.environment.spring.main.sources
con el valorcom.azure.spring.cloud.autoconfigure.kafka.AzureKafkaSpringCloudStreamConfiguration
.Desde
4.4.0
, esta propiedad se agregará automáticamente, por lo que no es necesario agregarla manualmente.En la siguiente tabla se describen los campos de la configuración:
Campo Descripción spring.cloud.stream.kafka.binder.brokers
Especifica el punto de conexión de Azure Event Hubs. spring.cloud.stream.bindings.consume-in-0.destination
Especifica el centro de eventos de destino de entrada, que para este tutorial es el centro que creó anteriormente. spring.cloud.stream.bindings.consume-in-0.group
Especifica un grupo de consumidores de Azure Event Hubs, que puede establecer en $Default
para poder usar el grupo de consumidores básico que se creó cuando creó la instancia de Azure Event Hubs.spring.cloud.stream.bindings.supply-out-0.destination
Especifica el centro de eventos de destino de salida, que en este tutorial es el mismo que el destino de entrada. Nota:
Si habilita la creación automática de temas, asegúrese de agregar el elemento de configuración
spring.cloud.stream.kafka.binder.replicationFactor
con el valor establecido en al menos 1. Para más información, consulte la guía de referencia del enlazador de Stream Kafka de Spring Cloud.Edite el archivo de clase de inicio para mostrar el siguiente contenido.
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); } }
Sugerencia
En este tutorial, no hay ninguna operación de autenticación en las configuraciones ni en el código. Sin embargo, la conexión a los servicios de Azure requiere autenticación. Para completar la autenticación, debe usar Azure Identity. Spring Cloud Azure usa
DefaultAzureCredential
, que la biblioteca de Azure Identity proporciona para ayudarle a obtener credenciales sin cambios en el código.DefaultAzureCredential
admite varios métodos de autenticación y determina qué método se usa en tiempo de ejecución. Este enfoque permite que la aplicación use diferentes métodos de autenticación en distintos entornos, como entornos locales o de producción, sin implementar código específico del entorno. Para obtener más información, vea DefaultAzureCredential.Para completar la autenticación en entornos de desarrollo local, puede usar la CLI de Azure, Visual Studio Code, PowerShell u otros métodos. Para obtener más información, consulte Autenticación de Azure en entornos de desarrollo de Java. Para completar la autenticación en entornos de hospedaje de Azure, se recomienda usar la identidad administrada asignada por el usuario. Para obtener más información, consulta ¿Qué son las identidades administradas para recursos de Azure?
Inicie la aplicación. Los mensajes como el ejemplo siguiente se publicarán en el registro de la aplicación:
Kafka version: 3.0.1 Kafka commitId: 62abe01bee039651 Kafka startTimeMs: 1622616433956 New message received: 'Hello World'
Implementación en Azure Spring Apps
Ahora que tiene la aplicación Spring Boot que se ejecuta localmente, es el momento de moverla a producción. Azure Spring Apps facilita la implementación de aplicaciones de Spring Boot en Azure sin necesidad de realizar cambios en el código. El servicio administra la infraestructura de las aplicaciones de Spring, con el fin de que los desarrolladores puedan centrarse en el código. Azure Spring Apps proporciona administración del ciclo de vida mediante el uso de una supervisión y un diagnóstico completos, administración de la configuración, detección de servicios, integración de CI/CD e implementaciones azul-verde, entre otros. Para implementar la aplicación en Azure Spring Apps, consulte Implementación de la primera aplicación en Azure Spring Apps.