- confluent repository
- org.apache.avro:avro:1.11.0 이상
- io.confluent:kafka-avro-serializer:7.0.1
<repositories>
<repository>
<id>confluent</id>
<name>confluent</name>
<url>https://packages.confluent.io/maven/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.11.0</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-avro-serializer</artifactId>
<version>7.0.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
</exclusion>
</exclusions>
</dependency>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.11.0</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 -->
<outputDirectory>${project.build.directory}/generated-sources</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
{
"type": "record",
"namespace": "com.example.avro.data",
"name": "Avro01",
"doc": "Sample default value",
"fields": [
{
"name": "fullName",
"type": "string"
},
{
"name": "maritalStatus",
"type": "string",
"default": "UNKNOWN"
},
{
"name": "active",
"type": "boolean",
"default": false
}
]
}
- topic and subject
- topic : sc-avro01
- subject : sc-avro01-value
- generate models
- spring.kafka.producer.value-serializer=io.confluent.kafka.serializers.KafkaAvroSerializer
spring:
main:
banner-mode: OFF
kafka:
bootstrap-servers:
- localhost:9092
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: io.confluent.kafka.serializers.KafkaAvroSerializer
properties:
schema.registry.url: http://localhost:8085
@Service
public class Avro01Producer {
@Autowired
private KafkaTemplate<String, Avro01> kafkaTemplate;
public void send(Avro01 data) {
kafkaTemplate.send("sc-avro01", data);
}
}
- spring.kafka.consumer.value-deserializer=io.confluent.kafka.serializers.KafkaAvroDeserializer
spring:
main:
banner-mode: OFF
kafka:
bootstrap-servers:
- localhost:9092
consumer:
group-id: avro-cg
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: io.confluent.kafka.serializers.KafkaAvroDeserializer
properties:
schema.registry.url: http://localhost:8085
specific.avro.reader: true
@Slf4j
@Service
public class Avro01Consumer {
@KafkaListener(topics = "sc-avro01")
public void listen(ConsumerRecord<String, Avro01> record) {
log.info("Received {} : {}", record.key(), record.value());
}
}