经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
Spring Boot 整合 Kafka
来源:cnblogs  作者:luis林  时间:2023/4/12 11:16:16  对本文有异议

Kafka 环境搭建

  1. kafka 安装、配置、启动、测试说明:
  2. 1. 安装:直接官网下载安装包,解压到指定位置即可(kafka 依赖的 Zookeeper 在文件中已包含)
  3. 下载地址:https://kafka.apache.org/downloads
  4. 示例版本:kafka_2.13-2.8.0.tgz
  5. 下载后可本地解压安装,解压位置自选,如 D:\Java
  6. 解压命令:tar -zxvf kafka_2.13-2.8.0.tgz
  7. PS:可在 idea 命令行窗口或 git 提供的命令窗口中进行命令操作
  8. 使用 git 提供的命令窗口:空白文件夹中右键——》Git Bash Here 即可打开
  9. 2. 添加地址配置
  10. D:\Java\kafka_2.13-2.8.0\config\server.properties 中搜索添加以下两行配置:
  11. listeners=PLAINTEXT://localhost:9092
  12. advertised.listeners=PLAINTEXT://localhost:9092
  13. 说明:以上配置默认是注释掉的,可搜索找到,根据需求进行自定义地址配置
  14. 重要说明:以下命令操作默认都是在 D:\Java\kafka_2.13-2.8.0\ kafaka 根目录下进行!
  15. 3. 使用配置文件方式后台启动/关闭 Zookeeper 服务
  16. 启动:bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
  17. 关闭【自选】:bin/zookeeper-server-stop.sh -daemon config/zookeeper.properties
  18. 4. 使用配置文件方式后台启动/关闭 kafka 服务
  19. 启动:bin/kafka-server-start.sh -daemon config/server.properties
  20. 关闭【自选】:bin/kafka-server-stop.sh -daemon config/server.properties
  21. 5. 服务测试
  22. 5.1 创建主题
  23. bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic Hello-Kafka
  24. 5.2 查看主题(可能需要查一会儿)
  25. bin/kafka-topics.sh --list --zookeeper localhost:2181
  26. 说明:发送消息和监听消息需要打开两个窗口进行测试!
  27. 5.3 发送消息(kafka 根目录下新建窗口)
  28. bin/kafka-console-producer.sh --broker-list localhost:9092 --topic Hello-Kafka
  29. 输入以上命令回车后,可继续输入内容测试消息发送
  30. 5.4 监听消息(kafka 根目录下新建窗口)
  31. bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic Hello-Kafka --from-beginning
  32. 输入以上命令后,可观察消息接收情况,并且可在消息发送窗口继续发送消息测试此监听窗口的接收情况,正常接收,则服务环境搭建成功。

Spring Boot 整合 Kafka

环境:自行创建 Spring Boot 项目,添加测试依赖,并启动 Zookeeper 和 kafka 服务。

注意:Zookeeper 默认好像占用 8080 端口,自己注意端口占用问题。

1. 添加依赖

  1. <!-- spring-kafka -->
  2. <dependency>
  3. <groupId>org.springframework.kafka</groupId>
  4. <artifactId>spring-kafka</artifactId>
  5. </dependency>

2. 添加配置

  1. # kafka 配置
  2. spring:
  3. kafka:
  4. bootstrap-servers: localhost:9092
  5. producer:
  6. # 发生错误后,消息重发的次数。
  7. retries: 1
  8. #当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算。
  9. batch-size: 16384
  10. # 设置生产者内存缓冲区的大小。
  11. buffer-memory: 33554432
  12. # 键的序列化方式
  13. key-serializer: org.apache.kafka.common.serialization.StringSerializer
  14. # 值的序列化方式
  15. value-serializer: org.apache.kafka.common.serialization.StringSerializer
  16. # acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应。
  17. # acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。
  18. # acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。
  19. acks: 1
  20. consumer:
  21. # 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式,如1S,1M,2H,5D
  22. auto-commit-interval: 1S
  23. # 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
  24. # latest(默认值)在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
  25. # earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录
  26. auto-offset-reset: earliest
  27. # 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量
  28. enable-auto-commit: false
  29. # 键的反序列化方式
  30. key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
  31. # 值的反序列化方式
  32. value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
  33. listener:
  34. # 在侦听器容器中运行的线程数。
  35. concurrency: 5
  36. # listner负责ack,每调用一次,就立即commit
  37. ack-mode: manual_immediate
  38. missing-topics-fatal: false

