全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-22 8 分钟 ✍️ juanwangdev

虚拟主机 VHost

虚拟主机是RabbitMQ的逻辑隔离单元,允许多个应用共享同一RabbitMQ实例而互不干扰。

基本概念

VHost提供资源隔离:

  • 每个VHost拥有独立的交换机、队列、绑定规则
  • 不同VHost间完全隔离,无法跨VHost路由消息
  • 同一VHost内名称必须唯一,不同VHost可存在同名队列
Bash
RabbitMQ Instance
├── VHost: /app1
│   ├── exchange_order
│   └── queue_orders
├── VHost: /app2
│   ├── exchange_order  (同名但独立)
│   └── queue_orders    (同名但独立)
└── VHost: / (默认)

创建与管理VHost

命令行操作:

Bash
# 创建VHost
rabbitmqctl add_vhost /app1

# 列出所有VHost
rabbitmqctl list_vhosts

# 删除VHost
rabbitmqctl delete_vhost /app1

权限设置:

XML
# 为用户授予VHost的读写配置权限
rabbitmqctl set_permissions -p /app1 myuser ".*" ".*" ".*"

# 查看VHost权限
rabbitmqctl list_permissions -p /app1

set_permissions 的三个正则表达式分别表示配置权限、写权限、读权限,".*" 表示所有操作都允许。

Java Client 示例

Maven依赖:

Java
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.18.0</version>
</dependency>

连接指定VHost:

Java
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class VHostExample {
    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("myuser");
        factory.setPassword("mypassword");

        // 设置虚拟主机(必须以 / 开头)
        factory.setVirtualHost("/app1");

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            // 在此VHost下声明队列
            channel.queueDeclare("app1_orders", true, false, false, null);
            System.out.println("已在 /app1 VHost下创建队列");
        }
    }
}

URL方式连接:

text
ConnectionFactory factory = new ConnectionFactory();
// 格式:amqp://username:password@host:port/vhost
factory.setUri("amqp://myuser:mypassword@localhost:5672/%2Fapp1");

// 注意:VHost中的 / 需要URL编码为 %2F

VHost名称必须以 / 开头,如 /app1/production,默认VHost为 /

使用场景

场景VHost方案
多项目共享RabbitMQ每个项目分配独立VHost
开发/测试/生产隔离分别创建 /dev/test/prod
多租户SaaS平台每个租户一个VHost

注意事项

  1. VHost创建后立即生效,无需重启服务
  2. 删除VHost会同时清除其下所有交换机、队列、绑定关系,操作不可逆
  3. 用户必须被授予VHost权限后才能连接,否则会报 ACCESS_REFUSED 错误
  4. VHost是逻辑隔离,不是物理隔离,所有VHost共享同一RabbitMQ进程的内存和CPU
  5. 管理插件中可通过顶部下拉框切换VHost查看资源

要点总结

  • VHost是RabbitMQ的逻辑隔离单元,实现多租户资源共享
  • 每个VHost拥有独立的命名空间,不同VHost可存在同名交换机和队列
  • 通过 rabbitmqctl add_vhost 创建,set_permissions 授权用户访问
  • Java Client通过 factory.setVirtualHost() 或URL指定连接的VHost
  • VHost删除不可逆,会清除其下所有资源

文章存放路径:D:\git2\jwdev\articles\RABBITMQ\入门\核心概念入门\虚拟主机 VHost.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 绑定 Binding
下一篇 → 路由键 Routing Key
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库