Asp.Net Core-RabbitMQ安装和使用
1、安装Erlang
下载地址:
百度云盘下载:
提取码:kma0
设置环境变量,新建ERLANG_HOME
修改环境变量path,增加Erlang变量至path,%ERLANG_HOME%\bin;
打开cmd命令框,输入erl
2、安装Rabbitmq
下载地址:
百度云盘下载:
提取码:kl61
(1)安装并添加环境变量
(2)打开cmd命令框,切换至D:\RabbitMQ\rabbitmq-server-windows-3.8.3\rabbitmq_server-3.8.3\sbin目录下,输入rabbitmqctl status
表示RabbitMQ未启动
(3)安装插件 rabbitmq-plugins.bat enable rabbitmq_management
解决方法:
将 C:\Users\Administrator\.erlang.cookie 同步至C:\Windows\System32\config\systemprofile\.erlang.cookie
同时删除:C:\Users\Administrator\AppData\Roaming\RabbitMQ目录
输入命令:rabbitmq-plugins.bat enable rabbitmq_management ,出现下面信息表示插件安装成功:
(4)输入命令:rabbitmq-server.bat
(5)rabbitmq启动成功,浏览器中http://localhost:15672,
(6)输入guest,guest进入rabbitMQ管理控制台:
(7)打开cmd,再次输入命令:rabbitmqctl status
(8)命令查看信息
rabbitmqctl status 查询状态
rabbitmqctl list_users 查看用户列表
rabbitmqctl add_user Richard 123456 //创建用户JC密码为JayChou
rabbitmqctl set_permissions Richard ".*" ".*" ".*" //赋予JC读写所有消息队列的权限
rabbitmqctl set_user_tags Richard administrator //分配用户组
3.使用RabbitMQ
(1)简介
rabbitmq是由LShift提供的一个消息队列协议(AMQP)的开源实现,由以高性能、健壮以及可伸缩性出名的Erlang写成
关键词:生产者,消息队列,消费者
生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机。先由 Exchange 来接收,然后 Exchange 按照特定的策略转发到 Queue 进行存储。Exchange 就类似于一个交换机,将各个消息分发到相应的队列中。
在实际应用中我们只需要定义好 Exchange 的路由策略,而生产者则不需要关心消息会发送到哪个 Queue 或被哪些 Consumer 消费。在这种模式下生产者只面向 Exchange 发布消息,消费者只面向 Queue 消费消息,Exchange 定义了消息路由到 Queue 的规则,将各个层面的消息传递隔离开,使每一层只需要关心自己面向的下一层,降低了整体的耦合度。
(2)Exchange四种类型
Headers Exchange:性能差,不常用
Direct Exchange:根据交换器名称和routingkey来找队列
Fanout Exchange:广播模式,忽略routingkey
Topic Exchange:根据RoutingKey的设置来做匹配,其中通配符为*(一个),#(任意多个)
其中routingkey表示上图中Exchanges和Queues绑定中的一个标识
(3)简单使用,以“Topic Exchange”为例
首先引入Nuget包RabbitMQ.Client
创建生产者Producer的控制台,RabbitMQManage.Producer
创建类“topicExchange.cs”
1 public class topicExchange 2 { 3 public static void Show() 4 { 5 var factory = new ConnectionFactory(); 6 factory.HostName = "localhost";//RabbitMQ服务在本地运行 7 factory.UserName = "guest";//用户名 8 factory.Password = "guest";//密码 9 using (var connection = factory.CreateConnection()) 10 { 11 using (IModel channel = connection.CreateModel()) 12 { 13 channel.ExchangeDeclare(exchange: "TopicExchange", type: ExchangeType.Topic, durable: true, autoDelete: false, arguments: null); 14 15 16 17 18 { 19 string message = "来自中国的新闻消息。。。。"; 20 var body = Encoding.UTF8.GetBytes(message); 21 channel.BasicPublish(exchange: "TopicExchange", routingKey: "China.news", basicProperties: null, body: body); 22 LogHelper.WriteLogs($"消息【{message}】已发送到队列"); 23 Console.WriteLine($"消息【{message}】已发送到队列"); 24 } 25 26 27 28 { 29 string message = "来自美国的新闻消息。。。。"; 30 var body = Encoding.UTF8.GetBytes(message); 31 channel.BasicPublish(exchange: "TopicExchange", routingKey: "China.news", basicProperties: null, body: body); 32 Console.WriteLine($"消息【{message}】已发送到队列"); 33 LogHelper.WriteLogs($"消息【{message}】已发送到队列"); 34 } 35 36 Console.ReadLine(); 37 } 38 } 39 } 40 }
创建消费者Customer的控制台,RabbitMQManage.Customer
新建类“topicExchange_Customer.cs”
1 public class topicExchange_Customer 2 { 3 public static void Show() 4 { 5 var factory = new ConnectionFactory(); 6 factory.HostName = "localhost";//RabbitMQ服务在本地运行 7 factory.UserName = "guest";//用户名 8 factory.Password = "guest";//密码 9 using (var connection = factory.CreateConnection()) 10 { 11 using (IModel channel = connection.CreateModel()) 12 { 13 channel.ExchangeDeclare(exchange: "TopicExchange", type: ExchangeType.Topic, durable: true, autoDelete: false, arguments: null); 14 channel.QueueDeclare(queue: "newsQueue", durable: true, exclusive: false, autoDelete: false, arguments: null); 15 channel.QueueBind(queue: "newsQueue", exchange: "TopicExchange", routingKey: "*.news", arguments: null); 16 //定义消费者 进行消息接收处理 17 var consumer = new EventingBasicConsumer(channel); 18 consumer.Received += (model, ea) => 19 { 20 var body = ea.Body; 21 var message = Encoding.UTF8.GetString(body.ToArray()); 22 23 24 Console.WriteLine($"接收成功!【{message}】"); 25 LogHelper.WriteLogs($"接收成功!【{message}】"); 26 }; 27 28 29 //处理消息 30 channel.BasicConsume(queue: "ChinaQueue", 31 autoAck: true, 32 consumer: consumer); 33 34 35 36 Console.ReadLine(); 37 } 38 } 39 } 40 }
最终呈现效果如下图所示:
以上仅用于学习和总结
参考地址: