一 、引入依赖
<!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.7.3</version>
</dependency>
二 、配置
(1)application.properties配置
#kafka server地址
spring.kafka.bootstrap-servers=172.16.10.129:9092
#生产者配置
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
#消费者配置
spring.kafka.consumer.group-id=0
spring.kafka.consumer.enable-auto-commit=true
spring.kafka.consumer.auto-commit-interval=5000
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
(2)配置类
也可以通过java配置类来进行配置
@Configuration
public class KafkaConfiguration {
private static final String BROKER_LIST = "172.16.10.129:9092";
/**
* kafkaTemplate
*/
@Bean
public KafkaTemplate<String, String> kafkaTemplate(ProducerFactory<String, String> producerFactory) {
return new KafkaTemplate<>(producerFactory);
}
/**
* producerFactory
*/
@Bean
public ProducerFactory producerFactory() {
Map props = new HashMap();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, BROKER_LIST);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
return new DefaultKafkaProducerFactory(props);
}
@Bean
public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}
/**
* consumerFactory
*/
@Bean
public ConsumerFactory<String, String> consumerFactory() {
Map props = new HashMap();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BROKER_LIST);
props.put(ConsumerConfig.GROUP_ID_CONFIG, "0");
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
return new DefaultKafkaConsumerFactory<>(props);
}
三 、生产者
通过KafkaTemplate来操作
@RestController
@RequestMapping("/kafka")
@Api(tags = "kafka测试")
public class ProducerController extends BaseController {
int msgNo = 0;
//注入kafka模板
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@GetMapping("/send")
@ApiOperation(value = "发送消息", notes = "kafka生产者发送消息")
public ResponseEntity send(@RequestParam String msg) {
ResponseEntity response = getResponse();
kafkaTemplate.send("test", msg + msgNo++);
return response;
}
}
四 、消费者
通过注解@KafkaListener来实现
@Component
public class ConsumerListener {
@KafkaListener(topics = "test")
public void listener(ConsumerRecord<?, ?> record) {
System.out.println(String.format("topic:%s, offset:%d, value:%s ", record.topic(), record.offset(), record.value()));
}
}