Azure Event Hubs で Apache Kafka 用 Spring Boot Starter を使用する方法How to use the Spring Boot Starter for Apache Kafka with Azure Event Hubs

概要Overview

この記事では、Spring Boot Initializr を使用して作成された Java ベースの Spring Cloud Stream Binder を、Apache Kafka と Azure Event Hubs を使用するように構成する方法について説明します。This article demonstrates how to configure a Java-based Spring Cloud Stream Binder created with the Spring Boot Initializer to use Apache Kafka with Azure Event Hubs.

前提条件Prerequisites

この記事の手順に従うには、次の前提条件が必要です。The following prerequisites are required in order to follow the steps in this article:

重要

この記事の手順を完了するには、Spring Boot 2.0 以上のバージョンが必要です。Spring Boot version 2.0 or greater is required to complete the steps in this article.

Azure portal を使用して Azure イベント ハブを作成するCreate an Azure Event Hub using the Azure portal

Azure イベント ハブの名前空間を作成するCreate an Azure Event Hub Namespace

  1. Azure portal (https://portal.azure.com/) を参照し、サインインします。Browse to the Azure portal at https://portal.azure.com/ and sign in.

  2. [+ リソースの作成] をクリックし、 [モノのインターネット][Event Hubs] の順にクリックします。Click +Create a resource, then Internet of Things, and then click Event Hubs.

    Azure イベント ハブの名前空間を作成する

  3. [名前空間の作成] ページで、次の情報を入力します。On the Create Namespace page, enter the following information:

    • 一意の名前を入力します。この名前は、イベント ハブの名前空間の URI の一部になります。Enter a unique Name, which will become part of the URI for your event hub namespace. たとえば、 [名前] に「wingtiptoys」と入力した場合、URI は wingtiptoys.servicebus.windows.net になります。For example: if you entered wingtiptoys for the Name, the URI would be wingtiptoys.servicebus.windows.net.
    • イベント ハブの名前空間の価格レベルを選択します。Choose a Pricing tier for your event hub namespace.
    • 名前空間に対して [Kafka を有効にする] を指定します。Specify Enable Kafka for your namespace.
    • 名前空間に使用するサブスクリプションを選択します。Choose the Subscription you want to use for your namespace.
    • 名前空間の新しいリソース グループを作成するか、既存のリソース グループを選択するかを指定します。Specify whether to create a new Resource group for your namespace, or choose an existing resource group.
    • イベント ハブの名前空間の場所を指定します。Specify the Location for your event hub namespace.

    Azure イベント ハブの名前空間のオプションを指定する

  4. 上記のオプションを指定したら、 [作成] をクリックして名前空間を作成します。When you have specified the options listed above, click Create to create your namespace.

名前空間に Azure イベント ハブを作成するCreate an Azure Event Hub in your namespace

  1. Azure portal (https://portal.azure.com/) を参照します。Browse to the Azure portal at https://portal.azure.com/.

  2. [すべてのリソース] をクリックし、作成した名前空間をクリックします。Click All resources, and then click the namespace that you created.

    Azure イベント ハブの名前空間を選択する

  3. [Event Hubs] をクリックし、 [+ イベント ハブ] をクリックします。Click Event Hubs, and then click +Event Hub.

    新しい Azure イベント ハブを追加する

  4. [イベント ハブの作成] ページで、イベント ハブの一意の名前を入力し、 [作成] をクリックします。On the Create Event Hub page, enter a unique Name for your Event Hub, and then click Create.

    Azure Event Hub の作成

  5. イベント ハブが作成されると、 [Event Hubs] ページに表示されます。When your Event Hub has been created, it will be listed on the Event Hubs page.

    Azure Event Hub の作成

Spring Initializr でシンプルな Spring Boot アプリケーションを作成するCreate a simple Spring Boot application with the Spring Initializr

  1. https://start.spring.io/ を参照します。Browse to https://start.spring.io/.

  2. 次のオプションを指定します。Specify the following options:

    • JavaMaven プロジェクトを生成します。Generate a Maven project with Java.

    • Spring Boot のバージョンとして、2.0 以上を指定します。Specify a Spring Boot version that is equal to or greater than 2.0.

    • アプリケーションのグループ (Group)成果物 (Artifact) の名前を指定します。Specify the Group and Artifact names for your application.

    • Web 依存関係を追加します。Add the Web dependency.

      基本的な Spring Initializr オプション

    注意

    Spring Initializr では、グループ (Group)成果物 (Artifact) の名前を使用してパッケージ名を作成します (例: com.wingtiptoys.kafka)。The Spring Initializr uses the Group and Artifact names to create the package name; for example: com.wingtiptoys.kafka.

  3. 上記のオプションを指定したら、 [Generate Project](プロジェクトの生成) をクリックします。When you have specified the options listed above, click Generate Project.

  4. メッセージが表示されたら、ローカル コンピューター上のパスにプロジェクトをダウンロードします。When prompted, download the project to a path on your local computer.

    Spring プロジェクトをダウンロードする

  5. ファイルをローカル システム上に展開したら、シンプルな Spring Boot アプリケーションの編集を開始できます。After you have extracted the files on your local system, your simple Spring Boot application will be ready for editing.

Spring Cloud の Kafka Stream スターターと Azure Event Hub スターターを使用するように Spring Boot アプリを構成するConfigure your Spring Boot app to use the Spring Cloud Kafka Stream and Azure Event Hub starters

  1. アプリのルート ディレクトリで pom.xml ファイルを探します。次に例を示します。Locate the pom.xml file in the root directory of your app; for example:

    C:\SpringBoot\kafka\pom.xml

    または-or-

    /users/example/home/kafka/pom.xml

  2. テキスト エディターで pom.xml ファイルを開き、Spring Cloud の Kafka Stream スターターと Azure Event Hub スターターを <dependencies> のリストに追加します。Open the pom.xml file in a text editor, and add the Spring Cloud Kafka Stream and Azure Event Hub starters to the list of <dependencies>:

    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-stream-kafka</artifactId>
       <version>2.0.1.RELEASE</version>
    </dependency>
    <dependency>
       <groupId>com.microsoft.azure</groupId>
       <artifactId>spring-cloud-azure-starter-eventhub</artifactId>
       <version>1.0.0.M2</version>
    </dependency>
    

    pom.xml ファイルを編集する

  3. pom.xml ファイルを保存して閉じます。Save and close the pom.xml file.

Azure 資格情報ファイルを作成するCreate an Azure Credential File

  1. コマンド プロンプトを開きます。Open a command prompt.

  2. Spring Boot アプリの resources ディレクトリに移動します。次に例を示します。Navigate to the resources directory of your Spring Boot app; for example:

    cd C:\SpringBoot\eventhub\src\main\resources
    

    または-or-

    cd /users/example/home/eventhub/src/main/resources
    
  3. Azure アカウントにサインインします。Sign in to your Azure account:

    az login
    
  4. サブスクリプションを一覧表示します。List your subscriptions:

    az account list
    

    Azure からサブスクリプションの一覧が返されます。使用するサブスクリプションの GUID をコピーする必要があります。次に例を示します。Azure will return a list of your subscriptions, and you will need to copy the GUID for the subscription that you want to use; for example:

    [
      {
        "cloudName": "AzureCloud",
        "id": "11111111-1111-1111-1111-111111111111",
        "isDefault": true,
        "name": "Converted Windows Azure MSDN - Visual Studio Ultimate",
        "state": "Enabled",
        "tenantId": "22222222-2222-2222-2222-222222222222",
        "user": {
          "name": "gena.soto@wingtiptoys.com",
          "type": "user"
        }
      }
    ]
    
  5. Azure で使用するサブスクリプションの GUID を指定します。次に例を示します。Specify the GUID for the subscription you want to use with Azure; for example:

    az account set -s 11111111-1111-1111-1111-111111111111
    
  6. Azure 資格情報ファイルを作成します。Create your Azure Credential file:

    az ad sp create-for-rbac --sdk-auth > my.azureauth
    

    このコマンドにより、resources ディレクトリに、次の例のような内容の my.azureauth ファイルが作成されます。This command will create a my.azureauth file in your resources directory with contents that resemble the following example:

    {
      "clientId": "33333333-3333-3333-3333-333333333333",
      "clientSecret": "44444444-4444-4444-4444-444444444444",
      "subscriptionId": "11111111-1111-1111-1111-111111111111",
      "tenantId": "22222222-2222-2222-2222-222222222222",
      "activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
      "resourceManagerEndpointUrl": "https://management.azure.com/",
      "activeDirectoryGraphResourceId": "https://graph.windows.net/",
      "sqlManagementEndpointUrl": "https://management.core.windows.net:8443/",
      "galleryEndpointUrl": "https://gallery.azure.com/",
      "managementEndpointUrl": "https://management.core.windows.net/"
    }
    

Azure イベント ハブを使用するように Spring Boot アプリを構成するConfigure your Spring Boot app to use your Azure Event Hub

  1. アプリの resources ディレクトリで application.properties を探します。次に例を示します。Locate the application.properties in the resources directory of your app; for example:

    C:\SpringBoot\eventhub\src\main\resources\application.properties

    または-or-

    /users/example/home/eventhub/src/main/resources/application.properties

  2. テキスト エディターで application.properties ファイルを開きます。次の行を追加し、サンプルの値をイベント ハブの適切なプロパティに置き換えます。Open the application.properties file in a text editor, add the following lines, and then replace the sample values with the appropriate properties for your event hub:

    spring.cloud.azure.credential-file-path=my.azureauth
    spring.cloud.azure.resource-group=wingtiptoysresources
    spring.cloud.azure.region=West US
    spring.cloud.azure.eventhub.namespace=wingtiptoysnamespace
    
    spring.cloud.stream.bindings.input.destination=wingtiptoyshub
    spring.cloud.stream.bindings.input.group=$Default
    spring.cloud.stream.bindings.output.destination=wingtiptoyshub
    

    各値の説明:Where:

    フィールドField 説明Description
    spring.cloud.azure.credential-file-path このチュートリアルで作成した Azure 資格情報ファイルを指定します。Specifies Azure credential file that you created earlier in this tutorial.
    spring.cloud.azure.resource-group Azure イベント ハブを含む Azure リソース グループを指定します。Specifies the Azure Resource Group that contains your Azure Event Hub.
    spring.cloud.azure.region Azure イベント ハブの作成時に指定した地理的リージョンを指定します。Specifies the geographical region that you specified when you created your Azure Event Hub.
    spring.cloud.azure.eventhub.namespace Azure イベント ハブの名前空間の作成時に指定した一意の名前を指定します。Specifies the unique name that you specified when you created your Azure Event Hub Namespace.
    spring.cloud.stream.bindings.input.destination 入力先の Azure イベント ハブを指定します。ここでは、このチュートリアルで作成したハブを指定します。Specifies the input destination Azure Event Hub, which for this tutorial is the hub you created earlier in this tutorial.
    spring.cloud.stream.bindings.input.group Azure イベント ハブのコンシューマー グループを指定します。Azure イベント ハブの作成時に作成された基本コンシューマー グループを使用するには、"$ Default" に設定します。Specifies a Consumer Group from Azure Event Hub, which can be set to '$Default' in order to use the basic consumer group that was created when you created your Azure Event Hub.
    spring.cloud.stream.bindings.output.destination 出力先の Azure イベント ハブを指定します。ここでは、入力先と同じものになります。Specifies the output destination Azure Event Hub, which for this tutorial will be the same as the input destination.
  3. application.properties ファイルを保存して閉じます。Save and close the application.properties file.

イベント ハブの基本的な機能を実装するサンプル コードを追加するAdd sample code to implement basic event hub functionality

このセクションでは、イベント ハブにイベントを送信するために必要な Java クラスを作成します。In this section, you create the necessary Java classes for sending events to your event hub.

アプリケーションのメイン クラスを変更するModify the main application class

  1. アプリのパッケージ ディレクトリでメイン アプリケーションの Java ファイルを探します。次に例を示します。Locate the main application Java file in the package directory of your app; for example:

    C:\SpringBoot\kafka\src\main\java\com\wingtiptoys\kafka\KafkaApplication.java

    または-or-

    /users/example/home/kafka/src/main/java/com/wingtiptoys/kafka/KafkaApplication.java

  2. テキスト エディターでメイン アプリケーションの Java ファイルを開き、ファイルに次の行を追加します。Open the main application Java file in a text editor, and add the following lines to the file:

    package com.wingtiptoys.kafka;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class KafkaApplication {
       public static void main(String[] args) {
          SpringApplication.run(KafkaApplication.class, args);
       }
    }
    
  3. メイン アプリケーションの Java ファイルを保存して閉じます。Save and close the main application Java file.

ソース コネクタの新しいクラスを作成するCreate a new class for the source connector

  1. アプリのパッケージ ディレクトリに KafkaSource.java という名前の新しい Java ファイルを作成し、テキスト エディターでファイルを開いて、次の行を追加します。Create a new Java file named KafkaSource.java in the package directory of your app, then open the file in a text editor and add the following lines:

    package com.wingtiptoys.kafka;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.stream.annotation.EnableBinding;
    import org.springframework.cloud.stream.messaging.Source;
    import org.springframework.messaging.support.GenericMessage;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @EnableBinding(Source.class)
    @RestController
    public class KafkaSource {
       @Autowired
       private Source source;
    
       @PostMapping("/messages")
       public String sendMessage(@RequestBody String message) {
          this.source.output().send(new GenericMessage<>(message));
          return message;
       }
    }
    
  2. KafkaSource.java ファイルを保存して閉じます。Save and close the KafkaSource.java file.

シンク コネクタの新しいクラスを作成するCreate a new class for the sink connector

  1. アプリのパッケージ ディレクトリに KafkaSink.java という名前の新しい Java ファイルを作成し、テキスト エディターでファイルを開いて、次の行を追加します。Create a new Java file named KafkaSink.java in the package directory of your app, then open the file in a text editor and add the following lines:

    package com.wingtiptoys.kafka;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.cloud.stream.annotation.EnableBinding;
    import org.springframework.cloud.stream.annotation.StreamListener;
    import org.springframework.cloud.stream.messaging.Sink;
    
    @EnableBinding(Sink.class)
    public class KafkaSink {
       private static final Logger LOGGER = LoggerFactory.getLogger(KafkaSink.class);
    
       @StreamListener(Sink.INPUT)
       public void handleMessage(String message) {
          LOGGER.info("New message received: " + message);
       }
    }
    
  2. KafkaSink.java ファイルを保存して閉じます。Save and close the KafkaSink.java file.

アプリケーションをビルドしてテストするBuild and test your application

  1. コマンド プロンプトを開き、ディレクトリを pom.xml ファイルが置かれているフォルダーに変更します。次に例を示します。Open a command prompt and change directory to the folder where your pom.xml file is located; for example:

    cd C:\SpringBoot\kafka

    または-or-

    cd /users/example/home/kafka

  2. Spring Boot アプリケーションを Maven でビルドし、実行します。次に例を示します。Build your Spring Boot application with Maven and run it; for example:

    mvn clean package
    mvn spring-boot:run
    
  3. アプリケーションが実行されたら、curl を使用してアプリケーションをテストできます。次に例を示します。Once your application is running, you can use curl to test your application; for example:

    curl -X POST -H "Content-Type: text/plain" -d "hello" http://localhost:8080/messages
    

    アプリケーションのログに送信された "hello" が表示されます。You should see "hello" posted to your application's logs. 例:For example:

    [http-nio-8080-exec-2] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka version : 1.0.2
    [http-nio-8080-exec-2] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka commitId : 2a121f7b1d402825
    [wingtiptoyshub.container-0-C-1] INFO com.wingtiptoys.kafka.KafkaSink - New message received: hello
    

注意

テストのために、KafkaSource.java を変更して、次の例のような簡単な HTML フォームを含めることができます。For testing purposes, you could modify your KafkaSource.java so that it contains a simple HTML form like the following example:

package com.wingtiptoys.kafka;
   
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@EnableBinding(Source.class)
@RestController
public class KafkaSource {
  @Autowired
  private Source source;

  @GetMapping("/")
  public String sendForm() {
    return "<html><body>" +
      "<form action=\"/messages\" method=\"post\">" +
      "<input type=\"text\" name=\"text\">" +
      "<input type=\"submit\">" +
      "</form></body><html>";
    }

  @PostMapping("/messages")
  public String sendMessage(@RequestBody String message) {
    this.source.output().send(new GenericMessage<>(message));
    return message;
  }
}

これにより、Web ブラウザーを使用してアプリケーションをテストできます。This will allow you to use a web browser to test your application:

Web ブラウザーを使用したアプリケーションのテスト

フォームを送信すると、アプリケーションの結果が表示されます。When you submit the form, your application will display the results:

Web ブラウザーでのアプリケーションの応答

次の手順Next steps

Spring および Azure の詳細については、Azure ドキュメント センターで引き続き Spring に関するドキュメントをご確認ください。To learn more about Spring and Azure, continue to the Spring on Azure documentation center.

その他のリソースAdditional Resources

Azure による Event Hub Stream Binder と Apache Kafka のサポートの詳細については、次の記事をご覧ください。For more information about Azure support for Event Hub Stream Binder and Apache Kafka, see the following articles:

Java での Azure の使用の詳細については、「Java 開発者向けの Azure」および「Azure DevOps と Java の操作」を参照してください。For more information about using Azure with Java, see the [Azure for Java Developers] and the Working with Azure DevOps and Java.

Spring Framework は Java 開発者のエンタープライズ レベルのアプリケーション作成を支援するオープンソース ソリューションです。The Spring Framework is an open-source solution that helps Java developers create enterprise-level applications. このプラットフォームで構築される特に知られたプロジェクトの 1 つが Spring Boot です。これによって、スタンドアロンの Java アプリケーションの作成方法が簡略化されます。One of the more-popular projects that is built on top of that platform is Spring Boot, which provides a simplified approach for creating stand-alone Java applications. Spring Boot を使い始めた開発者を支援するために、https://github.com/spring-guides/ では、サンプルの Spring Boot パッケージがいくつか用意されています。To help developers get started with Spring Boot, several sample Spring Boot packages are available at https://github.com/spring-guides/. 基本的な Spring Boot プロジェクトの一覧から選択するだけでなく、 Spring Initializr は、開発者がカスタム Spring Boot アプリケーションの作成を開始できるように支援します。In addition to choosing from the list of basic Spring Boot projects, the Spring Initializr helps developers get started with creating custom Spring Boot applications.