Samouczek: tworzenie i używanie usługi Apache Kafka do programowania

Usługa Azure Container Apps umożliwia łączenie się z usługami deweloperskimi i produkcyjnymi w celu zapewnienia szerokiej gamy funkcji aplikacji.

Z tego samouczka dowiesz się, jak tworzyć i używać programowania usługi Apache Kafka.

Polecenia interfejsu wiersza polecenia platformy Azure i fragmenty szablonów Bicep są opisywane w tym samouczku. Jeśli używasz Bicep, możesz dodać wszystkie fragmenty do pojedynczego pliku Bicep i wdrożyć cały szablon jednocześnie.

  • Tworzenie środowiska usługi Container Apps w celu wdrożenia usługi i aplikacji kontenera
  • Tworzenie usługi Apache Kafka
  • Konfigurowanie aplikacji wiersza polecenia do korzystania z usługi dev Apache Kafka
  • Wdrażanie aplikacji kafka-ui w celu wyświetlania danych aplikacji
  • Kompilowanie końcowego szablonu bicep w celu wdrożenia wszystkich zasobów przy użyciu spójnego i przewidywalnego wdrożenia szablonu
  • azd Używanie szablonu dla jednego polecenia wdrożenia wszystkich zasobów

Wymagania wstępne

Uwaga

W przypadku wdrożenia jednego polecenia przejdź do ostatniego azdkroku szablonu.

Ustawienia

  1. Zdefiniuj zmienne dla typowych wartości.

    RESOURCE_GROUP="kafka-dev"
    LOCATION="northcentralus"
    ENVIRONMENT="aca-env"
    KAFKA_SVC="kafka01"
    KAFKA_CLI_APP="kafka-cli-app"
    KAFKA_UI_APP="kafka-ui-app"
    
  2. Loguje się do platformy Azure.

    az login
    
  3. Uaktualnij interfejs wiersza polecenia do najnowszej wersji.

    az upgrade
    
  4. Uaktualnij Bicep do najnowszej wersji.

    az bicep upgrade
    
  5. Dodaj rozszerzenie.containerapp

    az extension add --name containerapp --upgrade
    
  6. Zarejestruj wymagane przestrzenie nazw.

    az provider register --namespace Microsoft.App
    
    az provider register --namespace Microsoft.OperationalInsights
    

Tworzenie środowiska usługi Container Apps

  1. Utwórz grupę zasobów.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. Tworzenie środowiska usługi Container Apps.

    az containerapp env create \
      --name "$ENVIRONMENT" \
      --resource-group "$RESOURCE_GROUP" \
      --location "$LOCATION"
    

Tworzenie usługi Apache Kafka

  1. Tworzenie usługi Platformy Apache Kafka.

    ENVIRONMENT_ID=$(az containerapp env show \
      --name "$ENVIRONMENT" \
      --resource-group "$RESOURCE_GROUP" \
      --output tsv \
      --query id)
    
  2. Wdrażanie szablonu.

        az containerapp add-on kafka create \
        --name "$KAFKA_SVC" \
        --resource-group "$RESOURCE_GROUP" \
        --environment "$ENVIRONMENT"
    
  3. Wyświetlanie danych wyjściowych dziennika z wystąpienia platformy Kafka

    Użyj polecenia , logs aby wyświetlić komunikaty dziennika.

    az containerapp logs show \
        --name $KAFKA_SVC \
        --resource-group $RESOURCE_GROUP \
        --follow --tail 30
    

    Zrzut ekranu przedstawiający dzienniki usługi kafka aplikacji kontenera.

Tworzenie aplikacji do testowania usługi

