springboot+kafka整合(环境:IntelliJ IDEA)

(一)kafka

springboot+kafka整合(环境:IntelliJ IDEA)_第1张图片

producer:生产者,负责发布消息到kafka cluster(kafka集群)中。生产者可以是web前端产生的page view,或者是服务器日志,系统CPU、memory等。

consumer:消费者,每个consumer属于一个特定的consuer group(可为每个consumer指定group name,若不指定group name则属于默认的group)。创建消费者时,要指定消费者接受的消息的topic,该消费者只会接受该topic的消息。

topic:每条发布到Kafka集群的消息都有一个类别,这个类别被称为topic。(物理上不同topic的消息分开存储,逻辑上一个topic的消息虽然保存于一个或多个broker上但用户只需指定消息的topic即可生产或消费数据而不必关心数据存于何处)。

broker:kafka集群包含一个或多个服务器,这些服务器就叫做broker。

 

(二)kafka本机测试(在虚拟机Ubuntu(服务器)):

在用IntelliJ 编写Java代码前,先要在服务器启动kafka和自带的zookeeper,本文在虚拟机上启动。

kafka下载:从官网下载 kafka_2.12-2.1.0.tgz,解压在虚拟机(服务器)上。

进入到kafka的解压目录:

输入命令启动zookeeper:

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

打开另一个终端输入命令启动kafka:

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

接下来我们就可以用尝试用命令创建生产者和消费者了(当然是用来给我们看一下效果用的):

再打开另一个终端输入命令创建生产者:

 bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test_topic

broker-list 参数指定生产者所使用的broker

localhost:9092 参数表示broker,这个broker为本机(127.0.0.1),且使用的端口是kafka的默认端口号是9092

topic 参数表示生产者生产的消息的topic 为 “test_topic”

最后再打开另一个终端创建消费者:

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test_topic --from-beginning

bootstrap-server 是指定consumer从哪里(broker)取出消息

topic 指定消费者consumer取出的 topic 为“test_topic”的消息。

from-beginning:Kafka实际环境有可能会出现Consumer全部宕机,虽然基于Kafka的高可用特性,消费者群组中的消费者可以实现再均衡,所有Consumer不处理数据的情况很少,但是还是有可能会出现,此时就要求Consumer重启的时候能够读取在宕机期间Producer发送的数据。基于消费者订阅模式默认是无法实现的,因为只能订阅最新发送的数据。通过消费者命令行可以实现,只要在命令行中加上--from-beginning即可

效果
springboot+kafka整合(环境:IntelliJ IDEA)_第2张图片

创建生产者和消费者:

springboot+kafka整合(环境:IntelliJ IDEA)_第3张图片

通过输入者输入消息,生产者会显示消息:

springboot+kafka整合(环境:IntelliJ IDEA)_第4张图片

 

(三)用Java创建生产者和消费者:

在虚拟机(服务器)上 运行了kafka和kafka自带的zookeeper之后,就可以编写Java代码来创建生产者和消费者了:

若是在windows上使用intelli编程,首先要保证本机和虚拟机之间能ping通(确保网段一样192.168.x.x),同理kafka要是部署在服务器的话,本机就 要和服务器之间能ping通。

创建springboot项目:

springboot+kafka整合(环境:IntelliJ IDEA)_第5张图片

选择web 和 kafka:

springboot+kafka整合(环境:IntelliJ IDEA)_第6张图片

最终的项目目录树:(红色框的是要的动手做的部分)

springboot+kafka整合(环境:IntelliJ IDEA)_第7张图片

配置文件application.yml:(一般项目自动生成的是applicaiton.properties,但为了书写简便,改成yml)

spring:
  kafka:
    bootstrap-servers: 192.168.153.131:9092 #服务器的ip及端口,可以写多个,服务器之间用“:”间隔
    producer: #生产者配置
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    consumer: #消费者配置
      group-id: test #设置消费者的组id
      enable-auto-commit: true
      auto-commit-interval: 1000
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

DemoApplication.java:(java的入口程序,最后是运行这个程序)

package com.example.demo;

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

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

TestKafkaProducerController.java:(生产者)

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController     //定义这是一个控制器,可以通过浏览器访问
@RequestMapping("kafka")
public class TestKafkaProducerController {

    @Autowired
//    定义一个kafka模板
    private KafkaTemplate kafkaTemplate; //这里会报错,但不影响
//当在浏览器上输入http://localhost:8080/kafka/send?msg=abc,就会发送abc到服务器上去让消费者接收,msg对应下面的String msg
    @RequestMapping("send")
    public String send(String msg){
        kafkaTemplate.send("test_topic", msg); //使用kafka模板发送信息
        return "success";
    }
}

TestConsumer.java:

package com.example.demo;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;


@Component
public class TestConsumer {

    @KafkaListener(topics = "test_topic") //定义此消费者接收topic为“test_topic”的消息
//    监听服务器上的kafka是否有相关的消息发过来
//    record变量代表消息本身,可以通过ConsumerRecord类型的record变量来打印接收的消息的各种信息
    public void listen (ConsumerRecord record) throws Exception {
        System.out.printf("topic = %s, offset = %d, value = %s \n", record.topic(), record.offset(), record.value());
    }
}

 

(四)运行效果:

【1】运行IntelliJ上的DemoApplication之后,在虚拟机(服务器)上输入hi时,不仅虚拟机上运行的测试消费者能收到,windows上的IntelliJ程序也能收到

springboot+kafka整合(环境:IntelliJ IDEA)_第8张图片

springboot+kafka整合(环境:IntelliJ IDEA)_第9张图片

【2】在浏览器上输入http://localhost:8080/kafka/send?msg=world,不仅intelliJ上的消费者能收到,在虚拟机(服务器)上运行的测试消费者也能收到:(其中8080是tomcat服务器的端口,springboot默认下带的是tomcat)

springboot+kafka整合(环境:IntelliJ IDEA)_第10张图片

intelliJ上的效果:

springboot+kafka整合(环境:IntelliJ IDEA)_第11张图片

虚拟机(服务器)上的效果:

springboot+kafka整合(环境:IntelliJ IDEA)_第12张图片

===========================

最后显示一下pom.xml,这个文件一般都自动生成,用来显示项目的依赖,我给出来的原因是给大家参考一下,因为有时候代码一样,但环境错了也会导致运行不了:



    4.0.0

    com.example
    demo
    0.0.1-SNAPSHOT
    jar

    demo
    Demo project for Spring Boot

    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.0.RELEASE
         
    

    
        UTF-8
        UTF-8
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.kafka
            spring-kafka
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            org.springframework.kafka
            spring-kafka-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    
    

项目代码下载:https://github.com/zhujunwen/springboot-kafka

你可能感兴趣的:(#,Spring,Boot)