Använda Spring Kafka med Azure Event Hubs för Kafka API

Den här självstudien visar hur du konfigurerar en Java-baserad Spring Cloud Stream Binder för att använda Azure Event Hubs för Kafka för att skicka och ta emot meddelanden med Azure Event Hubs. Mer information finns i Använda Azure Event Hubs från Apache Kafka-program

I den här självstudien ska vi inkludera två autentiseringsmetoder: Microsoft Entra-autentisering och SAS-autentisering (Signatur för delad åtkomst). Fliken Lösenordslös visar Microsoft Entra-autentiseringen och fliken Anslut ionssträng visar SAS-autentiseringen.

Microsoft Entra-autentisering är en mekanism för att ansluta till Azure Event Hubs för Kafka med hjälp av identiteter som definierats i Microsoft Entra-ID. Med Microsoft Entra-autentisering kan du hantera databasanvändares identiteter och andra Microsoft-tjänster på en central plats, vilket förenklar behörighetshanteringen.

SAS-autentisering använder anslutningssträng för ditt Azure Event Hubs-namnområde för delegerad åtkomst till Event Hubs för Kafka. Om du väljer att använda signaturer för delad åtkomst som autentiseringsuppgifter måste du hantera anslutningssträng själv.

Förutsättningar

Viktigt!

Spring Boot version 2.5 eller senare krävs för att slutföra stegen i den här självstudien.

Förbereda autentiseringsuppgifter

Azure Event Hubs stöder användning av Microsoft Entra-ID för att auktorisera begäranden till Event Hubs-resurser. Med Microsoft Entra-ID kan du använda rollbaserad åtkomstkontroll i Azure (Azure RBAC) för att bevilja behörigheter till ett säkerhetsobjekt, som kan vara en användare eller ett huvudnamn för programtjänsten.

Om du vill köra det här exemplet lokalt med Microsoft Entra-autentisering kontrollerar du att ditt användarkonto har autentiserats via Azure Toolkit for IntelliJ, Plugin-programmet Visual Studio Code Azure-konto eller Azure CLI. Kontrollera också att kontot har beviljats tillräckliga behörigheter.

Kommentar

När du använder lösenordslösa anslutningar måste du ge ditt konto åtkomst till resurser. I Azure Event Hubs tilldelar du Azure Event Hubs Data Receiver rollen och Azure Event Hubs Data Sender till det Microsoft Entra-konto som du använder för närvarande. Mer information om hur du beviljar åtkomstroller finns i Tilldela Azure-roller med hjälp av Azure-portalen och Auktorisera åtkomst till Event Hubs-resurser med hjälp av Microsoft Entra-ID.

Skicka och ta emot meddelanden från Azure Event Hubs

Med en Azure Event Hub kan du skicka och ta emot meddelanden med Spring Cloud Azure.

Om du vill installera Spring Cloud Azure Starter-modulen lägger du till följande beroenden i din pom.xml-fil :

  • Spring Cloud Azure Bill of Materials (BOM):

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

    Kommentar

    Om du använder Spring Boot 2.x måste du ange spring-cloud-azure-dependencies versionen till 4.16.0. Den här strukturlistan (BOM) bör konfigureras i avsnittet i <dependencyManagement> din pom.xml-fil . Detta säkerställer att alla Spring Cloud Azure-beroenden använder samma version. Mer information om vilken version som används för den här strukturlistan finns i Vilken version av Spring Cloud Azure ska jag använda.

  • Spring Cloud Azure Starter-artefakten:

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

Koda appen

Använd följande steg för att konfigurera ditt program för att producera och använda meddelanden med Hjälp av Azure Event Hubs.

  1. Konfigurera autentiseringsuppgifterna för händelsehubben genom att lägga till följande egenskaper i filen 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}
    

    Dricks

    Om du använder version spring-cloud-azure-dependencies:4.3.0bör du lägga till egenskapen spring.cloud.stream.binders.<kafka-binder-name>.environment.spring.main.sources med värdet com.azure.spring.cloud.autoconfigure.kafka.AzureKafkaSpringCloudStreamConfiguration.

    Eftersom 4.4.0läggs den här egenskapen till automatiskt, så du behöver inte lägga till den manuellt.

    I följande tabell beskrivs fälten i konfigurationen:

    Fält beskrivning
    spring.cloud.stream.kafka.binder.brokers Anger Azure Event Hubs-slutpunkten.
    spring.cloud.stream.bindings.consume-in-0.destination Anger händelsehubben för indatamål, som för den här självstudien är den hubb som du skapade tidigare.
    spring.cloud.stream.bindings.consume-in-0.group Anger en konsumentgrupp från Azure Event Hubs, som du kan ange till $Default för att använda den grundläggande konsumentgrupp som skapades när du skapade din Azure Event Hubs-instans.
    spring.cloud.stream.bindings.supply-out-0.destination Anger händelsehubben för utdatamål, som för den här självstudien är samma som indatamålet.

    Kommentar

    Om du aktiverar automatisk skapande av ämne måste du lägga till konfigurationsobjektet spring.cloud.stream.kafka.binder.replicationFactor, med värdet inställt på minst 1. Mer information finns i Referensguide för Spring Cloud Stream Kafka Binder.

  2. Redigera startklassfilen för att visa följande innehåll.

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

    Dricks

    I den här självstudien finns det inga autentiseringsåtgärder i konfigurationerna eller koden. Att ansluta till Azure-tjänster kräver dock autentisering. För att slutföra autentiseringen måste du använda Azure Identity. Spring Cloud Azure använder DefaultAzureCredential, som Azure Identity-biblioteket tillhandahåller för att hjälpa dig att få autentiseringsuppgifter utan några kodändringar.

    DefaultAzureCredential stöder flera autentiseringsmetoder och avgör vilken metod som ska användas vid körning. Med den här metoden kan din app använda olika autentiseringsmetoder i olika miljöer (till exempel lokala miljöer och produktionsmiljöer) utan att implementera miljöspecifik kod. Mer information finns i DefaultAzureCredential.

    För att slutföra autentiseringen i lokala utvecklingsmiljöer kan du använda Azure CLI, Visual Studio Code, PowerShell eller andra metoder. Mer information finns i Azure-autentisering i Java-utvecklingsmiljöer. För att slutföra autentiseringen i Azure-värdmiljöer rekommenderar vi att du använder användartilldelad hanterad identitet. Mer information finns i Vad är hanterade identiteter för Azure-resurser?

  3. Starta programmet. Meddelanden som i följande exempel publiceras i programloggen:

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

Distribuera till Azure Spring Apps

Nu när Spring Boot-programmet körs lokalt är det dags att flytta det till produktion. Azure Spring Apps gör det enkelt att distribuera Spring Boot-program till Azure utan några kodändringar. Tjänsten hanterar infrastrukturen för Spring-program så att utvecklare kan fokusera på sin kod. Azure Spring Apps tillhandahåller livscykelhantering med omfattande övervakning och diagnostik, konfigurationshantering, tjänstidentifiering, CI/CD-integrering, blågröna distributioner med mera. Information om hur du distribuerar ditt program till Azure Spring Apps finns i Distribuera ditt första program till Azure Spring Apps.

Nästa steg