从零学 spring cloud第5-3课:中间件之消息队列kafka

本文深入探讨了Apache Kafka,一种高吞吐量的分布式发布订阅消息系统,详细介绍了其架构、特性和安装步骤。Kafka支持消息的持久化、高吞吐量处理,并能通过集群提供实时消息服务。文章还提供了从创建Topic到测试消息发送和接收的完整过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    项目的DEMO代码:https://github.com/heyu52/-spring-cloud
    以下介绍来自百度百科
    Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。

特性
Kafka 是一种高吞吐量的分布式发布订阅消息系统,有如下特性:

  • 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
  • 高吞吐量 :即使是非常普通的硬件Kafka也可以支持每秒数百万 的消息。
  • 支持通过Kafka服务器和消费机集群来分区消息。
  • 支持Hadoop并行数据加载。
  • 可扩展性:kafka集群支持热扩展

术语介绍

  • Broker
    Kafka集群包含一个或多个服务器,这种服务器被称为broker
  • Topic
    每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)
  • Partition
    Partition是物理上的概念,每个Topic包含一个或多个Partition
  • Producer
    负责发布消息到Kafka broker
  • Consumer
    消息消费者,向Kafka broker读取消息的客户端。
  • Consumer Group
    每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。

安装zookeeper
kafka是依赖于zookeeper的,所以,我们要先安装zookeeper:https://hub.docker.com/_/zookeeper

docker pull zookeeper

启动zookeeper

docker run --name some-zookeeper  -p 2181:2181  --restart always -d zookeeper

安装kafak
kafak没有官方的docker镜像,我们直接下载安装就好了:http://kafka.apache.org/quickstart
具体的安装及测试,请参考这个地址就可以了。

下载解压

tar -xzf kafka_2.12-2.3.0.tgz
cd kafka_2.12-2.3.0

启动服务

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

创建Topic
新打开一个终端

bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test

查看Topic

bin/kafka-topics.sh --list --bootstrap-server localhost:9092

在这里插入图片描述
启动成功

测试发送消息

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

输入两个消息

This is a message
This is another message

消费消息

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

在这里插入图片描述
测试成功。

添加端口开放

添加指定需要开放的端口:
firewall-cmd --add-port=9092/tcp --permanent
重载入添加的端口:
firewall-cmd --reload
查询指定端口是否开启成功:
firewall-cmd --query-port=9092/tcp

查看GroupID
打开config目录下的consumer.properties
在这里插入图片描述
IP配置
打开打开config目录下的server.properties,按以下修改为本机IP
在这里插入图片描述

创建项目
在这里插入图片描述
创建消息发送者

package com.csdn.demo.Sender;

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

import javax.annotation.Resource;

@Component
public class MySender {

    @Resource
    KafkaTemplate kafkaTemplate;
    public void send() {
        //发送消息
        String msgKey="msgkey";
        String message="消息内容";
        kafkaTemplate.send("test", 0,msgKey,message);
        System.out.println( "这是发送的消息:"+message);
    }
}

创建消息接收者

package com.csdn.demo.Receiver;

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

@Component
public class MyReceiver {

    @KafkaListener(topics = {"test"})
    public void registryReceiver(ConsumerRecord<Integer, String> integerStringConsumerRecords) {
        System.out.println( "这是接收到的消息:"+ integerStringConsumerRecords.value());
    }
}

@KafkaListener(topics = {“test”})参看前面创建的Topic

创建测试Controller

package com.csdn.demo.Web;

import com.csdn.demo.Sender.MySender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @Autowired
    private MySender sender;

    @RequestMapping("/mySend")
    public void mySend() throws Exception {
        sender.send();
    }
}

配置

#kafka默认消费者配置
spring.kafka.consumer.bootstrap-servers=192.168.0.123:9092
#参看查看GroupID
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
spring.kafka.consumer.properties.max.partition.fetch.bytes=2097152

#kafka默认生产者配置
spring.kafka.producer.bootstrap-servers=192.168.0.123:9092
spring.kafka.producer.retries=1
spring.kafka.producer.batch-size=16384
spring.kafka.producer.buffer-memory=33554432
spring.kafka.producer.properties.max.requst.size=2097152
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer

测试
浏览器输入地址:http://127.0.0.1:8080/mySend
在这里插入图片描述
测试成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值