3. 创建消息生产者

  1. @Component
  2. public class KafkaProducer {
  3. private Logger logger = LoggerFactory.getLogger(KafkaProducer.class);
  4. @Resource
  5. private KafkaTemplate<String, Object> kafkaTemplate;
  6. public static final String TOPIC_TEST = "Hello-Kafka";
  7. public static final String TOPIC_GROUP = "test-consumer-group";
  8. public void send(Object obj) {
  9. String obj2String = JSON.toJSONString(obj);
  10. logger.info("准备发送消息为:{}", obj2String);
  11. // 发送消息
  12. ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(TOPIC_TEST, obj);
  13. future.addCallback(new ListenableFutureCallback<SendResult<String, Object>>() {
  14. @Override
  15. public void onFailure(Throwable throwable) {
  16. //发送失败的处理
  17. logger.info(TOPIC_TEST + " - 生产者 发送消息失败:" + throwable.getMessage());
  18. }
  19. @Override
  20. public void onSuccess(SendResult<String, Object> stringObjectSendResult) {
  21. //成功的处理
  22. logger.info(TOPIC_TEST + " - 生产者 发送消息成功:" + stringObjectSendResult.toString());
  23. }
  24. });
  25. }
  26. }

4. 创建消息消费者

  1. @Component
  2. public class KafkaConsumer {
  3. private Logger logger = LoggerFactory.getLogger(KafkaConsumer.class);
  4. @KafkaListener(topics = KafkaProducer.TOPIC_TEST, groupId = KafkaProducer.TOPIC_GROUP)
  5. public void topicTest(ConsumerRecord<?, ?> record, Acknowledgment ack, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
  6. Optional<?> message = Optional.ofNullable(record.value());
  7. if (message.isPresent()) { // 包含非空值,则执行
  8. Object msg = message.get();
  9. logger.info("topic_test 消费了: Topic:" + topic + ",Message:" + msg);
  10. ack.acknowledge(); // 确认成功消费一个消息
  11. }
  12. }
  13. }

5. 消息发送测试

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class KafkaProducerTest {
  4. private Logger logger = LoggerFactory.getLogger(KafkaProducerTest.class);
  5. @Resource
  6. private KafkaProducer kafkaProducer; // 注意使用自己创建的,看清楚!
  7. /*
  8. 测试之前需要开启 Kafka 服务
  9. 启动 Zookeeper:bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
  10. 启动 Kafka:bin/kafka-server-start.sh -daemon config/server.properties
  11. 测试结果数据:
  12. 准备发送消息为:"你好,我是Lottery 001"
  13. Hello-Kafka - 生产者 发送消息成功:SendResult [producerRecord=ProducerRecord(topic=Hello-Kafka, partition=null,
  14. headers=RecordHeaders(headers = [], isReadOnly = true), key=null, value=你好,我是Lottery 001, timestamp=null),
  15. recordMetadata=Hello-Kafka-0@47]
  16. topic_test 消费了: Topic:Hello-Kafka,Message:你好,我是Lottery 001
  17. */
  18. @Test
  19. public void test_send() throws InterruptedException {
  20. // 循环发送消息
  21. while (true) {
  22. kafkaProducer.send("你好,我是Lottery 001");
  23. Thread.sleep(3500);
  24. }
  25. }
  26. }

原文链接:https://www.cnblogs.com/luisblog/p/17307292.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号