IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring整合Kafka -> 正文阅读

[Java知识库]Spring整合Kafka

Spring整合Kafka

  • 采用Kafaka技术进行系统消息的发送,提高系统的性能

1、阻塞队列的使用

  • Kafaka也好还是其他的消息中间件也好都是框架,如果不使用这些框架使用BlockingQueue也可以解决消息系统的开发
  • 理解阻塞队列对理解Kafaka很有帮助
  • BlockingQueue
    • 解决线程通信的问题

    • 阻塞的方法有put、take

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GvGIAHWX-1653802458390)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E9%A1%B9%E7%9B%AE/image-20220528004651800.png)]

    • 生产的数据放在队列当中,当队列满的时候生产者线程就被阻塞住(什么都不做,不会消耗资源),等待消费者线程进行消费

    • 消费线程从队列当中拿数据进行消费,当数据非消费完了的时候,消费者线程被阻塞住,等待生产者线程进行生产

    • 阻塞队列的作用就是用来在两个线程之间,避免cpu资源的消耗,能够提高系统的性能。

  • 生产者消费者模式
    • 生产者:生产数据的线程
    • 消费者:使用数据的线程
  • 实现类
    • ArrayBlockingQueue
    • LinkedBlockingQueue
    • PrioriBlockingQueue、SynchronousQueue、DelayQueue等
  • 生产者消费者例子
/**
 * @Description: 阻塞队列测试
 * @Author:啵啵啵啵啵啵唧~~~
 * @Date:2022/5/28
 */
public class BlockingQueueTests {
    public static void main(String[] args) {
        //实例化一个阻塞队列给生产则和消费者共同使用
        BlockingQueue queue = new ArrayBlockingQueue(10);
        new Thread(new Producer(queue)).start();
        //多开几个消费者线程进行消费
        new Thread(new Consumer(queue)).start();
        new Thread(new Consumer(queue)).start();
        new Thread(new Consumer(queue)).start();
    }
}

/**
 * 生产者
 */
class Producer implements Runnable {
    private BlockingQueue<Integer> queue;

    public Producer(BlockingQueue<Integer> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        //模拟生产者生产数据,隔20ms放一个数据
        try {
            for (int i = 0; i < 100; i++) {
                Thread.sleep(20);
                queue.put(i);
                System.out.println(Thread.currentThread().getName() + "生产:" + queue.size());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/**
 * 消费者
 */
class Consumer implements Runnable {

    private BlockingQueue<Integer> queue;

    public Consumer(BlockingQueue<Integer> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        //模拟消费者,消费者是一直进行消费
        try {
            while (true) {
                //消费者消费给他模拟的时间是随机的0~1000,所以说消费者消费的时间大概率大于生产者生产的时间
                Thread.sleep(new Random().nextInt(1000));
                queue.take();
                System.out.println(Thread.currentThread().getName() + "消费了:" + queue.size());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2、Kafka入门

  • Kafka简介

    • Kafka是一个分布式的流媒体平台
    • 主要应用在消息系统、日志收集、用户行为跟踪、流式处理
  • Kafka特点(性能最好的消息队列)

    • 高吞吐量(对硬盘读取效率的高低,取决于读写方式的不同,对硬盘顺序读写性能很高,甚至高于对于内存的随机读取,Kafka利用对硬盘的顺序读写和硬盘存放数据多的特点既保证效率又保证了海量数据的处理)
    • 消息持久化(将消息永久存放在硬盘上,处理海量数据的前提)
    • 高可靠性(可以做集群部署,一台服务器挂了还有其他的服务器顶上,这样来保证他的可靠性)
    • 高扩展性(集群中服务器不够用了,想要添加一个服务器很方便)
  • Kafka术语

    • Broker(Kafka的服务器)、Zookeeper(能够用来管理其他的集群,Kafka的集群使用这个来进行管理)
    • Topic(文件夹用来存放消息的位置)、Partition(分区),Offset(消息的索引)
  • .

  • 下载Kafka解压之后进行一些配置

    • config目录下的zookeeper.properties进行配置[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aacQjEEK-1653802458393)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E9%A1%B9%E7%9B%AE/image-20220528014901651.png)]

    • server.properties配置[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mJsKajjp-1653802458395)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E9%A1%B9%E7%9B%AE/image-20220528015126404.png)]

  • 启动zookeeper(切换到kafka目录下)

bin\windows\zookeeper-server-start.bat config\zookeeper.properties
  • 启动kafka(切换到kafka目录下)
bin\windows\kafka-server-start.bat config\server.properties
  • 创建一个主题(主题代表一个分类、代表一个类型)
kafka-topics --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
  • 查看创建列表,看刚才创建的是否成功
kafka-topics.bat --list --bootstrap-server localhost:9092

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5VrYDcYE-1653802458396)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E9%A1%B9%E7%9B%AE/image-20220528123207366.png)]

  • 生产者发送消息
kafka-console-producer.bat --broker-list localhost:9092 --topic test

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sx4p0Ijh-1653802458397)(C:/Users/zhengbo/%E6%88%91%E7%9A%84%E5%AD%A6%E4%B9%A0/Typora%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E9%A1%B9%E7%9B%AE/image-20220528123510095.png)]

  • 创建新的窗口作为消费者读取消息
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning
  • zookeeper关闭命令(切记使用命令行停止、否则容易出事)
zookeeper-server-stop.bat
  • Kafka关闭命令
kafka-server-stop.bat

3、Spring整合Kafaka

  • 导入依赖

    • spring-kafka
    <dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka</artifactId>
        <version>2.2.7.RELEASE</version>
    </dependency>
    
  • 配置kafka

    • 配置server、consumer
    # Kafka配置
    spring.kafka.bootstrap-servers=localhost:9092
    spring.kafka.consumer.group-id=community-consumer-group
    #配置是否自动提交消费者的偏移量
    spring.kafka.consumer.enable-auto-commit=true
    #配置自动提交的频率
    spring.kafka.consumer.auto-commit-interval=3000
    
  • 访问kfka

    • 生产者

      • kafkaTemplate.send(topic, data)
    • 消费者

      • @KafkaListener(topics = {“test”})

      public void handleMessage(ConsumerRecord record) {}

  • 测试一下(记得启动kafak和zookeeper)

/**
 * @Description:
 * @Author:啵啵啵啵啵啵唧~~~
 * @Date:2022/5/28
 */
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class KafkaTests {
    @Autowired
    private KafkaProducer kafkaProducer;

    /**
     * 测试生产者生产者消息消费者是否能够消费掉
     */
    @Test
    public void testKafka() {
        kafkaProducer.sendMessage("test", "你好");
        kafkaProducer.sendMessage("test", "在吗");
        try {
            Thread.sleep(1000 * 10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

/**
 * 生产者发消息是主动去发送的
 */
@Component
class KafkaProducer {
    @Autowired
    private KafkaTemplate kafkaTemplate;

    /**
     * 发送消息
     *
     * @param topic 消息主题(分区)
     * @param content 消息的内容
     */
    public void sendMessage(String topic, String content) {
        kafkaTemplate.send(topic, content);
    }
}

/**
 * 消费者消费消息是被动去消费的
 */
@Component
class KafkaConsumer {
    //绑定需要监听的主题,只要有消息就调用handleMessage方法进行消费,没有消息就阻塞住
    @KafkaListener(topics = {"test"})
    public void handleMessage(ConsumerRecord record) {
        System.out.println(record.value());
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-06 17:11:36  更:2022-06-06 17:12:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:36:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码