SpringBoot整合Kafka消息中间件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chen18677338530/article/details/91413760

kafka

Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。

主要应用场景是:日志收集系统和消息系统。

Kafka主要设计目标如下:

  • 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
  • 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
  • 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
  • 支持离线数据处理和实时数据处理。
  • Scale out:支持在线水平扩展

更多参考 https://www.cnblogs.com/qingyunzong/p/9004509.html

docker搭建kafka环境

  1. 启动zookeep

    docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
    
  2. 启动kafka

    docker run  -d --name kafka \
    -p 9092:9092 \
    -e KAFKA_BROKER_ID=0 \ 
    -e KAFKA_ZOOKEEPER_CONNECT=192.168.75.50:2181 \ 
    -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.75.50:9092 \
    -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka 
    
  3. 集群搭建(可选)

    docker run -d --name kafka1 \
    -p 9093:9093 \
    -e KAFKA_BROKER_ID=1 \
    -e KAFKA_ZOOKEEPER_CONNECT=192.168.75.50:2181 \
    -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.75.50:9093 \
    -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9093 -t wurstmeister/kafka
    
  4. 可视化界面查看

    docker run -it -d  -p 9000:9000 -e ZK_HOSTS="192.168.75.50:2181" --net=host sheepkiller/kafka-manager
    

    在这里插入图片描述

springboot整合kafka

  1. 使用idea新建springboot工程

  2. 修改pom文件

    <?xml version="1.0" encoding="UTF-8"?>
    <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>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.5.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.chen</groupId>
        <artifactId>springboot-kafka</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>springboot-kafka</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.kafka</groupId>
                <artifactId>spring-kafka</artifactId>
            </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-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    
  3. 修改application.yml配置文件

    # kafka
    spring:
      kafka:
        bootstrap-servers: 192.168.75.50:9092
        consumer:
          group-id: myGroup
    
  4. 创建消息提供者

    package com.chen.springbootkafka;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.junit.runner.Runner;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.kafka.core.KafkaTemplate;
    import org.springframework.kafka.support.SendResult;
    import org.springframework.messaging.support.GenericMessage;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.util.concurrent.ListenableFuture;
    import org.springframework.util.concurrent.ListenableFutureCallback;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class SendMsg {
    
        @Autowired
        private KafkaTemplate kafkaTemplate;
    
        @Test
        public void sendMq(){
    
            try {
                ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send("test","luoye", "hello kafka");
                future.addCallback(new ListenableFutureCallback<SendResult< String, String >>() {
                    @Override
                    public void onSuccess(SendResult<String, String> result) {
                        System.out.println(result.toString());
                        System.out.println("推送消息成功");
                    }
    
                    @Override
                    public void onFailure(Throwable throwable) {
                        System.out.println("推送消息失败");
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    
    
  5. 创建消息消费者

    package com.chen.springbootkafka;
    
    import org.apache.kafka.clients.consumer.ConsumerRecord;
    import org.springframework.kafka.annotation.KafkaListener;
    import org.springframework.stereotype.Component;
    
    @Component
    public class ReviceMq {
    
    
        @KafkaListener(topics = {"test"})
        public void listen(ConsumerRecord record){
            System.out.println(record.key());
            System.out.println(record.value());
        }
    }
    
    

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/chen18677338530/article/details/91413760