概述
Kafka 是现今比较流行的一个异步消息队列处理中间件,经过多年来的发展和完善,已经相对比较成熟,对于大量消息数据的具有较高的性能支持。在 SpringBoot 项目中,常用的 kafka 实现主要有两种方式:一种是 SpringBoot 提供的 spring-kafka,另一种的 Apache 提供的 kafka-clients。对于 SpringBoot 项目,一般都推荐使用 spring-kafka。
Spring-kafka 项目实际上在其内部封装了 Apache 的 kafka-client,便于在 Spring 项目中快速继承 kafka。除了基本的消息队列处理外,spring-kafka 还提供了其他功能,详情可以参考项目源码:
https://github.com/spring-projects/spring-kafka
接入服务demo
首先引入 spring-kafka 的 maven 依赖:
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
紧接着添加 kafka 服务器配置(这里默认本地启动了一个 kafka 服务):
kafka.servers=127.0.0.1:9092
由于其他配置都存在默认初始化配置,因此我们可以只配置一个简单的生产者模板,然后直接写一个简单的 Controller 接口调用 kafka 发送服务:
@Configuration
@EnableKafka
public class DemoKafkaProducerConfig {
@Value("${kafka.servers}")
private String servers;
@Bean
public KafkaTemplate<String, Object> producerTemplate() {
return new KafkaTemplate<>(producerTemplateFactory());
}
private ProducerFactory<String, Object> producerTemplateFactory() {
return new DefaultKafkaProducerFactory<>(producerConfigs());
}
private Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>(4);
// kafka 服务器地址
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, servers);
// 消息序列化类型
props.put(ConsumerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
props.put(ConsumerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
return props;
}
}
@RestController
public class KafkaController {
private final Logger logger = LoggerFactory.getLogger(KafkaController.class);
@Autowired
private KafkaTemplate<Object, Object> template;
@GetMapping("/kafka/send_demo")
public void sendDemo(String input) {
this.template.send("demo_topic", input);
}
@KafkaListener(id = "demo_group_id", topics = "demo_topic")
public void consume(String msg) {
logger.info("Consume message is: {}" , msg);
}
}
最后,就是在启动类前面加上 @EnableKafka
这个注解启动 kafka 服务,然后运行项目即可。
@EnableKafka
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class. args);
}
}