利用Avro实现Kakfa序列化和反序列化

本文介绍了如何利用Avro的scheme定义,并通过maven插件生成Java类,实现Kafka消息的序列化和反序列化。内容包括Avro schema的JSON格式,生成Java文件的方法,以及在Kafka Producer和Consumer中的配置应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1 在pom.xml中添加依赖,

    1.1 在dependencies中配置:

<dependency>
      <groupId>org.apache.avro</groupId>
      <artifactId>avro</artifactId>
      <version>1.8.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.avro</groupId>
      <artifactId>avro-tools</artifactId>
      <version>1.8.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.avro</groupId>
      <artifactId>avro-maven-plugin</artifactId>
      <version>1.8.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.avro</groupId>
      <artifactId>avro-compiler</artifactId>
      <version>1.8.2</version>
    </dependency>

    1.2 在<build>中配置,注意不要加<pluginManagement></pluginManagement>:

<build>
      <plugins>
        <plugin>
          <groupId>org.apache.avro</groupId>
          <artifactId>avro-maven-plugin</artifactId>
          <version>1.8.2</version>
          <executions>
            <execution>
              <phase>generate-sources</phase>
              <goals>
                <goal>schema</goal>
              </goals>
              <configuration>
                <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
                <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
              </configuration>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>
      </plugins>
  </build>

 

2 定义avro的scheme

<
### Kafka Avro 反序列化原理 在Kafka生态系统中,Avro反序列化过程主要依赖于`KafkaAvroDeserializer`类以及Schema Registry服务。当消费者接收到一条消息时,该消息体通常是以字节数组的形式存在。为了能够读取并理解这条消息的内容,就需要通过反序列化操作将其转换成应用程序可处理的对象形式。 具体来说,在消费端设置`key.deserializer``value.deserializer`参数分别为`io.confluent.kafka.serializers.KafkaAvroDeserializer`,这会告知Kafka Consumer如何解析来自主题的消息键值对[^1]。一旦指定了这些属性之后,每当有新消息到达指定的主题分区时,Kafka Consumer将会调用`KafkaAvroDeserializer`来进行解码工作。 #### Schema Registry的作用 由于Avro是一种强类型的二进制编码格式,因此它需要知道具体的schema才能完成正确的编解码逻辑。而Confluent提供的Schema Registry正好解决了这个问题——它可以存储不同版本的schema,并允许生产者消费者之间共享相同的模式定义。这样做的好处在于即使未来修改了数据结构也不会影响到现有系统的正常运行[^3]。 当执行反序列化动作时: - `KafkaAvroDeserializer`首先向Schema Registry发起请求查询当前使用的最新版schema ID; - 接着利用这个ID从Registry里取出对应的完整schema描述信息; - 最终基于所获得的schema对象把原始bytes流转化为Java POJO (Plain Old Java Object),从而实现了真正的“反序列化”。 ```java Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); // 设置为true表示使用Schema Registry自动管理Schemas props.put("specific.avro.reader", true); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "io.confluent.kafka.serializers.KafkaAvroDeserializer"); props.put("group.id", "test-group"); KafkaConsumer<String, GenericRecord> consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("my-topic")); while (true) { ConsumerRecords<String, GenericRecord> records = consumer.poll(Duration.ofMillis(100)); for (ConsumerRecord<String, GenericRecord> record : records){ System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value()); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值