关于Kafka Spring Boot的教程

Apache Kafka是一个分布式数据流平台,具有发布和订阅数据流,以容错方式存储记录以及处理该数据流等功能。 

它用于构建实时流数据管道,可以执行功能,例如将数据流从一个应用程序可靠地传递到另一个应用程序,以及处理数据并将其传输到目标应用程序。

主题

Kafka作为一个或多个服务器中的集群运行,集群存储/检索名为Topics的Feed /类别中的记录。主题中的每条记录都存储有键,值和时间戳。

主题可以包含零个,一个或多个使用者,他们将订阅写入该主题的数据。在Kafka术语中,主题始终是多用户馈送的一部分。

分区

Kafka集群为每个主题使用分区日志。

640?wx_fmt=png

分区维护数据的插入顺序,一旦将记录发布到主题,它将保留在那里,具体取决于保留期(可配置)。记录始终附加在分区的末尾。它维护一个名为 “offsets” 的标志,用于唯一标识分区中的每条记录。

偏移量由消费应用程序控制。使用偏移量,消费者可能会回溯到较旧的偏移量并在需要时重新处理记录。

生产者

记录流,即数据,由生产者发布到主题。它们还可以在分区向主题发布数据时分配分区。生产者可以循环发送数据,也可以根据记录的优先级将记录发送到某些分区,从而实现优先级系统。

消费者

消费者使用该主题的记录。它们基于消费者群体的概念,其中一些消费者被分配在群组中。发布到主题的记录仅从一个消费者组传递给消费者的一个实例。Kafka内部使用消费者组内消费记录的机制。消费者的每个实例将获得特定分区日志,使得在消费者组内,记录可以由每个消费者并行处理。

Spring Boot Kafka

Spring为Kafka提供了很好的支持,并提供了与原生Kafka Java客户端一起使用的抽象层。

我们可以添加以下依赖项来开始使用Spring Boot和Kafka。

 
 
<dependency>	
    <groupId>org.springframework.kafka</groupId>	
    <artifactId>spring-kafka</artifactId>	
    <version>2.2.3.RELEASE</version>	
</dependency>

要下载并安装Kafka,请参阅官方指南  https://kafka.apache.org/quickstart  。

下载Kafka后,您可以发出命令来启动ZooKeeper,Kafka使用它来存储元数据。

 
 
zookeeper-server-start.bat .configzookeeper.properties

接下来,我们需要通过发出以下命令在本地启动Kafka集群。

 
 
kafka-server-start.bat .configserver.properties

现在,默认情况下,Kafka服务器启动  localhost:9092。

编写一个简单的REST控制器并公开一个端点/publish,如下所示。它用于将消息发布到主题。

 
 
package com.rahul.kafkaspringboot.controllers;	
	
import com.rahul.kafkaspringboot.services.Producer;	
import org.springframework.beans.factory.annotation.Autowired;	
import org.springframework.web.bind.annotation.PostMapping;	
import org.springframework.web.bind.annotation.RequestMapping;	
import org.springframework.web.bind.annotation.RequestParam;	
import org.springframework.web.bind.annotation.RestController;	
	
@RestController	
@RequestMapping(value = "/kafka")	
public class KafkaController {	
	
private final Producer producer;	
	
@Autowired	
public KafkaController(Producer producer) {	
this.producer = producer;	
}	
	
@PostMapping(value = "/publish")	
public void sendMessageToKafkaTopic(@RequestParam("message") String message){	
this.producer.sendMessage(message);	
}	
}	

然后,我们可以编写使用Spring的kafkaTemplate将消息发送到名为users的主题的生产者,如下所示。

 
 
package com.rahul.kafkaspringboot.services;	
	
import org.slf4j.Logger;	
import org.slf4j.LoggerFactory;	
import org.springframework.beans.factory.annotation.Autowired;	
import org.springframework.kafka.core.KafkaTemplate;	
import org.springframework.stereotype.Service;	
	
@Service	
public class Producer {	
	
private static final Logger logger = LoggerFactory.getLogger(Producer.class);	
private static final String TOPIC = "users";	
	
@Autowired	
private KafkaTemplate<String,String> kafkaTemplate;	
	
public void sendMessage(String message){	
logger.info(String.format("$$ -> Producing message --> %s",message));	
this.kafkaTemplate.send(TOPIC,message);	
}	
}	

我们还可以编写如下所示的消费者,它使用来自主题用户的消息并将日志输出到控制台。

 
 
package com.rahul.kafkaspringboot.services;	
	
import org.slf4j.Logger;	
import org.slf4j.LoggerFactory;	
import org.springframework.kafka.annotation.KafkaListener;	
import org.springframework.stereotype.Service;	
	
@Service	
public class Consumer {	
	
private final Logger logger = LoggerFactory.getLogger(Consumer.class);	
	
@KafkaListener(topics = "users", groupId = "group_id")	
public void consume(String message){	
logger.info(String.format("$$ -> Consumed Message -> %s",message));	
}	
}	

现在,我们需要一种方法告诉我们的应用程序在哪里找到Kafka服务器并创建一个主题并发布到它。我们可以使用  application.yaml 如下所示的方法。

 
 
server:	
  port: 9000	
	
spring:	
  kafka:	
    consumer:	
      bootstrap-servers: localhost:9092	
      group-id: group-id	
      auto-offset-reset: earliest	
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer	
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer	
    producer:	
      bootstrap-servers: localhost:9092	
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer	
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

现在,如果我们运行应用程序并按如下所示到达端点,那么我们已经向主题发布了一条消息。

640?wx_fmt=jpeg

现在,如果我们从控制台检查日志,它应该打印发送到发布端点的消息,如下所示。

640?wx_fmt=jpeg

摘要

在这篇文章中,我们已经看到了Kafka系统中使用的基本术语。我们还看到使用Spring Boot配置Kafka是多么容易。大多数工作都是由Spring Boot在幕后完成的。一种简单快捷的方法是在application.yml文件中配置与Kafka相关的详细信息,如果我们更改Kafka集群并且必须将服务器指向新的Kafka集群地址,这非常的便捷!

640?wx_fmt=jpeg

长按二维码 ▲

订阅「架构师小秘圈」公众号

如有启发,帮我点个在看,谢谢↓

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值