RabbitMQ应用(基于腾讯云)
1.防火墙配置
关于RabbitMQ的远程,主要有4个端口需要开通【入站规则】,分别是:
- 端口 5672:这是 RabbitMQ 的默认 AMQP(Advanced Message Queuing Protocol)端口,用于客户端与 RabbitMQ 服务器之间建立连接并进行消息传递。AMQP 是一种高级消息队列协议,客户端通过这个端口发送和接收消息,实现应用程序之间的异步通信。许多编程语言的 RabbitMQ 客户端库默认使用此端口来连接服务器。
- 端口 15762:这个端口通常是 RabbitMQ Management 插件使用的 HTTPS 端口。通过该端口,用户可以通过浏览器访问 RabbitMQ 的管理界面,以可视化的方式管理和监控 RabbitMQ 服务器,包括查看队列、交换机、绑定关系、连接信息、消息统计等,还可以进行用户管理、权限设置等操作。如果启用了 SSL/TLS 加密,那么与管理界面的安全连接就会使用这个端口。
- 端口 25762:一般情况下,RabbitMQ 本身不会直接使用这个端口。可能是在某些特定的部署场景中,被其他与 RabbitMQ 相关的工具、插件或自定义应用程序所使用,用于特定的功能扩展或与外部系统的交互,但这不是 RabbitMQ 的标准端口用途。
- 端口 4396:同样,这个端口也不是 RabbitMQ 的标准端口。它可能是在特定的网络环境或自定义配置中,被用于与其他服务或应用程序进行通信,或者是被误配置为 RabbitMQ 相关的端口,但在默认的 RabbitMQ 功能中,没有明确指定该端口的特定用途。
需要注意的是,虽然 5672 和 15762 端口是 RabbitMQ 较为常见和标准的端口,但在实际部署中,管理员可以根据需求和安全策略对端口进行自定义配置。而对于非标准端口,如 25762 和 4396,需要根据具体的应用场景和配置来确定其确切用途,如果在 RabbitMQ 环境中发现这些端口被使用,应检查相关的配置和日志,以了解其作用和是否存在潜在的安全风险。
端口配置案例:
2.安全组配置
3. 配置 RabbitMQ 以允许远程连接
默认情况下,RabbitMQ 仅允许本地连接。你需要修改rabbitmq.conf
文件来允许远程连接。该文件通常位于/etc/rabbitmq/
目录下,如果没有,则可以直接新建
打开rabbitmq.conf
文件,添加或修改以下配置:
plaintext
loopback_users.guest = false
listeners.tcp.default = 5672
4.修复节点名称配置
配置rabbitmq-env.conf
5.测试端口
以上可以采用telnet的方式进行测试
telnet <您的服务器IP> 5672 # AMQP端口
curl http://<您的服务器IP>:15672 # 管理界面(需返回HTML)
6.配置远程登陆用户
7.配置后即可登录
8.配置VirtulHost
在 RabbitMQ 中,Virtual Host(虚拟主机,简称 vhost )是一种逻辑隔离机制,用于在同一个 RabbitMQ 实例中创建多个独立的环境,类似于在一台物理服务器上运行多个虚拟服务器。它有以下作用:
实现多租户隔离
在同一台 RabbitMQ 实例中,可运行多个逻辑上相互隔离的环境。不同租户(比如不同应用、团队等 )使用各自的虚拟主机。每个虚拟主机拥有独立的队列、交换器、绑定关系 ,避免不同应用或系统之间互相干扰。例如,多个业务线共用一个 RabbitMQ 实例,通过虚拟主机实现各业务线消息通信的隔离。
便于权限管理
能为每个虚拟主机设置独立的用户权限。可对不同用户赋予访问特定虚拟主机的权限,限制其只能在该虚拟主机内创建或操作队列、交换器等资源,增强系统安全性。比如,只允许某个用户在特定虚拟主机中发送消息,但不允许其创建队列。
实现资源隔离
各虚拟主机内的队列、交换器和绑定关系相互独立,不会与其他虚拟主机混淆,确保不同应用的消息资源不会相互干扰、误用。
独立管理和监控
每个虚拟主机的队列、交换器等资源都能独立监控和管理。管理员可分别对不同虚拟主机进行配置、优化,而不影响其他虚拟主机。例如,针对开发、测试、生产等不同环境的虚拟主机,分别调整消息队列的参数。
适用不同使用场景
-
隔离不同应用:当有多个应用使用 RabbitMQ,且应用间不相关或不能互相影响时,为每个应用创建单独虚拟主机。如一个企业的订单系统、库存系统分别使用不同虚拟主机。
-
分配给不同团队:大型组织中,不同团队共享 RabbitMQ 实例,为各团队创建独立虚拟主机,保障其队列、交换器等资源互不干扰。
-
环境分离:将开发、测试和生产等环境通过虚拟主机进行逻辑隔离,各环境使用自己的虚拟主机,确保不同阶段的消息交互不会相互影响。
9.C#代码案例-生产者
public static void SendMessage(){var factory = new ConnectionFactory(){HostName = "40.161.118.219", // 替换为腾讯云轻量服务器公网IPPort = 5672, // RabbitMQ 默认端口UserName = "admin", // 替换为实际用户名Password = "admin123", // 替换为实际密码VirtualHost = "my_vhost", // 默认虚拟主机// 如需SSL加密,添加以下配置:// Ssl = new SslOption { Enabled = true, ServerName = "你的服务器IP" }};using (var connection = factory.CreateConnection())using (var channel = connection.CreateModel()){// 声明队列(如果不存在则创建)channel.QueueDeclare(queue: "hello2",durable: false, // 是否持久化exclusive: false,autoDelete: false,arguments: null);// 发送消息string message = "Hello RabbitMQ from .NET 7!";var body = Encoding.UTF8.GetBytes(message);channel.BasicPublish(exchange: "",routingKey: "hello",basicProperties: null,body: body);Console.WriteLine($" [x] Sent: {message}");}}
10.C#代码案例-消费者
public static void ReceiveMessage()
{var factory = new ConnectionFactory(){HostName = "40.161.118.219", // 替换为腾讯云轻量服务器公网IPPort = 5672, // RabbitMQ 默认端口UserName = "admin", // 替换为实际用户名Password = "admin123", // 替换为实际密码VirtualHost = "my_vhost", // 默认虚拟主机// 如需SSL加密,添加以下配置:// Ssl = new SslOption { Enabled = true, ServerName = "你的服务器IP" }};using (var connection = factory.CreateConnection())using (var channel = connection.CreateModel()){channel.QueueDeclare(queue: "hello",durable: false,exclusive: false,autoDelete: false,arguments: null);var consumer = new EventingBasicConsumer(channel);consumer.Received += (model, ea) =>{var body = ea.Body.ToArray();var message = Encoding.UTF8.GetString(body);Console.WriteLine($" [x] Received: {message}");};channel.BasicConsume(queue: "hello",autoAck: true, // 自动确认消息consumer: consumer);Console.WriteLine(" Press [Enter] to exit.");Console.ReadLine();}
}
11.查看队列信息