项目简介
使用 RabbitMQ 的 Go 客户端库 github.com/streadway/amqp 来连接到 RabbitMQ 并进行消息传递。它演示了 RabbitMQ 的基本功能,包括声明队列、发布消息和消费消息等。
关于RabbitMQ
RabbitMQ 是一种开源消息代理和消息队列系统,它实现了高级消息队列协议(AMQP),可以通过多种编程语言(包括 Golang、Java、Python、Ruby 等)来与之交互。
RabbitMQ 基于 Erlang 编写,拥有很高的可扩展性和高可用性,可以处理大量的消息,并支持多种消息传递模式,包括点对点、发布-订阅、请求-应答等。
使用 RabbitMQ,您可以轻松地将不同的应用程序和系统连接在一起,实现松耦合的系统架构,并提供了消息传递和异步通信的优秀解决方案。同时,RabbitMQ 也支持消息持久化、消息确认、消息路由和消息过滤等高级特性,可以满足不同场景下的需求。
总的来说,RabbitMQ 是一个功能强大、可靠性高、易于使用的消息代理和消息队列系统,是构建可靠、高性能、分布式系统的理想选择。
项目目录
项目代码
- producer.go
package main
import (
"fmt"
"log"
"github.com/streadway/amqp"
)
func main() {
// Connect to RabbitMQ
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {
log.Fatal("Error connecting to RabbitMQ", err)
}
defer conn.Close()
// Create a channel
ch, err := conn.Channel()
if err != nil {
log.Fatal("Error creating channel", err)
}
defer ch.Close()
// Declare a queue
q, err := ch.QueueDeclare(
"test-queue", // Queue name
false, // Durable
false, // Delete when unused
false, // Exclusive
false, // No-wait
nil, // Arguments
)
if err != nil {
log.Fatal("Error declaring queue", err)
}
// Publish messages to the queue
for i := 0; i < 10; i++ {
message := fmt.Sprintf("Hello, World! %d", i)
err := ch.Publish(
"", // Exchange
q.Name, // Routing key
false, // Mandatory
false, // Immediate
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(message),
},
)
if err != nil {
log.Fatal("Error publishing message", err)
}
}
fmt.Println("Messages published successfully!")
}
- consumer.go
package main
import (
"fmt"
"log"
"github.com/streadway/amqp"
)
func main() {
// Connect to RabbitMQ
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {
log.Fatal("Error connecting to RabbitMQ", err)
}
defer conn.Close()
// Create a channel
ch, err := conn.Channel()
if err != nil {
log.Fatal("Error creating channel", err)
}
defer ch.Close()
// Declare a queue
q, err := ch.QueueDeclare(
"test-queue", // Queue name
false, // Durable
false, // Delete when unused
false, // Exclusive
false, // No-wait
nil, // Arguments
)
if err != nil {
log.Fatal("Error declaring queue", err)
}
// Consume messages from the queue
msgs, err := ch.Consume(
q.Name, // Queue name
"", // Consumer name
true, // Auto-acknowledge
false, // Exclusive
false, // No-local
false, // No-wait
nil, // Arguments
)
if err != nil {
log.Fatal("Error consuming messages", err)
}
// Read messages from the channel
for msg := range msgs {
fmt.Println("Received message:", string(msg.Body))
}
}
项目运行效果
- producer.go
- consumer.go
- RabbitMQ web