虚拟主机 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 |
注意事项
- VHost创建后立即生效,无需重启服务
- 删除VHost会同时清除其下所有交换机、队列、绑定关系,操作不可逆
- 用户必须被授予VHost权限后才能连接,否则会报
ACCESS_REFUSED错误- VHost是逻辑隔离,不是物理隔离,所有VHost共享同一RabbitMQ进程的内存和CPU
- 管理插件中可通过顶部下拉框切换VHost查看资源
要点总结
- VHost是RabbitMQ的逻辑隔离单元,实现多租户资源共享
- 每个VHost拥有独立的命名空间,不同VHost可存在同名交换机和队列
- 通过
rabbitmqctl add_vhost创建,set_permissions授权用户访问 - Java Client通过
factory.setVirtualHost()或URL指定连接的VHost - VHost删除不可逆,会清除其下所有资源
文章存放路径:D:\git2\jwdev\articles\RABBITMQ\入门\核心概念入门\虚拟主机 VHost.md
📝 发现内容有误?点击此处直接编辑