创建一个简单的 Go 项目来学习 RabbitMQ 的基本操作。我们将创建一个生产者和消费者的示例。
项目结构:
mq-demo/
├── docker-compose.yml
├── go.mod
├── producer/
│ └── main.go
└── consumer/
└── main.go
1. 创建项目并初始化*
mkdir mq-demo
cd mq-demo
go mod init mq-demo
go get github.com/streadway/amqp
2. 生产者代码 (producer/main.go)
`go:producer/main.go
package main
import (
"fmt"
"log"
"github.com/streadway/amqp"
)
func main() {
// 连接 RabbitMQ
conn, err := amqp.Dial("amqp://admin:admin@localhost:5672/")
if err != nil {
log.Fatalf("无法连接到 RabbitMQ: %v", err)
}
defer conn.Close()
// 创建通道
ch, err := conn.Channel()
if err != nil {
log.Fatalf("无法打开通道: %v", err)
}
defer ch.Close()
// 声明队列
q, err := ch.QueueDeclare(
"hello", // 队列名称
false, // 持久性
false, // 自动删除
false, // 排他性
false, // 非阻塞
nil, // 其他参数
)
if err != nil {
log.Fatalf("无法声明队列: %v", err)
}
// 发送消息
body := "Hello World!"
err = ch.Publish(
"", // exchange
q.Name, // routing key
false, // mandatory
false, // immediate
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(body),
})
if err != nil {
log.Fatalf("发送失败: %v", err)
}
fmt.Printf("发送消息: %s\n", body)
}
3. 消费者代码 (consumer/main.go)
go:consumer/main.go
package main
import (
"fmt"
"log"
"github.com/streadway/amqp"
)
func main() {
// 连接 RabbitMQ
conn, err := amqp.Dial("amqp://admin:admin@localhost:5672/")
if err != nil {
log.Fatalf("无法连接到 RabbitMQ: %v", err)
}
defer conn.Close()
// 创建通道
ch, err := conn.Channel()
if err != nil {
log.Fatalf("无法打开通道: %v", err)
}
defer ch.Close()
// 声明队列
q, err := ch.QueueDeclare(
"hello", // 队列名称
false, // 持久性
false, // 自动删除
false, // 排他性
false, // 非阻塞
nil, // 其他参数
)
if err != nil {
log.Fatalf("无法声明队列: %v", err)
}
// 接收消息
msgs, err := ch.Consume(
q.Name, // 队列
"", // 消费者
true, // 自动确认
false, // 排他性
false, // 非本地
false, // 非阻塞
nil, // 其他参数
)
if err != nil {
log.Fatalf("无法注册消费者: %v", err)
}
forever := make(chan bool)
go func() {
for d := range msgs {
fmt.Printf("收到消息: %s\n", d.Body)
}
}()
fmt.Println("等待消息中... 按 CTRL+C 退出")
<-forever
}
4. 使用方法
首先启动 RabbitMQ:
docker-compose up -d
然后在两个不同的终端窗口运行:
# 终端1:运行消费者
go run consumer/main.go
# 终端2:运行生产者
go run producer/main.go
运行结果
这个示例展示了 RabbitMQ 的基本概念:
- 连接(Connection)
- 通道(Channel)
- 队列(Queue)
- 生产者(Producer)
- 消费者(Consumer)
进阶学习建议:
1. 尝试使用不同的交换机类型(direct, fanout, topic)
2. 实现消息确认机制
3. 尝试消息持久化
4. 实现发布/订阅模式
5. 实现死信队列
6. 实现延迟队列