SpringBoot实战(十四)之整合KafKa

 本人今天上午参考了不少博文,发现不少博文不是特别好,不是因为依赖冲突问题就是因为版本问题。

于是我结合相关的博文和案例,自己改写了下并参考了下,于是就有了这篇文章。希望能够给大家帮助,少走一些弯路。

 

一、KafKa的介绍

1.主要功能

根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能:

  a.发布和订阅消息流,这个功能类似于消息队列,这也是kafka归类为消息队列框架的原因。

  b.以容错的方式记录消息流,kafka以文件的方式来存储消息流。

  c.可以再消息发布的时候进行处理。

 

2.使用场景

a.在系统或应用程序之间构建可靠的用于传输实时数据的管道,消息队列功能。

b.构建实时的流数据处理程序来变换或处理数据流,数据处理功能。

 

3.详细介绍

 Kafka目前主要作为一个分布式的发布订阅式的消息系统使用,下面简单介绍一下kafka的基本机制

消息传输过程:

 

Producer即生产者,向Kafka集群发送消息,在发送消息之前,会对消息进行分类,即Topic,上图展示了两个producer发送了分类为topic1的消息,另外一个发送了topic2的消息。

 

Topic即主题,通过对消息指定主题可以将消息分类,消费者可以只关注自己需要的Topic中的消息

 

Consumer即消费者,消费者通过与kafka集群建立长连接的方式,不断地从集群中拉取消息,然后可以对这些消息进行处理。

 

二、安装

安装包下载地址:http://kafka.apache.org/downloads

找到0.11.0.1版本,如图:

1.下载

wget https://archive.apache.org/dist/kafka/0.11.0.1/kafka_2.11-0.11.0.1.tgz

 

2.解压

tar -xzvf kafka_2.11-0.11.0.1.tgz

配置说明:

    consumer.properites 消费者配置,这个配置文件用于配置开启的消费者,此处我们使用默认的即可。

    producer.properties 生产者配置,这个配置文件用于配置开启的生产者,此处我们使用默认的即可。

  server.properties kafka服务器的配置,此配置文件用来配置kafka服务器,目前仅介绍几个最基础的配置。

       a.broker.id 申明当前kafka服务器在集群中的唯一ID,需配置为integer,并且集群中的每一个kafka服务器的id都应是唯一的,我们这里采用默认配置即可。

       b.listeners 申明此kafka服务器需要监听的端口号,如果是在本机上跑虚拟机运行可以不用配置本项,默认会使用localhost的地址,如果是在远程服务器上运行则必须配置,

例如:listeners=PLAINTEXT:// 192.168.126.143:9092。并确保服务器的9092端口能够访问。

  c.zookeeper.connect 申明kafka所连接的zookeeper的地址 ,需配置为zookeeper的地址,由于本次使用的是kafka高版本中自带zookeeper,

使用默认配置即可,zookeeper.connect=localhost:2181。

 

3.运行

首先运行zookeeper

bin/zookeeper-server-start.sh config/zookeeper.properties

运行成功,显示如图:

 

然后运行kafka

bin/kafka-server-start.sh config/server.properties

 运行成功,显示如图:

 

三、整合KafKa

1.新建Maven项目导入Maven依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.test</groupId>
  <artifactId>kafka_demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

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

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.2</version>
        </dependency>

    </dependencies>
 
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            
   <!-- 指定编译版本 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
   
        
    
            
    
        
        <finalName>${project.artifactId}</finalName>
            

    </build>

   
</project>

 

2.编写消息实体
package com.springboot.kafka.bean;


import java.util.Date;

import lombok.Data;
 


@Data
public class Message {
    private Long id;    //id

    private String msg; //消息

    private Date sendTime;  //时间戳

}

 有了lombok,每次编写实体不必要使用快捷键生成seter或geter方法了,代码看起来更加简洁了。

 

3.编写消息发送者(可以理解为生产者,最好联系详细介绍中的图)
package com.springboot.kafka.producer;

import java.util.Date;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.springboot.kafka.bean.Message;

import lombok.extern.slf4j.Slf4j;

@Component
@Slf4j
public class KafkaSender {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    private Gson gson = new GsonBuilder().create();

    //发送消息方法
    public void send() {
        Message message = new Message();
        message.setId(System.currentTimeMillis());
        message.setMsg(UUID.randomUUID().toString());
        message.setSendTime(new Date());
        log.info("+++++++++++++++++++++  message = {}", gson.toJson(message));
        kafkaTemplate.send("zhisheng", gson.toJson(message));
    }
}

 

