.NET Core 使用RabbitMQ

RabbitMQ简介
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
RabbitMQ提供了可靠的消息机制、跟踪机制和灵活的消息路由,支持消息集群和分布式部署。适用于排队算法、秒杀活动、消息分发、异步处理、数据同步、处理耗时任务、CQRS等应用场景。

RabbitMQ安装

  1. 首先安装erlang

    rpm -Uvh https://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el7.centos.x86_64.rpm

在这里插入图片描述
2. 然后安装socat

yum install socat

在这里插入图片描述
3. 最后安装RabbitMQ

rpm -Uvh https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.12/rabbitmq-server-3.6.12-1.el7.noarch.rpm

在这里插入图片描述
RabbitMQ常用命令
启用Web控制台

rabbitmq-plugins enable rabbitmq_management

在这里插入图片描述

开启服务

systemctl start rabbitmq-server.service

在这里插入图片描述
停止服务

systemctl stop rabbitmq-server.service

在这里插入图片描述
查看服务状态

systemctl status rabbitmq-server.service

在这里插入图片描述
查看RabbitMQ状态

rabbitmqctl status

在这里插入图片描述

添加用户赋予管理员权限

rabbitmqctl add_user root  root2684
rabbitmqctl set_user_tags root administrator

在这里插入图片描述
查看用户列表

rabbitmqctl list_users

在这里插入图片描述
删除用户

rabbitmqctl delete_user root

在这里插入图片描述
修改用户密码

rabbitmqctl oldPassword Username newPassword

访问Web控制台
http://服务器IP:15672/#/users, 注意配置防火墙,阿里云 安全组规则—>入方向—>添加安全组规则
在这里插入图片描述

设置Virtual Host权限
在这里插入图片描述

. NET CORE 使用RabbitMQ
通过nuget安装:https://www.nuget.org/packages/RabbitMQ.Client/
定义生产者

//创建连接工厂
      

  ConnectionFactory factory = new ConnectionFactory
  {
  		 UserName = "root",
         Password = "root2684",
         HostName = "119.23.78.24",
         Port = AmqpTcpEndpoint.UseDefaultPort,
      	 VirtualHost = "/"
  };
    
  //创建连接
  var connection = factory.CreateConnection();
  //创建通道
  var channel = connection.CreateModel();
  //声明一个队列
  channel.QueueDeclare("product", false, false, false, null);
  //
  Console.WriteLine("\nRabbitMQ连接成功,请输入消息,输入exit退出!");
  string input = string.Empty;
  do
  {
      input = Console.ReadLine();
      var sendBytes = Encoding.UTF8.GetBytes(input);
      //发布消息
      channel.BasicPublish("", "product", null, sendBytes);

  } while (!input.Trim().ToLower().Equals("exit"));

  channel.Close();
  connection.Close();

定义消费者

//创建工厂
                ConnectionFactory factory = new ConnectionFactory()
                {
                    UserName = "root",
                    Password = "root2684",
                    HostName = "119.23.78.24",
                    Port = AmqpTcpEndpoint.UseDefaultPort,
                    VirtualHost = "/"
                };

            //创建连接
            var connection = factory.CreateConnection();
            //创建通道
            var channel = connection.CreateModel();

            //事件基本消费者
            EventingBasicConsumer consumer = new EventingBasicConsumer(channel);

            //接收到消息事件
            consumer.Received += (ch, ea) =>
            {
                var message = Encoding.UTF8.GetString(ea.Body);
                Console.WriteLine($"收到消息:{message}");
                //确认该消息已经被消费
                channel.BasicAck(ea.DeliveryTag, false);
                //
                Console.WriteLine($"已发送回执[{ea.DeliveryTag}]");
            };

            //启动消费者 设置为手动应答消息
            channel.BasicConsume("product", false, consumer);
            Console.WriteLine("消费者已启动");
            Console.ReadKey();
            channel.Dispose();
            connection.Close();

运行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

启动了一个生产者,两个消费者,可以看见两个消费者都能收到消息,消息投递到哪个消费者是由RabbitMQ决定的。


Rirect Exchange
所有发送到Direct Exchange的消息被转发到具有指定RouteKey的Queue。
Direct模式,可以使用rabbitMQ自带的Exchange:default Exchange 。所以不需要将Exchange进行任何绑定(binding)操作 。消息传递时,RouteKey必须完全匹配,才会被队列接收,否则该消息会被抛弃。

