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 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 Conectar ion muestra la autenticación SAS.

La autenticación de Microsoft Entra es un mecanismo para conectarse a Azure Event Hubs para Kafka mediante identidades definidas en el identificador de Microsoft Entra. 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 los permisos.

La autenticación de SAS usa el 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 el cadena de conexión por su cuenta.

Requisitos previos

Importante

Se requiere Spring Boot versión 2.5 o posterior para completar los pasos de 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 usar el control de acceso basado en rol de Azure (RBAC de Azure) para conceder 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 del kit de herramientas de Azure para 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 Azure Event Hubs Data Receiver rol y Azure Event Hubs Data Sender a la cuenta de Microsoft Entra que está usando actualmente. Para 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 el identificador de Microsoft Entra.

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.11.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Nota:

    Si usa Spring Boot 2.x, asegúrese de establecer la spring-cloud-azure-dependencies versión 4.17.0en . Esta lista de materiales (BOM) debe configurarse en la <dependencyManagement> sección del archivo pom.xml . Esto garantiza que todas las dependencias de Azure de Spring Cloud usen la misma versión. Para obtener más información sobre la versión que se usa para esta lista de materiales, consulte La versión de Spring Cloud que se debe usar en Azure.

  • 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.

  1. 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 propiedad spring.cloud.stream.binders.<kafka-binder-name>.environment.spring.main.sources con el valor com.azure.spring.cloud.autoconfigure.kafka.AzureKafkaSpringCloudStreamConfiguration.

    Dado 4.4.0que , esta propiedad se agregará automáticamente, por lo que no es necesario agregarla manualmente.

    En la tabla siguiente 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 $Default en para usar el grupo de consumidores básico que se creó al crear la instancia de Azure Event Hubs.
    spring.cloud.stream.bindings.supply-out-0.destination Especifica el centro de eventos de destino de salida, que para 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 spring.cloud.stream.kafka.binder.replicationFactorde configuración , 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.

  2. 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 identidades de Azure 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 a la aplicación usar diferentes métodos de autenticación en distintos entornos (como entornos locales y 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 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, consulte ¿Qué son las identidades administradas para recursos de Azure?

  3. 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 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.

Pasos siguientes