本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息。

先前我已经分享了Kafka的基本介绍与集群环境搭建方法。关于Kafka的介绍请阅读Apache Kafka简介与安装(一),关于Kafka安装请阅读Apache Kafka安装,关于Kafka集群环境搭建请阅读Apache Kafka集群环境搭建 。这里关于服务器环境搭建不在赘述。

Spring Kafka整合Spring Boot创建生产者客户端案例

创建一个kafka-producer-master的maven工程。整个项目结构如下:

Maven的依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <groupId>com.gzh.kafka.producer</groupId>
  7. <artifactId>producer</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10.  
  11. <name>kafka-producer-master</name>
  12. <description>demo project for kafka producer</description>
  13.  
  14. <parent>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-parent</artifactId>
  17. <version>1.5.9.RELEASE</version>
  18. <relativePath/> <!-- lookup parent from repository -->
  19. </parent>
  20.  
  21. <properties>
  22. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  23. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  24. <spring-kafka.version>2.1.5.RELEASE</spring-kafka.version>
  25. <java.version>1.8</java.version>
  26. </properties>
  27.  
  28. <dependencies>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter</artifactId>
  32. </dependency>
  33.  
  34. <!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka -->
  35. <dependency>
  36. <groupId>org.springframework.kafka</groupId>
  37. <artifactId>spring-kafka</artifactId>
  38. <version>${spring-kafka.version}</version>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-starter-web</artifactId>
  43. </dependency>
  44.  
  45. <dependency>
  46. <groupId>org.springframework.boot</groupId>
  47. <artifactId>spring-boot-starter-test</artifactId>
  48. <scope>test</scope>
  49. </dependency>
  50. <!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka-test -->
  51. <dependency>
  52. <groupId>org.springframework.kafka</groupId>
  53. <artifactId>spring-kafka-test</artifactId>
  54. <version>${spring-kafka.version}</version>
  55. <scope>test</scope>
  56. </dependency>
  57.  
  58. <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
  59. <dependency>
  60. <groupId>io.springfox</groupId>
  61. <artifactId>springfox-swagger2</artifactId>
  62. <version>2.8.0</version>
  63. </dependency>
  64. <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
  65. <dependency>
  66. <groupId>io.springfox</groupId>
  67. <artifactId>springfox-swagger-ui</artifactId>
  68. <version>2.8.0</version>
  69. </dependency>
  70.  
  71. </dependencies>
  72.  
  73. <build>
  74. <plugins>
  75. <plugin>
  76. <groupId>org.springframework.boot</groupId>
  77. <artifactId>spring-boot-maven-plugin</artifactId>
  78. </plugin>
  79. </plugins>
  80. </build>
  81.  
  82. </project>

使用application.properties配置应用程序

当然,根据个人喜好,你也可以使用application.yml属性文件重写配置。Spring Boot会尝试根据pom.xml文件中指定的依赖关系自动配置应用程序,并设置合理的默认值。

  1. server.port=8000
  2. spring.application.name=kafka-producer
  3. #kafka configuration
  4. spring.kafka.producer.bootstrap-servers=192.168.1.130:9092,192.168.1.101:9093,192.168.1.101:9094
  5. spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
  6. spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
  7. #topic
  8. kafka.app.topic.foo=test20180430

在上面的配置中,我给生产者分配的端口号是8000,服务器有3台,采用先前window环境搭建zookeeper,kafka集群 中配置的服务器。想了解关于kafka生产者相关的更多配置的话,可以阅读关于Spring Boot Kafka Properties的配置信息。

使用Spring Boot发送Spring Kafka消息

