Java 如何在Spring Kafka中使用Avro序列化
我正在学习卡夫卡和现在的Avro,为了保持发送方对象和接收方对象之间的一致性,我们保留了一个JSON模式(.avsc)。但我找不到任何简单的例子来说明如何使用它。一些示例使用confluent(是Avro的confluent命令),一些示例通过Avro工具生成对象。 到目前为止,我有一个工作卡夫卡设置 对象类 } 控制器类 主要应用 卡夫卡普罗德里格 格雷德尔先生Java 如何在Spring Kafka中使用Avro序列化,java,apache-kafka,avro,Java,Apache Kafka,Avro,我正在学习卡夫卡和现在的Avro,为了保持发送方对象和接收方对象之间的一致性,我们保留了一个JSON模式(.avsc)。但我找不到任何简单的例子来说明如何使用它。一些示例使用confluent(是Avro的confluent命令),一些示例通过Avro工具生成对象。 到目前为止,我有一个工作卡夫卡设置 对象类 } 控制器类 主要应用 卡夫卡普罗德里格 格雷德尔先生 它的工作设置,我能够发送和接收数据,我需要做什么更改才能使Avro工作。Confluent为这个用例维护教程: 您当前正在使用JS
它的工作设置,我能够发送和接收数据,我需要做什么更改才能使Avro工作。Confluent为这个用例维护教程:
您当前正在使用JSON。要在当前设置中轻松使用Avro,必须导入Jackson Avro数据格式objectmapper 或您可以安装Confluent Schema Registry并使用其序列化程序,而无需为所需的每个对象类编写自己的序列化程序 要实际使用AVSC,您需要从文件系统中读取文件以创建模式对象,或者可以使用Avro Gradle插件让它为您生成一个对象类,该类将模式作为变量嵌入 合流的示例使用了Avro-Maven插件,但其思想类似
请注意,使用Jackson Avro编码的消息与合流消息不兼容,因为合流序列化消息本身不包含任何Avro模式,因此您不能混合使用这些(反)序列化器这听起来可能很愚蠢,但我不理解您的大部分答案。你能举个例子解释一下吗?这很难解释,因为实际上你做了很多。。。我将从这里提供的简单示例开始(它不使用Spring或Gradle,然后尝试找到您实际想要使用这些其他工具的适当替代品)。
package com.example.kafka;
public class Hello {
String name;
String age;
public Hello(String name, String age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Hello{" +
"name='" + name + '\'' +
", date='" + age + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
package com.example.kafka;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/")
class KafkaController {
@Autowired
KafkaService kafkaService;
@GetMapping("test")
public Hello hello() {
Hello hello = new Hello("shrikant", "25");
kafkaService.hello(hello);
return hello;
}
}
package com.example.kafka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableAutoConfiguration
public class KafkaDemoApplication {
public static void main(String[] args) {
SpringApplication.run(KafkaDemoApplication.class, args);
}
}
package com.example.kafka;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class KafkaProducerConfig {
@Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaSerializer.class);
return props;
}
@Bean
public ProducerFactory<String, Hello> producerFactory() {
return new DefaultKafkaProducerFactory<>(producerConfigs());
}
@Bean
public KafkaTemplate<String, Hello> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}
}
package com.example.kafka;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.kafka.common.serialization.Serializer;
import java.util.Map;
public class KafkaSerializer implements Serializer<Hello> {
@Override
public byte[] serialize(String arg0, Hello developer) {
byte[] serializedBytes = null;
ObjectMapper objectMapper = new ObjectMapper();
try {
serializedBytes = objectMapper.writeValueAsString(developer).getBytes();
} catch (Exception e) {
e.printStackTrace();
}
return serializedBytes;
}
@Override
public void close() {
// TODO Auto-generated method stub
}
@Override
public void configure(Map<String, ?> arg0, boolean arg1) {
// TODO Auto-generated method stub
}
}
package com.example.kafka;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
@Service
public class KafkaService {
@Autowired
private KafkaTemplate<String, Hello> kafkaTemplate;
public void hello(Hello hello) {
kafkaTemplate.send("test", hello);
}
}
{"namespace": "com.example.kafka",
"type": "record",
"name": "Hello",
"fields": [
{"name": "name", "type": "string"},
{"name": "age", "type": "string"},
]
}
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.5.21.RELEASE'
}
}
plugins {
id 'java'
}
apply plugin: 'org.springframework.boot'
group = 'com.example.kafka'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
ext {
set('spring-kafka.version', "2.2.8.RELEASE")
}
dependencies {
compile 'org.springframework.boot:spring-boot-starter'
compile 'org.springframework.kafka:spring-kafka'
implementation 'org.springframework.boot:spring-boot-starter-web'
}