kafka消息的序列化与反序列化

一、前言

在使用kafka发送消息时,producer端需要序列化,在大多数场景中, 需要传输的是与业务规则相关的复杂类型, 这就需要自定义数据结构。 Avro是一种序列化框架, 使用JSON来定义schema, sh cema由原始类型(null, boolean, int, long, float, double, bytes, string) 和复杂类型 (record, enum, array, map, union, fixed) 组成, schema文件以.avsc结尾, 表示avro schema

有2种序列化方式

  • 二进制方式:也就是Specific方式, 定义好schema a svc文件后, 使用编译器(avro-tools.jar) 编译生成相关语言(java) 的业务类, 类中会嵌入JSON schema ·
  • JSON方式:也就是Generic方式, 在代码中动态加载schema a svc文件, 将FieldName-Field Value, 以Map<K, V>的方式存储

序列化后的数据号schema和data同时存在的, 如下图、
在这里插入图片描述

二、序列化与反序列化实现

1、序列化(producer)

props.put("key.serializer",StringSerializer.class.getName());
props.put("value.serializer",StringSerializer.class.getName());

2、反序列化(consumer)

props.put("key.deserializer",StringDeserializer.class.getName());
props.put("value.deserializer",StringDeserializer.class.getName());

如果是flink,也可以用:

KafkaSourceBuilder 类提供了两个方法来反序列数据,分别是 setDeserializersetValueOnlyDeserializer
从名字上就应该可以看出这两者的区别,前者是反序列化完整的 ConsumerRecord,后者只反序列化 ConsumerRecord 的 value.

如果你想要获取 kafka 的元数据信息选择实现 KafkaDeserializationSchema 接口就可以了,KafkaDeserializationSchema 接口还有 4 个静态方法,其中的 of 方法就是用来反序列化 ConsumerRecord 的,剩下的 3 个 valueOnly 是用来反序列化 kafka 消息中的 value 的.

KafkaSource<String> source = KafkaSource.<String>builder()
			    .setBootstrapServers("ip")
			    .setTopics("web-topic")
			    .setGroupId("web-group")
			    .setStartingOffsets(OffsetsInitializer.earliest())//低版本jdk报错,改成jdk8
			    .setValueOnlyDeserializer(new SimpleStringSchema())
			    .build();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菠菜很好吃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值