Kafka对Java程序员有多重要?刚从Android端转向服务端开发时,同事说起Kafka,我不知这玩意是干什么的,因工作需要,也接触了Kafka,对其了解一些。
在上一篇文章中我们介绍了怎么在Windows系统上如何搭建kafka,既然环境搭建成功了,接下来就要集成到项目中使用才有价值,所谓实践出真知。
今天我把在SpringBoot中集成Kafka汇总下:
SpringBoot Version:2.1.7.RELEASE
kafka version :2.2.6.RELEASE
集成之前要注意的Kafka与Spring版本对应的关系表,后续要是遇到消息不能正常发送或是接收就可以留意是否是版本对应问题。
1.先看看pom文件依赖问题
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
一般生产者是在调用某些接口的服务处理完逻辑之后然后往kafka里面写数据,有一个消费者不停的监控这个Topic,分析数据,消费者放到kafka这个目录下,注意@Component注解,不然@KafkaListener不会执行。
不需要使用到mysql数据源问题,在Application 把DataSourceAutoConfiguration 注解掉。启动前确保已经启动zookeeper和kafka。
启动
1@SpringBootApplication
2@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
3public class Application {
4 public static void main(String[] args) {
5 SpringApplication.run(Application.class, args);
6 }
7}
2.消息消费者
1@Component
2public class MsgConsumer {
3 private static Logger logger = LoggerFactory.getLogger(MsgConsumer.class);
4
5 @KafkaListener(topics = {"xiaoai"})
6 public void listen(ConsumerRecord<?, ?> record) {
7 logger.info("消费者 :topic:{}, message:{},offset:{}",record.topic(), record.value(), record.offset());
8 }
9 }
3.消息生产者
1@RestController
2@RequestMapping("/kafka")
3public class MsgProducer {
4 @Autowired
5 private KafkaTemplate<String, String> kafkaTemplate;
6 private static Logger logger = LoggerFactory.getLogger(MsgConsumer.class);
7
8 @RequestMapping("/send")
9 public String send(String msg) {
10 kafkaTemplate.send("xiaoai", msg);
11 logger.info("生产者 :topic:{}, message:{} ", "xiaoai", msg);
12 return "success";
13 }
14}
4.pom配置文件
1server:
2 port: 8089
3spring:
4 kafka:
5 # 指定kafka 代理地址,多个用逗号分隔隔开,用于建立与Kafka集群的初始连接(kafka 默认的端口号为9092)
6 bootstrap-servers: 192.168.1.20:9092
7 producer:
8 # 发生错误后,消息重发的次数。
9 retries: 0
10 #当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算。
11 batch-size: 16384
12 # 设置生产者内存缓冲区的大小。
13 buffer-memory: 33554432
14 # 键的序列化方式
15 key-serializer: org.apache.kafka.common.serialization.StringSerializer
16 # 值的序列化方式
17 value-serializer: org.apache.kafka.common.serialization.StringSerializer
18 # acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应。
19 # acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。
20 # acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。
21 acks: 1
22 consumer:
23 # 自动提交的时间间隔
24 auto-commit-interval: 1S
25 # 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
26 # latest(默认值)在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
27 # earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录
28 auto-offset-reset: earliest
29 # 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量
30 enable-auto-commit: false
31 # 键的反序列化方式
32 key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
33 # 值的反序列化方式
34 value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
35 group-id: xiaoai
36 listener:
37 # 在侦听器容器中运行的线程数。
38 concurrency: 5
39 #listner负责ack,每调用一次,就立即commit
40 ack-mode: manual_immediate
当我们在浏览器输入localhost:8089/kafka/send/msg=hello时,生产者就能接受到msg hello数据,消费者就能对其消费了。
写在最后
如今都在谈论寒冬有多可怕,作为过来人,却有不同的看法:寒冬可怕,更可怕的是在寒冬里没有生存能力。
多给自己充充电,能力提高了,信心自然就有了,还会担心找不到工作吗?
由于笔者水平有限,文中纰漏之处在所难免,权当抛砖引玉,不妥之处,请大家批评指正。
-END-
作者:洪生鹏 白天搬砖,晚上摆地摊。技术交流、媒体合作、品牌宣传请添加微信: hsp-88ios
猜你喜欢
更多惊喜,请长按二维码识别关注
你若喜欢,别忘了点【在看】