Kafka结合Avro、confluent进行序列化和反序列化

首先需要添加如下的依赖:



    org.apache.avro
    avro
    1.9.0

 

      org.apache.avro
      avro-tools
      1.9.0
    

而confluent的相关包在maven上是找不到的。需要自己手动添加:

Kafka结合Avro、confluent进行序列化和反序列化_第1张图片

需要这些包。

而后,需要在linux上安装confluent:

我选择安装的是1.0版本。

tar包下载地址:https://www.confluent.io/previous-versions/

下载后,解压。

启动confluent:(注意:在启动之前一定要先启动zookeeper和kafka!)

[root@confluent confluent-4.1.1]# bin/schema-registry-start etc/schema-registry/schema-registry.properties
# 省略一些内容......
[2018-06-22 16:10:26,442] INFO Server started, listening for requests... (io.confluent.kafka.schemaregistry.rest.SchemaRegistryMain:45)

启动成功后,就可以编写客户端程序了:

生产者:

public class AvroTest2 {
    public static void main(String[] args) {
        Properties kafkaProps=new Properties();
        kafkaProps.put("bootstrap.servers","192.168.123.66:9092");
        kafkaProps.put("key.serializer","io.confluent.kafka.serializers.KafkaAvroSerializer");
        kafkaProps.put("value.serializer","io.confluent.kafka.serializers.KafkaAvroSerializer");
        kafkaProps.put("schema.registry.url", "http://192.168.123.66:8081");

       // String schemaString="{\"namespace\": \"CustomerManagerAvro.avro\", \"type\": \"record\", \"name\": \"Customer\", \"fields\": [{\"name\": \"id\", \"type\": \"int\"}, {\"name\": \"name\",  \"type\": \"string\"}, {\"name\": \"email\", \"type\":  \"string\", \"default\": \"null\"}]}";
        String schemaString="{\n" +
                "    \"namespace\": \"CustomerManagerAvro\",\n" +
                "    \"type\": \"record\",\n" +
                "    \"name\": \"Customer\",\n" +
                "    \"fields\": [\n" +
                "        {\"name\": \"id\", \"type\": \"int\"},\n" +
                "        {\"name\": \"name\",  \"type\": \"string\"},\n" +
                "        {\"name\": \"email\", \"type\": [\"null\", \"string\"]}\n" +
                "    ]\n" +
                "}\n";
    KafkaProducer producer=new KafkaProducer(kafkaProps);
        Schema.Parser parser = new Schema.Parser();
        Schema schema = parser.parse(schemaString);



        GenericData.Record customer = new GenericData.Record(schema);
        customer.put("id",3);
        customer.put("name","谢飞");
        customer.put("email","[email protected]");
        ProducerRecord record = new ProducerRecord("CustomerTest",customer);
        try {
        producer.send(record).get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (
    ExecutionException e) {
        e.printStackTrace();
    }

}
}

消费者:

public class DeAvroTest {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "192.168.123.66:9092");
        props.put("group.id", "CountryCounter");
        props.put("key.deserializer",  "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer","io.confluent.kafka.serializers.KafkaAvroDeserializer");
        props.put("schema.registry.url", "http://192.168.123.66:8081");
        KafkaConsumer consumer = new KafkaConsumer(props);


        //订阅主题
        //consumer.subscribe(Collections.singletonList("test"));//从分区的最新的偏移量开始
        //从分区的开头开始
        TopicPartition tp = new TopicPartition("CustomerTest", 0);
        List list = new ArrayList();
        list.add(tp);
        consumer.assign(list);//需要指派主题分区列表
        consumer.seekToBeginning(tp);//从指定主题的特定分区开始
        //轮询
        try{
            while (true)
            {
                ConsumerRecords records = consumer.poll(100);
                for (ConsumerRecord record : records) {

                    try {
                        System.out.println(record.value());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }catch (Exception e)
        {
            e.printStackTrace();
        }finally {
            consumer.close();
            System.out.println("测试消费者!");
        }
    }
}

可以看到消费者拿到消息:

当然,我们可以只拿到特定的数据,比如name,就可以使用:

 System.out.println(record.value().get("name"));

 

可以看到打印出来了名字。 

我们可以在linux中查看所有的schema:

ps:1.我们在客户端中写了schema后就会直接在confluent中注册schema。

2.confluent的maven仓库:http://packages.confluent.io/maven/io/

需要修改我们maven的配置文件。。。。。我这里直接使用下载的jar包。

你可能感兴趣的:(Kafka)