Condividi tramite


Usare Spring Kafka con Azure Event Hubs per l'API Kafka

Questa esercitazione illustra come configurare un binder Spring Cloud Streamer basato su Java per l'uso di Azure Event Hubs per Kafka per l'invio e la ricezione di messaggi con Azure Event Hubs. Per altre informazioni, vedere Use Azure Event Hubs from Apache Kafka applications

In questa esercitazione verranno inclusi due metodi di autenticazione: autenticazione Microsoft Entra e autenticazione SAS (Shared Access Signatures). La scheda Passwordless mostra l'autenticazione Microsoft Entra e la stringa Connection mostra l'autenticazione sas.

L'autenticazione di Microsoft Entra è un meccanismo per connettersi a Azure Event Hubs per Kafka utilizzando le identità definite in Microsoft Entra ID. Con l'autenticazione Microsoft Entra, è possibile gestire le identità utente del database e altri servizi Microsoft in una posizione centrale, semplificando la gestione delle autorizzazioni.

L'autenticazione SAS utilizza la stringa di connessione dello spazio dei nomi Azure Event Hubs per l'accesso delegato ai servizi di Event Hubs per Kafka. Se si sceglie di usare le firme di accesso condiviso come credenziali, è necessario gestire manualmente il connection string.

Prerequisiti

Importante

Spring Boot versione 2.5 o successiva è necessario per completare i passaggi di questa esercitazione.

Preparare le credenziali

Azure Event Hubs supporta l'uso di Microsoft Entra ID per autorizzare le richieste alle risorse di Hub eventi. Con Microsoft Entra ID è possibile usare Azure controllo degli accessi in base al ruolo (Azure RBAC) per concedere autorizzazioni a un'entità principale della sicurezza, che può essere un utente o un principale del servizio applicativo.

Se si vuole eseguire questo esempio in locale con autenticazione Microsoft Entra, assicurarsi che l'account utente sia stato autenticato tramite Azure Toolkit for IntelliJ, Visual Studio Code Azure Plug-in account o Azure CLI. Assicurarsi inoltre che all'account siano state concesse autorizzazioni sufficienti.

Nota

Quando si usano connessioni senza password, è necessario concedere all'account l'accesso alle risorse. In Azure Event Hubs, assegnare il ruolo Azure Event Hubs Data Receiver e Azure Event Hubs Data Sender all'account Microsoft Entra che stai attualmente utilizzando. Per altre informazioni sulla concessione dei ruoli di accesso, vedere Assign Azure roles using the Azure portal and Authorize access to Event Hubs resources using Microsoft Entra ID.

Inviare e ricevere messaggi da Azure Event Hubs

Con un hub eventi Azure è possibile inviare e ricevere messaggi usando Spring Cloud Azure.

Per installare il modulo Spring Cloud Azure Starter, aggiungere le dipendenze seguenti al file pom.xml:

  • L'elenco dei materiali di Spring Cloud Azure (BOM):

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

    Nota

    Se si usa Spring Boot 4.0.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 7.1.0.

    Se si usa Spring Boot 3.5.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 6.1.0.

    Se si usa Spring Boot 3.1.x-3.5.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 5.25.0.

    Se si usa Spring Boot 2.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 4.20.0.

    Questo Bill of Material (BOM) deve essere configurato nella sezione <dependencyManagement> del file pom.xml. In questo modo, tutte le dipendenze di Spring Cloud Azure usano la stessa versione.

    Per ulteriori informazioni sulla versione utilizzata per questo BOM, vedere Quale versione di Spring Cloud Azure dovrei usare.

  • L'artefatto Spring Cloud Azure Starter:

    <dependency>
       <groupId>com.azure.spring</groupId>
       <artifactId>spring-cloud-azure-starter</artifactId>
    </dependency>
    

Codice dell'applicazione

