Spring Boot クラウドイベントの集成

聞く:

クラウド イベントを Spring Boot と統合し、サンプルを作成して、イベント ソースとイベント ターゲットを実現します。

チャットGPT:

ここでは、イベント ソースとイベント ターゲットを実装する Spring Boot を使用した Cloud Events 統合の例を示します。

1. まず、Spring Cloud Stream と Cloud Events を使用するには、次の Maven 依存関係を追加する必要があります。

<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-kafka</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-stream-binder-kafka</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-stream</artifactId>
  </dependency>
  <dependency>
    <groupId>io.cloudevents</groupId>
    <artifactId>cloudevents-spring</artifactId>
    <version>2.0.2</version>
  </dependency>
</dependencies>

2. 次に、SourceKafka トピックにイベントを送信するために、 というイベント ソースを作成します。

import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
import io.cloudevents.spring.messaging.CloudEventMessageUtils;
import io.cloudevents.CloudEvent;
import io.cloudevents.core.builder.CloudEventBuilder;
import io.cloudevents.core.provider.EventFormatProvider;

@Component
@EnableBinding(Source.class)
public class MyEventSource {
    
    
  private final Source source;

  public MyEventSource(Source source) {
    
    
    this.source = source;
  }

  public void sendEvent(MyEventData data) {
    
    
    // 创建CloudEvent
    CloudEvent cloudEvent = CloudEventBuilder.v1()
        .withId(UUID.randomUUID().toString())
        .withType("my.event.type")
        .withSource("/my/event/source")
        .withData(data)
        .build();

    // 将CloudEvent转换为Spring消息
    org.springframework.messaging.Message<CloudEvent> message = MessageBuilder.withPayload(cloudEvent)
        .setHeader(CloudEventMessageUtils.ATTRIBUTES_CONTENT_TYPE, EventFormatProvider.getInstance().resolveFormatForEvent(cloudEvent).getMediaType())
        .build();

    // 发送Spring消息到Kafka主题
    source.output().send(message);
  }
}

3.MyEventDataイベント データを表すために呼び出される POJO クラスを作成します。

public class MyEventData {
    
    
  private String message;

  public String getMessage() {
    
    
    return message;
  }

  public void setMessage(String message) {
    
    
    this.message = message;
  }
}

4. MyEventHandlerKafka トピックをリッスンし、受信したイベントを処理する というイベント ターゲットを作成します。

import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.stereotype.Component;
import io.cloudevents.CloudEvent;
import io.cloudevents.core.data.PojoCloudEventData;
import io.cloudevents.jackson.JsonCloudEventData;
import io.cloudevents.spring.messaging.CloudEventMessageUtils;

@Component
@EnableBinding(Sink.class)
public class MyEventHandler {
    
    
  @StreamListener(Sink.INPUT)
  public void handleEvent(CloudEvent cloudEvent) {
    
    
    // 从CloudEvent中获取事件数据
    MyEventData eventData = cloudEvent.getData() instanceof PojoCloudEventData ?
        ((PojoCloudEventData<MyEventData>) cloudEvent.getData()).get() :
        new JsonCloudEventData<>(cloudEvent.getData().toBytes(), MyEventData.class).get();

    // 处理事件
    System.out.println("Received event with message: " + eventData.getMessage());

    // 手动确认接收到事件
    CloudEventMessageUtils.confirm(cloudEvent);
  }
}

上記のコードは、@StreamListenerアノテーションを使用して Kafka トピック内のイベントをリッスンし、CloudEvent からイベント データを取得し (ここではPojoCloudEventDataJsonCloudEventData2 つのメソッドを使用します)、イベントを処理して、イベントの受信を手動で確認します。

5. 最後に、Spring Boot アプリケーションの構成ファイルで Kafka トピックとイベント シリアライザーを構成します。

spring:
  cloud:
    stream:
      bindings:
        output:
          destination: my-topic
          content-type: application/cloudevents+json
        input:
          destination: my-topic
          content-type: application/cloudevents+json
      kafka:
        binder:
          brokers: localhost:9092
      default:
        producer:
          useNativeEncoding: true
          headerMode: embeddedHeaders
          valueSerde: io.cloudevents.jackson.JsonCloudEventDataSerde

上記構成では、 、outputinputそれぞれイベントソース、イベントターゲットのKafkaトピックに対応します。content-typeに設定しますapplication/cloudevents+json。これは、イベントのシリアル化に Cloud Events 仕様の JSON 形式を使用することを意味します。valueSerdeイベント データを JSON 形式にシリアル化するには、に設定しますJsonCloudEventDataSerdeCloud Events のネイティブ エンコーディングと埋め込みヘッダー モードを有効にするための設定useNativeEncodingheaderMode

Spring Boot を使用した Cloud Events 統合の例を作成しました。これは、Kafka トピックとの間でイベントを送受信できるイベント ソースとイベント宛先を実装します。ニーズに応じてコードと構成を変更できます。

おすすめ

転載: blog.csdn.net/bfhelin/article/details/130868456