golang中的rabbitmq以及vhost示例详解

 更新时间:2026年04月02日 10:34:12   作者:ZG527  
Golang 中常用的 RabbitMQ 客户端库是 github.com/streadway/amqp,该库提供了完整的 AMQP 协议实现,支持连接管理、通道创建、消息发布和消费等核心功能,本文介绍golang中的rabbitmq以及vhost,感兴趣的朋友跟随小编一起看看吧

RabbitMQ 简介

RabbitMQ 是一个开源的消息代理软件,实现了高级消息队列协议(AMQP)。它支持多种消息传递模式,包括点对点、发布/订阅、路由和主题队列。RabbitMQ 的主要优势在于其可靠性、灵活性和跨语言支持,适用于分布式系统中的异步通信和解耦。

Golang 中的 RabbitMQ 客户端库

Golang 中常用的 RabbitMQ 客户端库是 github.com/streadway/amqp。该库提供了完整的 AMQP 协议实现,支持连接管理、通道创建、消息发布和消费等核心功能。

安装依赖:

go get github.com/streadway/amqp

连接 RabbitMQ

在 Golang 中,首先需要建立与 RabbitMQ 服务器的连接。连接是长期存在的资源,通常在整个应用程序生命周期中复用。

conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {
    log.Fatalf("Failed to connect to RabbitMQ: %v", err)
}
defer conn.Close()

创建通道

通道(Channel)是实际进行消息操作的轻量级连接。一个连接可以创建多个通道,但通道不是线程安全的,需确保每个 Goroutine 使用独立的通道。

ch, err := conn.Channel()
if err != nil {
    log.Fatalf("Failed to open a channel: %v", err)
}
defer ch.Close()

声明队列

队列是消息的存储单元,需要显式声明。声明时可以指定队列的属性,如是否持久化、是否自动删除等。

q, err := ch.QueueDeclare(
    "task_queue", // 队列名称
    true,         // 是否持久化
    false,        // 是否自动删除
    false,        // 是否独占
    false,        // 是否阻塞
    nil,          // 额外参数
)
if err != nil {
    log.Fatalf("Failed to declare a queue: %v", err)
}

发布消息

消息通过通道发布到指定队列。可以设置消息的持久化、优先级等属性。

body := "Hello, RabbitMQ!"
err = ch.Publish(
    "",     // 交换机名称(空字符串表示默认交换机)
    q.Name, // 路由键(队列名称)
    false,  // 是否强制路由
    false,  // 是否立即发送
    amqp.Publishing{
        DeliveryMode: amqp.Persistent, // 消息持久化
        ContentType:  "text/plain",
        Body:         []byte(body),
    },
)
if err != nil {
    log.Fatalf("Failed to publish a message: %v", err)
}

消费消息

消费者通过订阅队列接收消息。可以设置自动确认或手动确认模式。

msgs, err := ch.Consume(
    q.Name, // 队列名称
    "",     // 消费者标签
    false,  // 是否自动确认
    false,  // 是否独占
    false,  // 是否阻塞
    false,  // 额外参数
    nil,
)
if err != nil {
    log.Fatalf("Failed to register a consumer: %v", err)
}
forever := make(chan bool)
go func() {
    for d := range msgs {
        log.Printf("Received a message: %s", d.Body)
        d.Ack(false) // 手动确认消息
    }
}()
log.Printf("Waiting for messages...")
<-forever

交换机与绑定

RabbitMQ 支持多种交换机类型(直连、扇出、主题、头部),通过绑定规则将队列与交换机关联。

声明直连交换机并绑定队列:

err = ch.ExchangeDeclare(
    "logs_direct", // 交换机名称
    "direct",      // 交换机类型
    true,          // 是否持久化
    false,         // 是否自动删除
    false,         // 是否内部使用
    false,         // 是否阻塞
    nil,
)
if err != nil {
    log.Fatalf("Failed to declare an exchange: %v", err)
}
err = ch.QueueBind(
    q.Name,        // 队列名称
    "error",       // 路由键
    "logs_direct", // 交换机名称
    false,         // 是否阻塞
    nil,
)
if err != nil {
    log.Fatalf("Failed to bind a queue: %v", err)
}

消息确认与重试

手动确认模式下,消费者处理完消息后需显式调用 AckNackNack 可用于重试或死信队列场景。

for d := range msgs {
    if err := processMessage(d.Body); err != nil {
        d.Nack(false, true) // 拒绝消息并重新入队
    } else {
        d.Ack(false) // 确认消息
    }
}

连接管理与错误处理

RabbitMQ 连接可能因网络问题中断,需实现重连机制。可以通过监听 NotifyClose 事件实现自动恢复。

notifyClose := make(chan *amqp.Error)
ch.NotifyClose(notifyClose)
go func() {
    for err := range notifyClose {
        log.Printf("Channel closed: %v", err)
        // 实现重连逻辑
    }
}()