Podczas tworzenia aplikacji skonfigurujesz ją tak, aby korzystała z ./kafka-topics.shprogramu , ./kafka-console-producer.shi kafka-console-consumer.sh w celu nawiązania połączenia z wystąpieniem platformy Kafka.

  1. Utwórz aplikację powiązaną kafka-cli-app z usługą Kafka.

    az containerapp create \
        --name "$KAFKA_CLI_APP" \
        --image mcr.microsoft.com/k8se/services/kafka:3.4 \
        --bind "$KAFKA_SVC" \
        --environment "$ENVIRONMENT" \
        --resource-group "$RESOURCE_GROUP" \
        --min-replicas 1 \
        --max-replicas 1 \
        --command "/bin/sleep" "infinity"
    
  2. Uruchom polecenie interfejsu wiersza polecenia exec , aby nawiązać połączenie z aplikacją testowej.

    az containerapp exec \
        --name $KAFKA_CLI_APP \
        --resource-group $RESOURCE_GROUP \
        --command /bin/bash
    

    W przypadku korzystania z --bind aplikacji testowej lub serviceBinds w aplikacji testowej informacje o połączeniu są wstrzykiwane do środowiska aplikacji. Po nawiązaniu połączenia z kontenerem testowym możesz sprawdzić wartości przy użyciu env polecenia .

    env | grep "^KAFKA_"
    
    KAFKA_SECURITYPROTOCOL=SASL_PLAINTEXT
    KAFKA_BOOTSTRAPSERVER=kafka01:9092
    KAFKA_HOME=/opt/kafka
    KAFKA_PROPERTIES_SASL_JAAS_CONFIG=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka-user" password="7dw..." user_kafka-user="7dw..." ;
    KAFKA_BOOTSTRAP_SERVERS=kafka01:9092
    KAFKA_SASLUSERNAME=kafka-user
    KAFKA_SASL_USER=kafka-user
    KAFKA_VERSION=3.4.0
    KAFKA_SECURITY_PROTOCOL=SASL_PLAINTEXT
    KAFKA_SASL_PASSWORD=7dw...
    KAFKA_SASLPASSWORD=7dw...
    KAFKA_SASL_MECHANISM=PLAIN
    KAFKA_SASLMECHANISM=PLAIN
    
  3. Użyj kafka-topics.sh polecenia , aby utworzyć temat zdarzenia.

    Utwórz plik kafka.props.

    echo "security.protocol=$KAFKA_SECURITY_PROTOCOL" >> kafka.props && \
    echo "sasl.mechanism=$KAFKA_SASL_MECHANISM" >> kafka.props && \
    echo "sasl.jaas.config=$KAFKA_PROPERTIES_SASL_JAAS_CONFIG" >> kafka.props
    

    quickstart-events Utwórz temat zdarzenia.

    /opt/kafka/bin/kafka-topics.sh \
        --create --topic quickstart-events \
        --bootstrap-server $KAFKA_BOOTSTRAP_SERVERS \
        --command-config kafka.props
    # Created topic quickstart-events.
    
    /opt/kafka/bin/kafka-topics.sh \
        --describe --topic quickstart-events \
        --bootstrap-server $KAFKA_BOOTSTRAP_SERVERS \
        --command-config kafka.props
    # Topic: quickstart-events	TopicId: lCkTKmvZSgSUCHozhhvz1Q	PartitionCount: 1	ReplicationFactor: 1	Configs: segment.bytes=1073741824
    # Topic: quickstart-events	Partition: 0	Leader: 1	Replicas: 1	Isr: 1
    
  4. Służy kafka-console-producer.sh do zapisywania zdarzeń w temacie.

    /opt/kafka/bin/kafka-console-producer.sh \
        --topic quickstart-events \
        --bootstrap-server $KAFKA_BOOTSTRAP_SERVERS \
        --producer.config kafka.props
    
    > this is my first event
    > this is my second event
    > this is my third event
    > CTRL-C
    

    Uwaga

    Polecenie ./kafka-console-producer.sh wyświetla monit o zapisanie zdarzeń za pomocą polecenia >. Napisz kilka zdarzeń, jak pokazano, a następnie naciśnij polecenie CTRL-C , aby zakończyć.

  5. Służy kafka-console-consumer.sh do odczytywania zdarzeń z tematu.

    /opt/kafka/bin/kafka-console-consumer.sh \
         --topic quickstart-events \
        --bootstrap-server $KAFKA_BOOTSTRAP_SERVERS \
        --from-beginning \
        --consumer.config kafka.props
    
    # this is my first event
    # this is my second event
    # this is my third event
    

Zrzut ekranu przedstawiający dzienniki wyjściowe interfejsu wiersza polecenia platformy Kafka aplikacji kontenera.

Używanie usługi dewelopera z istniejącą aplikacją

Jeśli masz już aplikację korzystającą z platformy Apache Kafka, możesz zmienić sposób ładowania informacji o połączeniu.

Najpierw utwórz następujące zmienne środowiskowe.

KAFKA_HOME=/opt/kafka
KAFKA_PROPERTIES_SASL_JAAS_CONFIG=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka-user" password="7dw..." user_kafka-user="7dw..." ;
KAFKA_BOOTSTRAP_SERVERS=kafka01:9092
KAFKA_SASL_USER=kafka-user
KAFKA_VERSION=3.4.0
KAFKA_SECURITY_PROTOCOL=SASL_PLAINTEXT
KAFKA_SASL_PASSWORD=7dw...
KAFKA_SASL_MECHANISM=PLAIN

Za pomocą interfejsu wiersza polecenia (lub Bicep) możesz zaktualizować aplikację, aby dodać --bind $KAFKA_SVC aplikację do korzystania z usługi dewelopera.

Wiązanie z usługą dewelopera

Wdróż kafka-ui , aby wyświetlić wystąpienie platformy Kafka i zarządzać nim.

Zobacz Bicep lub azd przykład.

Zrzut ekranu przedstawiający aplikację kontenera pgweb łączącą się z usługą Kafka.