SpringKafka提供了使用Producer的KafkaTemplate类发送消息,并提供将数据发送到Kafka主题的高级操作。 提供异步和同步方法,异步方法返回Future。Spring Boot根据application.properties属性文件中配置的属性自动配置并初始化KafkaTemplate。为了方便测试发送消息,使用了Spring的定时任务,在类上使用@EnableScheduling 注解开启定时任务,通过@Scheduled注解指定发送消息规则。

  1. package com.gzh.kafka.producer.component;
  2.  
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.kafka.core.KafkaTemplate;
  8. import org.springframework.kafka.support.SendResult;
  9. import org.springframework.scheduling.annotation.EnableScheduling;
  10. import org.springframework.scheduling.annotation.Scheduled;
  11. import org.springframework.stereotype.Component;
  12. import org.springframework.util.concurrent.ListenableFuture;
  13.  
  14. @Component
  15. @EnableScheduling
  16. public class KafkaMessageProducer {
  17.  
  18. private static final Logger LOG = LoggerFactory.getLogger(KafkaMessageProducer.class);
  19.  
  20. @Autowired
  21. private KafkaTemplate<String, String> kafkaTemplate;
  22.  
  23. @Value("${kafka.app.topic.foo}")
  24. private String topic;
  25.  
  26. @Scheduled(cron = "00/5 * * * * ?")
  27. public void send() {
  28. String message = "Hello World---" + System.currentTimeMillis();
  29. LOG.info("topic="+topic+",message="+message);
  30. ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(topic, message);
  31. future.addCallback(success -> LOG.info("KafkaMessageProducer 发送消息成功!"),
  32. fail -> LOG.error("KafkaMessageProducer 发送消息失败!"));
  33. }
  34. }

创建消息生产者启动类

  1. package com.gzh.kafka.producer;
  2.  
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  6.  
  7. @SpringBootApplication
  8. @EnableConfigurationProperties
  9. public class KafkaProducerApplication{
  10.  
  11. public static void main(String[] args) {
  12. SpringApplication.run(KafkaProducerApplication.class, args);
  13. }
  14. }

至此,Spring Boot整合Spring Kafka消息生产者应用已经整合完毕。启动zookeeper、kafka各个服务器。启动生产者应用,查看消息生产者应用控制台日志,如下图说明整合OK。

