今天:
我们不讲复杂理论。
直接:
从:
txt
启动 Kafka
↓
创建 Topic
↓
发送消息
↓
消费消息
完整走一遍。
你学完:
至少会:
txt
真正把 Kafka 跑起来
一、Kafka 整个流程图(先建立概念)
Kafka 最核心流程:
txt
生产者(发消息)
↓
Topic(存消息)
↓
消费者(读消息)
例如:
txt
Go程序
↓
发送 "hello"
↓
Kafka保存
↓
另一个Go程序读取
二、第一步:安装 Docker
因为:
现在:
Kafka 一般都用 Docker 跑。
先测试:
bash
docker -v
如果:
输出:
txt
Docker version xxx
说明 Docker 正常。
三、第二步:下载 Kafka 镜像
bash
docker pull bitnami/kafka
四、什么是镜像
镜像:
你可以理解成:
txt
Kafka 安装包
五、第三步:启动 Kafka 容器(重点)
执行:
bash
docker run -d \
--name kafka \
-p 9092:9092 \
-e KAFKA_CFG_NODE_ID=1 \
-e KAFKA_CFG_PROCESS_ROLES=broker,controller \
-e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \
-e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@localhost:9093 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
bitnami/kafka
六、这里到底发生了什么
Docker:
会:
txt
创建 Kafka 容器
↓
启动 Kafka 服务
七、查看 Kafka 是否启动成功
bash
docker ps
如果看到:
txt
kafka
说明成功。
八、9092 是什么
Kafka 默认端口:
txt
9092
以后:
Go 程序:
连接:
txt
localhost:9092
就是连接 Kafka。
九、第四步:创建 Topic(重点)
Kafka:
消息必须放进:
txt
Topic
里面。
十、Topic 是什么
Topic:
你可以理解成:
txt
消息分类
例如:
txt
订单消息
日志消息
用户消息
十一、创建 Topic
执行:
bash
docker exec -it kafka kafka-topics.sh \
--create \
--topic order-topic \
--bootstrap-server localhost:9092
十二、命令详细解析
docker exec
txt
进入容器执行命令
kafka-topics.sh
Kafka Topic 管理工具。
--create
表示:
txt
创建 Topic
--topic order-topic
Topic 名字:
txt
order-topic
--bootstrap-server
连接 Kafka。
十三、查看 Topic
执行:
bash
docker exec -it kafka kafka-topics.sh \
--list \
--bootstrap-server localhost:9092
十四、如果看到
txt
order-topic
说明:
Topic 创建成功。
十五、第五步:发送消息(Producer)
现在:
开始发消息。
十六、启动生产者
执行:
bash
docker exec -it kafka kafka-console-producer.sh \
--topic order-topic \
--bootstrap-server localhost:9092
十七、现在终端会卡住
这是正常的。
因为:
Kafka:
正在等待:
txt
你输入消息
十八、输入消息
例如:
txt
hello
回车。
再输入:
txt
world
十九、这些消息去哪了
Kafka:
已经:
txt
存进 order-topic
了。
二十、第六步:消费消息(Consumer)
再开一个终端。
二十一、启动消费者
执行:
bash
docker exec -it kafka kafka-console-consumer.sh \
--topic order-topic \
--from-beginning \
--bootstrap-server localhost:9092
二十二、会发生什么
终端:
会打印:
txt
hello
world
二十三、完整流程(重点)
你现在:
已经真正完成:
txt
生产者
↓
发送消息
↓
Kafka Topic
↓
消费者读取
这就是:
Kafka 最核心流程。
二十四、为什么生产者和消费者是两个终端
因为:
真实项目:
它们本来:
就是:
txt
两个不同程序
例如:
订单系统
负责:
txt
发送消息
库存系统
负责:
txt
读取消息
二十五、第七步:Go 操作 Kafka
真正开发:
不会手敲命令。
而是:
txt
Go代码操作Kafka
二十六、安装 Go Kafka 库
bash
go get github.com/segmentio/kafka-go
二十七、Go 发送消息(生产者)
producer.go
go
package main
import (
"context"
"fmt"
"github.com/segmentio/kafka-go"
)
func main() {
// 创建生产者
w := kafka.NewWriter(kafka.WriterConfig{
Brokers: []string{"localhost:9092"},
Topic: "order-topic",
})
// 发消息
err := w.WriteMessages(context.Background(),
kafka.Message{
Value: []byte("hello kafka"),
},
)
if err != nil {
panic(err)
}
fmt.Println("发送成功")
}
二十八、运行生产者
bash
go run producer.go
二十九、Kafka 里已经有消息了
现在:
消费者:
就能读到。
三十、Go 消费消息(消费者)
consumer.go
go
package main
import (
"context"
"fmt"
"github.com/segmentio/kafka-go"
)
func main() {
// 创建消费者
r := kafka.NewReader(kafka.ReaderConfig{
Brokers: []string{"localhost:9092"},
Topic: "order-topic",
GroupID: "g1",
})
for {
// 读取消息
msg, err := r.ReadMessage(context.Background())
if err != nil {
panic(err)
}
fmt.Println(string(msg.Value))
}
}
三十一、运行消费者
bash
go run consumer.go
三十二、消费者会打印
txt
hello kafka
三十三、现在你已经真正会 Kafka 了
你已经掌握:
Kafka 启动
bash
docker run
创建 Topic
bash
kafka-topics.sh
发送消息
bash
kafka-console-producer.sh
或者:
go
WriteMessages()
消费消息
bash
kafka-console-consumer.sh
或者:
go
ReadMessage()
三十四、真实项目中的 Kafka 流程
真实开发:
最经典:
就是:
用户下单
订单服务:
txt
发 Kafka 消息
Kafka
负责:
txt
存消息
其他服务
消费:
- 库存
- 短信
- 推荐
- 邮件
三十五、Kafka 为什么重要
因为:
现代后端:
越来越:
txt
微服务化
系统之间:
不再:
txt
直接调用
而是:
txt
通过 Kafka 通信
三十六、最后一句总结(必须记住)
Kafka 最核心操作流程:
txt
启动 Kafka
↓
创建 Topic
↓
Producer 发消息
↓
Topic 存消息
↓
Consumer 读消息
真正重要:
先掌握:
txt
发
收
别一开始:
研究:
txt
Partition
Offset
副本机制
容易直接劝退。