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     }

 

最终呈现效果如下图所示:
 
以上仅用于学习和总结
 
 参考地址:
posted @ 2020-06-26 00:00  y_w_k  阅读(877)  评论(1编辑  收藏  举报