string queueName = "hello1";

            //创建工厂
            ConnectionFactory factory = new ConnectionFactory()
            {
                UserName = "root",
                Password = "root2684",
                HostName = "119.23.78.24",
                Port = AmqpTcpEndpoint.UseDefaultPort,
                VirtualHost = "/"
            };

            //创建连接
            var connection = factory.CreateConnection();
            //创建通道
            var channel = connection.CreateModel();

            //事件基本消费者
            EventingBasicConsumer consumer = new EventingBasicConsumer(channel);

            //接收到消息事件
            consumer.Received += (ch, ea) =>
            {
                var message = Encoding.UTF8.GetString(ea.Body);
                Console.WriteLine($"Queue:{queueName}收到消息:{message}");

                //确认该消息已经被消费
                channel.BasicAck(ea.DeliveryTag, false);

            };

            //启动消费者 设置为手动应答消息
            channel.BasicConsume(queueName, false, consumer);
            Console.WriteLine($"Queue:{queueName},消费者已启动");
            Console.ReadKey();
            channel.Dispose();
            connection.Close();

Fanout Exchange
所有发送到Fanout Exchange的消息都会被转发到与该Exchange 绑定(Binding)的所有Queue上。
Fanout Exchange 不需要处理RouteKey 。只需要简单的将队列绑定到exchange 上。这样发送到exchange的消息都会被转发到与该交换机绑定的所有队列上。类似子网广播,每台子网内的主机都获得了一份复制的消息。
所以,Fanout Exchange 转发消息是最快的。
为了演示效果,定义了两个队列,分别为hello1,hello2,每个队列都拥有一个消费者。

//
                string exchangeName = "TestFanoutChange1";
                string queueName1 = "hello1";
                string queueName2 = "hello2";
                string routeKey = "";

            //创建连接工厂
            ConnectionFactory factory = new ConnectionFactory
            {
                UserName = "root",
                Password = "root2684",
                HostName = "119.23.78.24",
                Port = AmqpTcpEndpoint.UseDefaultPort,
                VirtualHost = "/"
            };

            //创建连接
            var connection = factory.CreateConnection();
            //创建通道
            var channel = connection.CreateModel();

            //定义一个Direct类型交换机
            channel.ExchangeDeclare(exchangeName, ExchangeType.Fanout, false, false, null);
            //定义队列1
            channel.QueueDeclare(queueName1, false, false, false, null);
            //定义队列2
            channel.QueueDeclare(queueName2, false, false, false, null);

            //将队列绑定到交换机
            channel.QueueBind(queueName1, exchangeName, routeKey, null);
            channel.QueueBind(queueName2, exchangeName, routeKey, null);

            //
            Console.WriteLine("\nRabbitMQ连接成功,请输入消息,输入exit退出!");
            string input = string.Empty;
            do
            {
                input = Console.ReadLine();
                var sendBytes = Encoding.UTF8.GetBytes(input);
                //发布消息
                channel.BasicPublish(exchangeName, routeKey, null, sendBytes);

            } while (!input.Trim().ToLower().Equals("exit"));

            channel.Close();
            connection.Close();

Topic Exchange
所有发送到Topic Exchange的消息被转发到能和Topic匹配的Queue上,
Exchange 将路由进行模糊匹配。可以使用通配符进行模糊匹配,符号“#”匹配一个或多个词,符号“”匹配不多不少一个词。因此“XiaoChen.#”能够匹配到“XiaoChen.pets.cat”,但是“XiaoChen.” 只会匹配到“XiaoChen.money”。
所以,Topic Exchange 使用非常灵活。

//“#”匹配一个或多个词
                //“*”匹配不多不少一个词
                string exchangeName = "TestTopicChange";
                string queueName = "topic.hello.queue";
                string routeKey = "";//

            //创建连接工厂
            ConnectionFactory factory = new ConnectionFactory
            {
                UserName = "root",
                Password = "root2684",
                HostName = "119.23.78.24",
                Port = AmqpTcpEndpoint.UseDefaultPort,
                VirtualHost = "/"
            };

            //创建连接
            var connection = factory.CreateConnection();
            //创建通道
            var channel = connection.CreateModel();

            //定义一个Direct类型交换机
            channel.ExchangeDeclare(exchangeName, ExchangeType.Topic, false, false, null);
            //定义队列1
            channel.QueueDeclare(queueName, false, false, false, null);

            //将队列绑定到交换机
            channel.QueueBind(queueName, exchangeName, routeKey, null);

            //
            Console.WriteLine("\nRabbitMQ连接成功,请输入消息,输入exit退出!");
            string input = string.Empty;
            do
            {
                input = Console.ReadLine();
                var sendBytes = Encoding.UTF8.GetBytes(input);
                //发布消息
                channel.BasicPublish(exchangeName, routeKey, null, sendBytes);

            } while (!input.Trim().ToLower().Equals("exit"));

            channel.Close();
            connection.Close();

引用:https://www.cnblogs.com/stulzq/p/7551819.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值