4.编写消息接收者(可以理解为消费者)
package com.springboot.kafka.producer;

import java.util.Date;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.springboot.kafka.bean.Message;

import lombok.extern.slf4j.Slf4j;

@Component
@Slf4j
public class KafkaSender {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    private Gson gson = new GsonBuilder().create();

    //发送消息方法
    public void send() {
        Message message = new Message();
        message.setId(System.currentTimeMillis());
        message.setMsg(UUID.randomUUID().toString());
        message.setSendTime(new Date());
        log.info("+++++++++++++++++++++  message = {}", gson.toJson(message));
        kafkaTemplate.send("zhisheng", gson.toJson(message));
    }
}

 

5.编写启动类
package com.springboot.kafka;
 


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import com.springboot.kafka.producer.KafkaSender;


@SpringBootApplication
public class KafkaApplication {

    public static void main(String[] args) {

        ConfigurableApplicationContext context = SpringApplication.run(KafkaApplication.class, args);

        KafkaSender sender = context.getBean(KafkaSender.class);

        for (int i = 0; i < 3; i++) {
            //调用消息发送类中的消息发送方法
            sender.send();

            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 

 

6.编写application.properties配置文件
#============== kafka ===================
# \u6307\u5B9Akafka \u4EE3\u7406\u5730\u5740\uFF0C\u53EF\u4EE5\u591A\u4E2A
spring.kafka.bootstrap-servers=192.168.126.143:9092

#=============== provider  =======================

spring.kafka.producer.retries=0
# \u6BCF\u6B21\u6279\u91CF\u53D1\u9001\u6D88\u606F\u7684\u6570\u91CF
spring.kafka.producer.batch-size=16384
spring.kafka.producer.buffer-memory=33554432

# \u6307\u5B9A\u6D88\u606Fkey\u548C\u6D88\u606F\u4F53\u7684\u7F16\u89E3\u7801\u65B9\u5F0F
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer

#=============== consumer  =======================
# \u6307\u5B9A\u9ED8\u8BA4\u6D88\u8D39\u8005group id
spring.kafka.consumer.group-id=test-consumer-group

spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.enable-auto-commit=true
spring.kafka.consumer.auto-commit-interval=100

# \u6307\u5B9A\u6D88\u606Fkey\u548C\u6D88\u606F\u4F53\u7684\u7F16\u89E3\u7801\u65B9\u5F0F
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer

 

7.运行结果

 

示例代码地址:https://github.com/youcong1996/study_simple_demo/tree/kafka_demo

如果按照上述流程没有达到预计的效果可以git clone到本地。

 

转载于:https://www.cnblogs.com/youcong/p/10216573.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot整合Kafka实战 Kafka是一个分布式的消息队列系统,可以用于实现高吞吐量、低延迟的数据传输。Spring Boot是一个快速开发框架,可以帮助我们快速搭建应用程序。本文将介绍如何使用Spring Boot整合Kafka实现消息传输。 1. 添加依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.5.0.RELEASE</version> </dependency> ``` 2. 配置Kafka 在application.properties文件中添加以下配置: ``` spring.kafka.bootstrap-servers=localhost:9092 spring.kafka.consumer.group-id=my-group ``` 其中,bootstrap-servers指定Kafka的地址和端口,consumer.group-id指定消费者组的ID。 3. 发送消息 使用KafkaTemplate发送消息,示例代码如下: ``` @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) { kafkaTemplate.send(topic, message); } ``` 其中,topic指定消息发送到的主题,message是要发送的消息内容。 4. 接收消息 使用@KafkaListener注解监听消息,示例代码如下: ``` @KafkaListener(topics = "my-topic") public void receiveMessage(String message) { System.out.println("Received message: " + message); } ``` 其中,topics指定要监听的主题,receiveMessage方法会在收到消息时被调用。 5. 测试 使用JUnit测试发送和接收消息,示例代码如下: ``` @RunWith(SpringRunner.class) @SpringBootTest public class KafkaTest { @Autowired private KafkaProducer kafkaProducer; @Autowired private KafkaConsumer kafkaConsumer; @Test public void testSendAndReceiveMessage() throws InterruptedException { kafkaProducer.sendMessage("my-topic", "Hello, Kafka!"); Thread.sleep(1000); assertThat(kafkaConsumer.getMessages()).contains("Hello, Kafka!"); } } ``` 其中,kafkaProducerkafkaConsumer分别是发送和接收消息的类,testSendAndReceiveMessage方法测试发送和接收消息的功能。 以上就是使用Spring Boot整合Kafka实现消息传输的步骤。 ### 回答2: Spring Boot是一种流行的Java框架,用于构建可靠,可扩展和高效的应用程序。Kafka是一种分布式流处理平台,允许用户通过发布和订阅消息实现高吞吐量,低延迟的数据传输。将Spring Boot和Kafka整合是一种流行的做法,用于构建可靠的,可扩展的消息驱动应用程序。 为了将Spring Boot和Kafka进行集成,可以使用Spring Kafka。这是一个基于Spring Framework的库,使得使用Kafka变得容易。下面是Spring Boot使用Kafka的步骤: 1. 添加Spring Kafka依赖 要使用Spring Kafka,需要添加以下依赖项到pom.xml文件中: ``` <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.6.0</version> </dependency> ``` 2. 配置Kafka 为了让应用程序与Kafka进行通信,需要在application.yml或application.properties文件中配置Kafka连接信息: ``` spring.kafka.bootstrap-servers=localhost:9092 spring.kafka.consumer.auto-offset-reset=latest spring.kafka.consumer.group-id=testGroup ``` 3. 创建生产者 为了发布消息到Kafka主题,需要创建一个生产者。可以使用KafkaTemplate来完成此操作: ``` @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) { kafkaTemplate.send(topic, message); } ``` 4. 创建消费者 为了订阅Kafka主题并处理已接收到的消息,需要创建消费者。可以使用@KafkaListener注解来标记消费函数。使用Spring Framework提供的@Value注解,可以轻松获取配置值: ``` @KafkaListener(topics = "testTopic", groupId = "testGroup") public void consume(String message) { System.out.println("Received message: " + message); } ``` 5. 测试应用程序 完成上述步骤后,应用程序应该可以与Kafka通信。可以使用JUnit或其他测试框架来完成测试。 这里介绍了整合Spring Boot和Kafka的基本步骤,但是实际应用程序可能更加复杂,需要更多的代码和配置。但是,通过这个简单的示例,可以开始使用Spring Boot和Kafka构建可靠,可扩展的消息驱动应用程序。 ### 回答3: Spring Boot是一个基于Spring框架的Web应用开发框架,广受开发者欢迎。而Kafka是一个高吞吐量的分布式消息系统,由于其高可靠性和可扩展性,在大规模数据处理领域也得到了广泛应用。那么Spring Boot如何与Kafka结合使用呢?本文将介绍的是Spring Boot整合Kafka实战场景。 1. 准备工作 进入项目所在文件夹,打开命令行,输入以下命令: $mvn archetype:generate -DgroupId=com.springboot.kafka -DartifactId=springboot-kafka -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 这里使用Maven生成Spring Boot项目模板,生成的项目为springboot-kafka。 2. 添加Kafka依赖 在pom.xml文件中添加Kafka的依赖包,代码如下: <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>1.3.9.RELEASE</version> </dependency> 3. 配置Kafka 在application.yml文件中添加Kafka的配置信息,代码如下: spring: kafka: bootstrap-servers: localhost:9092 consumer: group-id: group01 auto-offset-reset: earliest producer: retries: 0 batch-size: 16384 linger-ms: 1 buffer-memory: 33554432 这里的bootstrap-servers为Kafka服务器地址,group-id为消费者组的ID,auto-offset-reset为消费者偏移量的重置方式,retries为失败重试的次数,batch-size和linger-ms为批量消息处理的参数,buffer-memory为Kafka缓存大小。 4. 创建消息生产者 在程序中创建消息生产者类,代码如下: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Service; @Service public class KafkaProducer { @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) { kafkaTemplate.send(topic, message); } } 这里使用Spring Boot的自动注入来注入KafkaTemplate,sendMessage方法用于发送消息。 5. 创建消息消费者 在程序中创建消息消费者类,代码如下: import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Component; @Component public class KafkaConsumer { @KafkaListener(topics = "test") public void listen(String message) { System.out.println("接收到消息:" + message); } } 使用@KafkaListener注解来创建消息监听器,当有消息到达时会触发被注解的方法。 6. 测试 在程序中创建测试类,代码如下: import com.springboot.kafka.KafkaProducer; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Scanner; @Service public class Test { @Autowired private KafkaProducer kafkaProducer; public void test() { System.out.println("请输入消息:"); Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String message = scanner.nextLine(); kafkaProducer.sendMessage("test", message); System.out.println("发送消息:" + message); } } } 执行test方法,输入消息后会发送消息到Kafka,同时也会在KafkaConsumer中打印出接收到的消息。 以上就是Spring Boot整合Kafka实战场景,希望对大家有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值