在 Go 语言中实现 RabbitMQ 的发布 / 订阅模式(也称为 Pub/Sub 模式),你可以通过 `gopkg.in/amqp.v4` 这个包来进行。以下是基本的实验步骤:
1. **安装依赖**:
首先,你需要在项目中添加 amqp 包的依赖,可以使用 `go get gopkg.in/amqp.v4` 或者将 `"github.com/gotek/gomq/v4"` 添加到你的 `go.mod` 文件。
2. **创建连接**:
使用 `amqp.NewConnection()` 创建一个新的连接,传入 AMQP 服务器地址、用户名、密码等信息。例如:
```go
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {
// 处理错误
}
defer conn.Close()
```
3. **声明交换机和队列**:
发布者需要声明一个主题(exchange),订阅者则声明一个接收消息的队列。例如:
```go
exchangeName := "topic_logs"
queueName := "my_logs_queue"
_, err = conn.ExchangeDeclare(
exchangeName,
"topic", // 类型,这里使用 topic 类型支持多关键字过滤
true, // 是否持久化
false, // 是否自动删除
false, // 是否内部只消费
false, // 是否立即绑定
nil, // 路由键
)
queue, _ := conn.QueueDeclare(
queueName, // 队列名
false, // 是否持久化
false, // 是否独占
false, // 当队列满了是否丢弃
0, // 队列长度
nil, // 集群路由键
)
```
4. **发布消息** (发布者):
对于每条要发布的消息,创建一个 `Message` 对象并设置其内容、路由键等信息。然后使用 `conn.Publish()` 方法发布:
```go
message := amqp.Message{
Body: []byte("This is a log message"),
RoutingKey: "app.error",
}
err = conn.ExchangePublish(
exchangeName, // 出发点
"", // 目的地(默认为 exchangeName)
message.RoutingKey, // 路由键
amqp.Publishing{ // 消息详情
DeliveryMode: amqp.Persistent, // 是否持久化消息
Headers: map[string]interface{}{"foo": "bar"}, // 可选头部信息
},
)
```
5. **订阅消息** (订阅者):
创建一个消费者并监听特定队列,当有新消息到来时执行回调函数:
```go
consumer, err := conn.Consume(queue.Name, "", false, false, false, false, nil)
if err != nil {
// 处理错误
}
defer func() { _ = consumer.Cancel() }()
for msg := range consumer.C Delivered {
fmt.Printf("Received message %s\n", string(msg.Body))
// 处理接收到的消息
}
```
6. **关闭连接**:
完成操作后记得关闭连接释放资源。