Wdrażanie wszystkich zasobów

Skorzystaj z poniższych przykładów, aby wdrożyć wszystkie zasoby jednocześnie.

Bicep

Poniższy szablon Bicep zawiera wszystkie zasoby w tym samouczku.

Możesz utworzyć kafka-dev.bicep plik z tą zawartością.

targetScope = 'resourceGroup'
param location string = resourceGroup().location
param appEnvironmentName string = 'aca-env'
param kafkaSvcName string = 'kafka01'
param kafkaCliAppName string = 'kafka-cli-app'
param kafkaUiAppName string = 'kafka-ui'

resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
  name: '${appEnvironmentName}-log-analytics'
  location: location
  properties: {
    sku: {
      name: 'PerGB2018'
    }
  }
}

resource appEnvironment 'Microsoft.App/managedEnvironments@2023-04-01-preview' = {
  name: appEnvironmentName
  location: location
  properties: {
    appLogsConfiguration: {
      destination: 'log-analytics'
      logAnalyticsConfiguration: {
        customerId: logAnalytics.properties.customerId
        sharedKey: logAnalytics.listKeys().primarySharedKey
      }
    }
  }
}

resource kafka 'Microsoft.App/containerApps@2023-04-01-preview' = {
  name: kafkaSvcName
  location: location
  properties: {
    environmentId: appEnvironment.id
    configuration: {
      service: {
          type: 'kafka'
      }
    }
  }
}

resource kafkaCli 'Microsoft.App/containerApps@2023-04-01-preview' = {
  name: kafkaCliAppName
  location: location
  properties: {
    environmentId: appEnvironment.id
    template: {
      serviceBinds: [
        {
          serviceId: kafka.id
        }
      ]
      containers: [
        {
          name: 'kafka-cli'
          image: 'mcr.microsoft.com/k8se/services/kafka:3.4'
          command: [ '/bin/sleep', 'infinity' ]
        }
      ]
      scale: {
        minReplicas: 1
        maxReplicas: 1
      }
    }
  }
}

resource kafkaUi 'Microsoft.App/containerApps@2023-04-01-preview' = {
  name: kafkaUiAppName
  location: location
  properties: {
    environmentId: appEnvironment.id
    configuration: {
      ingress: {
        external: true
        targetPort: 8080
      }
    }
    template: {
      serviceBinds: [
        {
          serviceId: kafka.id
          name: 'kafka'
        }
      ]
      containers: [
        {
          name: 'kafka-ui'
          image: 'docker.io/provectuslabs/kafka-ui:latest'
          command: [
            '/bin/sh'
          ]
          args: [
            '-c'
            '''export KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS="$KAFKA_BOOTSTRAP_SERVERS" && \
            export KAFKA_CLUSTERS_0_PROPERTIES_SASL_JAAS_CONFIG="$KAFKA_PROPERTIES_SASL_JAAS_CONFIG" && \
            export KAFKA_CLUSTERS_0_PROPERTIES_SASL_MECHANISM="$KAFKA_SASL_MECHANISM" && \
            export KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL="$KAFKA_SECURITY_PROTOCOL" && \
            java $JAVA_OPTS -jar kafka-ui-api.jar'''
          ]
          resources: {
            cpu: json('1.0')
            memory: '2.0Gi'
          }
        }
      ]
    }
  }
}

output kafkaUiUrl string = 'https://${kafkaUi.properties.configuration.ingress.fqdn}'

output kafkaCliExec string = 'az containerapp exec -n ${kafkaCli.name} -g ${resourceGroup().name} --command /bin/bash'

output kafkaLogs string = 'az containerapp logs show -n ${kafka.name} -g ${resourceGroup().name} --follow --tail 30'

Użyj interfejsu wiersza polecenia platformy Azure, aby wdrożyć go w szablonie.

RESOURCE_GROUP="kafka-dev"
LOCATION="northcentralus"

az group create \
    --name "$RESOURCE_GROUP" \
    --location "$LOCATION"

az deployment group create -g $RESOURCE_GROUP \
    --query 'properties.outputs.*.value' \
    --template-file kafka-dev.bicep

Azure Developer CLI

Ostateczny szablon jest dostępny w witrynie GitHub.

Użyj polecenia azd up , aby wdrożyć szablon.

git clone https://github.com/Azure-Samples/aca-dev-service-kafka-azd
cd aca-dev-service-kafka-azd
azd up

Czyszczenie zasobów

Po zakończeniu uruchom następujące polecenie, aby usunąć grupę zasobów zawierającą zasoby usługi Container Apps.

Uwaga

Następujące polecenie usuwa określoną grupę zasobów i wszystkie zawarte w niej zasoby. Jeśli zasoby spoza zakresu tego samouczka istnieją w określonej grupie zasobów, zostaną również usunięte.

az group delete \
    --resource-group $RESOURCE_GROUP