1180. Avro with Spring Project Setup - dkkahm/study-kafka-with-spring GitHub Wiki

Dependencies

  • 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>

Schema

  • Avro01.avsc
{
    "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
    • mvn compile

Producer

  • 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
  • producer
@Service
public class Avro01Producer {

    @Autowired
    private KafkaTemplate<String, Avro01> kafkaTemplate;

    public void send(Avro01 data) {
        kafkaTemplate.send("sc-avro01", data);
    }
}

Consumer

  • 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
  • consumer
@Slf4j
@Service
public class Avro01Consumer {

    @KafkaListener(topics = "sc-avro01")
    public void listen(ConsumerRecord<String, Avro01> record) {
        log.info("Received {} : {}", record.key(), record.value());
    }
}
⚠️ **GitHub.com Fallback** ⚠️