配置:
1.1RabbitMQ集群环境搭建和环境变量:
每台服务器安装RabbitMQ,下载地址:https://www.rabbitmq.com/docs/install-windows#installer
环境变量Path 值 添加:rabbitmq安装目录的sbin目录
1.2安装Erlang和配置环境变量
每台服务器安装Erlang,下载地址:https://www.erlang.org/downloads
环境变量Path值添加:Erlang安装目录的bin目录
1.3安装Rabbitmq服务
运行cmd窗体输入 rabbitmq-plugins enable rabbitmq_management 命令进行安装
1.4集群配置
绑定ip计算机名称 (C:\Windows\System32\drivers\etc)
ip1 计算机名1
ip2 计算机名2
ip3 计算机名3
拷贝其中一台服务器上的 C:\Windows和C:\Users\Administrator\.erlang.cookie 文件复制到另外几台服务器上
分别在几个服务器上运行 rabbitmq-server -detached,启动 rabbit 节点服务。
在 rabbit@rabbit1 节点服务器上运行 rabbitmqctl stop_app,停止 rabbit 节点程序。
在 rabbit@rabbit1 节点服务器上运行 rabbitmqctl join_cluster rabbit@rabbit2,将节点 rabbit@rabbit1 和 rabbit@rabbit2 组成集群。
在 rabbit@rabbit1 节点服务器上运行 rabbitmqctl join_cluster rabbit@rabbit3,将节点 rabbit@rabbit1 和 rabbit@rabbit3 组成集群。
分别在服务器上运行 rabbitmqctl start_app,启动 rabbit 节点程序。
运行 rabbitmqctl cluster_status 查看集群的运行状态。
访问http://localhost:15672/ 默认帐号:guest 密码:guest
使用镜像队列
策略名随便填
正则表达式:^
Apply to:Queues
Definition:ha-mode:exactly、ha-params:2、ha-sync-mode:automatic
2.添加RabbitMQ包
3.配置类:
public class RabbitMq{
private readonly IHubContext<XXHub> _hubContext;
private const string ExchangeName = "SignalRExchange";
private const string QueueAName = "ServerAQueue";
private const string QueueBName = "ServerBQueue";
private const string QueueCName = "ServerCQueue";
private const string RoutingKey = "ServerQueueKey";
public RabbitMq(IHubContext<XXHub> hubContext)
{
_hubContext = hubContext;
}
public static void SetupExchangeAndQueues()
{
var factory = new ConnectionFactory() { HostName = "localhost", UserName = "guest", Password = "guest" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
//channel.ExchangeDeclare(ExchangeName, ExchangeType.Direct);//创建Direct类型的交换机
//channel.QueueDeclare(QueueAName, false, false, false, null);//创建队列A
//channel.QueueBind(QueueAName, ExchangeName, RoutingKey);//将队列A绑定到交换机
//channel.QueueDeclare(QueueBName, false, false, false, null);//创建队列B
//channel.QueueBind(QueueBName, ExchangeName, RoutingKey);//将队列B绑定到交换机
//channel.QueueDeclare(QueueCName, false, false, false, null);//创建队列C
//channel.QueueBind(QueueCName, ExchangeName, RoutingKey);//将队列C绑定到交换机
}
}
public void SendMessageToExchange(string message)
{
var factory = new ConnectionFactory() { HostName = "localhost", UserName = "guest", Password = "guest" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: ExchangeName, routingKey: RoutingKey, basicProperties: null, body: body);//发送消息到队列
}
}
public async Task ConsumeMessageFromQueue()
{
var factory = new ConnectionFactory() { HostName = "localhost", UserName = "guest", Password = "guest" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
var consumer = new EventingBasicConsumer(channel);
consumer.Received += async (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
try
{
ReciveData reciveData = JsonConvert.DeserializeObject<ReciveData>(message);
if (reciveData != null)
{
foreach (var item in reciveData.ConnectionIds)
{
await _hubContext.Clients.Client(item).SendAsync("ReceiveData", JsonConvert.SerializeObject(reciveData));//将队列数据返回
}
}
}
catch (Exception ex)
{
//await _hubContext.Clients.All.SendAsync("Msg", "错误:" + ex.ToString());
}
//channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
};
await Task.Delay(0);
channel.BasicConsume(queue: QueueBName, autoAck: true, consumer: consumer);//消费服务器A队列的消息
channel.BasicConsume(queue: QueueBName, autoAck: true, consumer: consumer);//消费服务器B队列的消息
channel.BasicConsume(queue: QueueCName, autoAck: true, consumer: consumer);//消费服务器C队列的消息
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App