当然在创建消息生产者类时,我们可以更加灵活,可以不使用定时任务,通过界面请求的方式,发送我们想要发送的内容。简单案例如下:

  • 消息发送者类
  1. package com.gzh.kafka.producer.service;
  2.  
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.kafka.core.KafkaTemplate;
  8. import org.springframework.kafka.support.SendResult;
  9. import org.springframework.stereotype.Service;
  10. import org.springframework.util.concurrent.ListenableFuture;
  11.  
  12. @Service
  13. public class KafkaMessageSendService {
  14.  
  15. private static final Logger LOG = LoggerFactory.getLogger(KafkaMessageSendService.class);
  16.  
  17. @Autowired
  18. private KafkaTemplate<String, String> kafkaTemplate;
  19.  
  20. @Value("${kafka.app.topic.foo}")
  21. private String topic;
  22.  
  23. public void send(String message){
  24. LOG.info("topic="+topic+",message="+message);
  25. ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(topic, message);
  26. future.addCallback(success -> LOG.info("KafkaMessageProducer 发送消息成功!"),
  27. fail -> LOG.error("KafkaMessageProducer 发送消息失败!"));
  28. }
  29. }
  • 界面请求处理controller类
  1. package com.gzh.kafka.producer.controller;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.http.MediaType;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestMethod;
  7. import org.springframework.web.bind.annotation.RequestParam;
  8. import org.springframework.web.bind.annotation.RestController;
  9.  
  10. import com.gzh.kafka.producer.service.KafkaMessageSendService;
  11.  
  12. @RestController
  13. @RequestMapping(value="send",produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
  14. public class KafkaMessageSendController {
  15.  
  16. @Autowired
  17. private KafkaMessageSendService kafkaMessageSendService;
  18.  
  19. @RequestMapping(value="/sendMessage",method=RequestMethod.POST)
  20. public String send(@RequestParam(required=true) String message){
  21. try {
  22. kafkaMessageSendService.send(message);
  23. } catch (Exception e) {
  24. return "send failed.";
  25. }
  26. return message;
  27. }
  28. }
  • 通过Swagger访问测试Controller服务请求

Spring Kafka整合Spring Boot创建消费者客户端案例:

创建一个kafka-consumer-master的maven工程。整个项目结构如下:

Maven的依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <groupId>com.gzh.kafka.consumer</groupId>
  7. <artifactId>consumer</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10.  
  11. <name>kafka-consumer-master</name>
  12. <description>demo project for kafka consumer</description>
  13.  
  14. <parent>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-parent</artifactId>
  17. <version>1.5.9.RELEASE</version>
  18. <relativePath/> <!-- lookup parent from repository -->
  19. </parent>
  20.  
  21. <properties>
  22. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  23. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  24. <spring-kafka.version>1.3.4.RELEASE</spring-kafka.version>
  25. <java.version>1.8</java.version>
  26. </properties>
  27.  
  28. <dependencies>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter</artifactId>
  32. </dependency>
  33. <!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka -->
  34. <dependency>
  35. <groupId>org.springframework.kafka</groupId>
  36. <artifactId>spring-kafka</artifactId>
  37. <version>${spring-kafka.version}</version>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-web</artifactId>
  42. </dependency>
  43.  
  44. <dependency>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-starter-test</artifactId>
  47. <scope>test</scope>
  48. </dependency>
  49. <!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka-test -->
  50. <dependency>
  51. <groupId>org.springframework.kafka</groupId>
  52. <artifactId>spring-kafka-test</artifactId>
  53. <version>${spring-kafka.version}</version>
  54. <scope>test</scope>
  55. </dependency>
  56. </dependencies>
  57.  
  58. <build>
  59. <plugins>
  60. <plugin>
  61. <groupId>org.springframework.boot</groupId>
  62. <artifactId>spring-boot-maven-plugin</artifactId>
  63. </plugin>
  64. </plugins>
  65. </build>
  66.  
  67. </project>

注意,这是使用Spring-Kafka时一定要注意版本问题,否则会报各种奇葩错误。Spring官方网站上给出了SpringKafka和kafka-client版本(它的版本号要和kafka服务器的版本保持一致)的对应关系:

使用application.properties配置应用程序

Spring Boot会尝试根据pom.xml文件中指定的依赖关系自动配置应用程序,并设置合理的默认值。

  1. server.port=8001
  2. spring.application.name=kafka-consumer
  3.  
  4. #kafka configuration
  5. #指定消息被消费之后自动提交偏移量,以便下次继续消费
  6. spring.kafka.consumer.enable-auto-commit=true
  7. #指定消息组
  8. spring.kafka.consumer.group-id=guan
  9. #指定kafka服务器地址
  10. spring.kafka.consumer.bootstrap-servers=192.168.1.130:9092,192.168.1.101:9093,192.168.1.101:9094
  11. #指定从最近地方开始消费(earliest)
  12. spring.kafka.consumer.auto-offset-reset=latest
  13.  
  14. spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
  15. spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
  16. #topic
  17. kafka.app.topic.foo=test20180430

在上面的配置中,我给生产者分配的端口号是8000,服务器有3台,采用先前window环境搭建zookeeper,kafka集群 中配置的服务器。想了解关于kafka生产者相关的更多配置的话,可以阅读关于Spring Boot Kafka Properties的配置信息。

使用Spring Boot消费Spring Kafka消息

通过使用@KafkaListener来注解一个方法Spring Kafka会自动创建一个消息监听器容器。使用该注解,并指定要消费的topic(也可以指定消费组以及分区号,支持正则表达式匹配),这样,消费者一旦启动,就会监听kafka服务器上的topic,实时进行消费消息。

  1. package com.gzh.kafka.consumer.service;
  2.  
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.kafka.annotation.KafkaListener;
  6. import org.springframework.messaging.MessageHeaders;
  7. import org.springframework.messaging.handler.annotation.Headers;
  8. import org.springframework.messaging.handler.annotation.Payload;
  9. import org.springframework.stereotype.Component;
  10.  
  11. @Component
  12. public class KafkaMessageConsumer {
  13.  
  14. private static final Logger LOG = LoggerFactory.getLogger(KafkaMessageConsumer.class);
  15.  
  16. @KafkaListener(topics={"${kafka.app.topic.foo}"})
  17. public void receive(@Payload String message, @Headers MessageHeaders headers){
  18. LOG.info("KafkaMessageConsumer 接收到消息:"+message);
  19. headers.keySet().forEach(key->LOG.info("{}: {}",key,headers.get(key)));
  20. }
  21. }

创建消息消费者启动类

  1. package com.gzh.kafka.consumer;
  2.  
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  6.  
  7. @SpringBootApplication
  8. @EnableConfigurationProperties
  9. public class KafkaConsumerApplication {
  10.  
  11. public static void main(String[] args) {
  12. SpringApplication.run(KafkaConsumerApplication.class, args);
  13. }
  14. }

消费者应用已经完成,接下来让我们验证Spring Kafka消息发送和接收效果。先依次启动zookeeper、kafka服务器,然后在启动生产者(kafka-producer-master)应用,再启动消费者(kafka-consumer-master)应用,然后观察生产者和消费者启动类日志:

Spring Kafka和Spring Boot整合实现消息发送与消费简单案例的更多相关文章

  1. RocketMQ的消息发送及消费

    RocketMQ消息支持的模式: 消息支持的模式分为三种:NormalProducer(普通同步),消息异步发送,OneWay. 消息同步发送: 普通消息的发送和接收在前面已经演示过了,在前面的案例中 ...

  2. Spring Boot 整合 Mybatis Annotation 注解的完整 Web 案例

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 公司需要人.产品.业务和方向,方向又要人.产品.业务和方向,方向… 循环』 本文提纲一. ...

  3. 整合Spring Cloud Stream Binder与RabbitMQ进行消息发送与接收

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 Spring Cloud Stream专门用于事件驱动的微服务系统,使用消息中间件来收发信息.使用Spring ...

  4. SpringBoot整合RabbitMQ,实现消息发送和消费以及多个消费者的情况

    下载安装Erlang和RabbitMQ Erlang和RabbitMQ:https://www.cnblogs.com/theRhyme/p/10069611.html AMQP协议 https:// ...

  5. 微信发送模版消息,PHP代码简单案例

    function http_request($url,$data=array()){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); c ...

  6. 整合Spring Cloud Stream Binder与GCP Pubsub进行消息发送与接收

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 之前的文章<整合Spring Cloud Stream Binder与RabbitMQ进行消息发送与接收& ...

  7. 如何在优雅地Spring 中实现消息的发送和消费

    本文将对rocktmq-spring-boot的设计实现做一个简单的介绍,读者可以通过本文了解将RocketMQ Client端集成为spring-boot-starter框架的开发细节,然后通过一个 ...

  8. Spring Kafka整合Spring Boot创建生产者客户端案例

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 创建一个kafka-producer-master的maven工程.整个项目结构如下: ...

  9. spring boot 2.x 系列 —— spring boot 整合 kafka

    文章目录 一.kafka的相关概念: 1.主题和分区 2.分区复制 3. 生产者 4. 消费者 5.broker和集群 二.项目说明 1.1 项目结构说明 1.2 主要依赖 二. 整合 kafka 2 ...

随机推荐

  1. FFmpeg源代码简单分析:libswscale的sws_scale()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  2. 09 ListView监听 ExpandableListView的使用总结

    1.ListView的滚动监听 >setOnScrollListener 监听 //ListVIew滚动监听 lv.setOnScrollListener(new OnScrollListene ...

  3. Android实现登录小demo

    安卓,在小编实习之前的那段岁月里面,小编都没有玩儿过,如果说玩儿过,那就是安卓手机了,咳咳,敲登录的时候有种特别久违的熟悉,这种熟悉的感觉就和当时敲机房收费系统一样,那叫一个艰难啊,不过小编相信,在小 ...

  4. Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

    Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...

  5. svn 回退/更新/取消至某个版本命令详解

    1. 取消Add/Delete 取消文件 svn revert 文件名 取消目录 svn revert --depth=infinity 目录名 2. 回退版本 方法1: 用svn merge 1) ...

  6. PO核准通知界面修改

    想在notification頁面把供應商的稅捐代碼帶出來,添在如下紅框中 PO_WF_PO_NOTIFICATION head information:get_po_approve_msg line ...

  7. postman使用—chrome版

    如果大家不知道怎么安装,请下载个FQ软件(蓝灯,shadowsocks)都是可以的,安装完成之后,你可以在chrome看到posman的插件程序. 使用说明: 安装完成之后,使用chrome://ap ...

  8. JavaScript压缩工具JSA使用介绍

    JavaScript压缩工具JSA使用介绍 JSA绝对是我使用过的JS压缩工具中最上乘的一个.认识它是从ligerUI开始.在ligerUI的QQ讨论组里,大神--ligerUI的作者告诉我他的lig ...

  9. 谈谈Ext JS的组件——布局的使用方法续二

    绝对布局(Ext.layout.container.Absolute) 绝对布局让我回想到了使用Foxpro开发的时候,哪时候的界面布局就是这样,通过设置控件的左上角坐标(x,y)和宽度来进行的,因为 ...

  10. python 操作mysql数据库demo

    sudo apt-get install python-mysqldb #!/usr/bin/env python #encoding=utf-8 import sys import MySQLdb ...