性能优化建议

  • 复用连接和通道,避免频繁创建和销毁。
  • 使用连接池管理多个通道。
  • 批量发布消息以减少网络开销。
  • 合理设置预取计数(QoS)以平衡负载。
err = ch.Qos(
    1,     // 预取计数
    0,     // 预取大小
    false, // 是否全局
)
if err != nil {
    log.Fatalf("Failed to set QoS: %v", err)
}

总结

RabbitMQ 在 Golang 中的使用涉及连接管理、队列声明、消息发布与消费等核心操作。通过合理设计交换机和绑定规则,可以实现灵活的消息路由。结合手动确认和错误处理机制,能够构建高可靠的异步消息系统。### 虚拟主机(VHost)简介
虚拟主机(Virtual Host)是RabbitMQ中用于逻辑隔离消息队列、交换机等资源的机制。通过VHost,可以在同一RabbitMQ实例中为不同应用或租户创建独立的环境,避免命名冲突和权限混乱。

VHost的核心功能

  • 资源隔离:每个VHost拥有独立的队列、交换机、绑定关系等。
  • 权限控制:可为不同用户分配特定VHost的读写权限。
  • 多租户支持:适合SaaS场景,不同租户使用不同VHost。

管理VHost的常用命令

通过RabbitMQ命令行工具或HTTP API管理VHost:

# 创建VHost
rabbitmqctl add_vhost /my_vhost
# 列出所有VHost
rabbitmqctl list_vhosts
# 删除VHost
rabbitmqctl delete_vhost /my_vhost

客户端连接VHost示例

在连接RabbitMQ时需指定VHost名称(默认VHost为/):

import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
    host='localhost',
    virtual_host='/my_vhost'
))

权限配置

为用户分配VHost权限(需先创建用户):

rabbitmqctl set_permissions -p /my_vhost username ".*" ".*" ".*"

参数说明:

  • ".*" 分别对应配置、读写、所有操作的权限正则表达式。

注意事项

  • 删除VHost会同时移除其下所有队列和交换机,需谨慎操作。
  • 生产环境建议为每个应用分配独立VHost,避免相互影响。

到此这篇关于golang中的rabbitmq以及vhost示例详解的文章就介绍到这了,更多相关golang rabbitmq及vhost内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go语言中时间戳格式化的方法

    go语言中时间戳格式化的方法

    这篇文章主要介绍了go语言中时间戳格式化的方法,涉及Go语言中time的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Go语言学习之golang-jwt/jwt的教程分享

    Go语言学习之golang-jwt/jwt的教程分享

    jwt是 json web token的简称。go使用jwt目前,主流使用的jwt库是golang-jwt/jwt。本文就来和大家讲讲golang-jwt/jwt的具体使用,需要的可以参考一下
    2023-01-01
  • 手把手带你走进Go语言之类型转换

    手把手带你走进Go语言之类型转换

    每个函数都可以强制将一个表达式转换成某种特定数据类型,本文给大家介绍了在Go语言中类型转换的具体用法,讲述的非常详细,对大家的学习或工作具有一定的参考借鉴价值
    2021-09-09
  • Go单元测试对GORM进行Mock测试

    Go单元测试对GORM进行Mock测试

    这篇文章主要为大家介绍了Go单元测试对GORM进行Mock测试用例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • linux中用shell快速安装配置Go语言的开发环境

    linux中用shell快速安装配置Go语言的开发环境

    相信每位开发者都知道选择一门开发语言,免不了需要安装配置开发环境,所以这篇文章给大家分享了linux下使用shell一键安装配置GO语言开发环境的方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-10-10
  • Go操作redis与redigo的示例解析

    Go操作redis与redigo的示例解析

    这篇文章主要为大家介绍了Go操作redis与redigo的示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Go 语言中切片的三种特殊状态

    Go 语言中切片的三种特殊状态

    我们今天要来讲一个非常细节的小知识,这个知识被大多数 Go 语言的开发者无视了,它就是切片的三种特殊状态 —— 「零切片」、「空切片」和「nil 切片」,感兴趣的朋友跟随小编一起看看吧
    2023-06-06
  • Go gRPC进阶教程gRPC转换HTTP

    Go gRPC进阶教程gRPC转换HTTP

    这篇文章主要为大家介绍了Go gRPC进阶教程gRPC转换HTTP教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go语言带缓冲的通道实现

    Go语言带缓冲的通道实现

    这篇文章主要介绍了Go语言带缓冲的通道实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Golang对struct字段重新排序优化数据结构性能实践

    Golang对struct字段重新排序优化数据结构性能实践

    这篇文章主要为大家介绍了Golang对struct字段重新排序优化数据结构性能实践,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论