Usare la procedura seguente per configurare l'applicazione per produrre e utilizzare messaggi usando Azure Event Hubs.

  1. Configurare le credenziali dell'hub eventi aggiungendo le proprietà seguenti al file 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}
    

    Suggerimento

    Se si usa la versione spring-cloud-azure-dependencies:4.3.0, è necessario aggiungere la proprietà spring.cloud.stream.binders.<kafka-binder-name>.environment.spring.main.sources con il valore com.azure.spring.cloud.autoconfigure.kafka.AzureKafkaSpringCloudStreamConfiguration.

    Poiché 4.4.0, questa proprietà verrà aggiunta automaticamente, quindi non è necessario aggiungerla manualmente.

    La tabella seguente descrive i campi nella configurazione:

    Campo Descrizione
    spring.cloud.stream.kafka.binder.brokers Specifica l'endpoint di Azure Event Hubs.
    spring.cloud.stream.bindings.consume-in-0.destination Specifica l'hub eventi di input di destinazione, che per questo tutorial è l'hub creato in precedenza.
    spring.cloud.stream.bindings.consume-in-0.group Specifica un gruppo di consumer da Azure Event Hubs, che è possibile impostare su $Default per usare il gruppo di consumer di base creato al momento della creazione dell'istanza di Azure Event Hubs.
    spring.cloud.stream.bindings.supply-out-0.destination Specifica l'hub eventi di destinazione di output, che per questa esercitazione corrisponde alla destinazione di input.

    Nota

    Se si abilita la creazione automatica di argomenti, assicurarsi di aggiungere l'elemento di configurazione spring.cloud.stream.kafka.binder.replicationFactor, con il valore impostato su almeno 1. Per altre informazioni, vedere Spring Cloud Stream Kafka Binder Reference Guide (Guida di riferimento al binder Kafka di Spring Cloud).

  2. Modificare il file della classe di avvio per visualizzare il contenuto seguente.

    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);
        }
    
    }
    

    Suggerimento

    In questa esercitazione non sono presenti operazioni di autenticazione nelle configurazioni o nel codice. Tuttavia, la connessione ai servizi di Azure richiede l'autenticazione. Per completare l'autenticazione, è necessario usare Azure Identity. Spring Cloud Azure usa DefaultAzureCredential, che la libreria di identità Azure fornisce per ottenere le credenziali senza modifiche al codice.

    DefaultAzureCredential supporta più metodi di autenticazione e determina il metodo da usare in fase di esecuzione. Questo approccio consente all'app di usare metodi di autenticazione diversi in ambienti diversi (ad esempio ambienti locali e di produzione) senza implementare codice specifico dell'ambiente. Per altre informazioni, vedere DefaultAzureCredential.

    Per completare l'autenticazione negli ambienti di sviluppo locali, è possibile usare Azure CLI, Visual Studio Code, PowerShell o altri metodi. Per altre informazioni, vedere autenticazione Azure in ambienti di sviluppo Java. Per completare l'autenticazione negli ambienti di hosting Azure, è consigliabile usare l'identità gestita assegnata dall'utente. Per altre informazioni, vedere Che sono identità gestite per le risorse Azure?

  3. Avviare l’applicazione. I messaggi come l'esempio seguente verranno inseriti nel log applicazioni:

    Kafka version: 3.0.1
    Kafka commitId: 62abe01bee039651
    Kafka startTimeMs: 1622616433956
    New message received: 'Hello World'
    

Distribuire su Azure Spring Apps

Ora che l'applicazione Spring Boot è in esecuzione in locale, è possibile spostarla nell'ambiente di produzione. Azure Spring Apps semplifica la distribuzione di applicazioni Spring Boot in Azure senza modifiche al codice. Il servizio gestisce l'infrastruttura delle applicazioni Spring per consentire agli sviluppatori di concentrarsi sul codice. Azure Spring Apps offre la gestione del ciclo di vita usando monitoraggio e diagnostica completi, gestione della configurazione, individuazione dei servizi, integrazione CI/CD, distribuzioni blu-verde e altro ancora. Per distribuire l'applicazione in Azure Spring Apps, vedere Distribuire la prima applicazione in Azure Spring Apps.

Passaggi successivi