C#调用RabbitMQ实现消息队列
一、下载RabbitMQ
http://www.rabbitmq.com/install-windows.html

二、下载OTP
http://www.erlang.org/downloads

三、安装OTP、RabbitMQ


四、配置RabbitMQ
找到bat的目录

执行相关命令

1.添加用户密码 rabbitmqctl add_user wenli wenli
2.设置wenli为管理员rabbitmqctl set_user_tags wenli administrator
3.启动RabbitMQ的web管理rabbitmq-plugins enable rabbitmq_management
4.创建virtual host

5.设置用户权限
点击用户名进行设置

将virtual hosts 权限赋给用户wenli

6.创建Exchanges

RabbitMQ还有很多常用命令,大家可以自行百度。
----------------------------------------------------------------------------------------------------
到此,RabbitMQ服务端的环境配置好了,正常情况,这些配置应该在服务器进行,但我为了测试方便,就把服务端也安装在本机了,因此我下面调用RabbitMQ时,连接的主机IP都是localhost。
RabbitMQ应用
首先创建两个控制台应用程序,KibaRabbitMQSend和KibaRabbitMQReceived。
然后引入RabbitMQ的开源类库。
在C#里使用RabbitMQ开源类库非常简单,可以去官网下载一个.NET版本的RabbitMQ客户端类库,也可以直接在Nuget上搜索RabbitMQ,然后安装,如下图:

KibaRabbitMQSend
安装完RabbitMQ开源类库后,我们编写代码,实现向RabbitMQ服务器发送消息,代码如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | staticvoidMain(string[] args){    varfactory = newConnectionFactory();    factory.HostName = "localhost";//主机名,Rabbit会拿这个IP生成一个endpoint,这个很熟悉吧,就是socket绑定的那个终结点。    factory.UserName = "guest";//默认用户名,用户可以在服务端自定义创建,有相关命令行    factory.Password = "guest";//默认密码    using(varconnection = factory.CreateConnection())//连接服务器,即正在创建终结点。    {        //创建一个通道,这个就是Rabbit自己定义的规则了,如果自己写消息队列,这个就可以开脑洞设计了        //这里Rabbit的玩法就是一个通道channel下包含多个队列Queue        using(varchannel = connection.CreateModel())        {             channel.QueueDeclare("kibaQueue", false, false, false, null);//创建一个名称为kibaqueue的消息队列             varproperties = channel.CreateBasicProperties();             properties.DeliveryMode = 1;             stringmessage = "I am Kiba518"; //传递的消息内容             channel.BasicPublish("", "kibaQueue", properties, Encoding.UTF8.GetBytes(message)); //生产消息             Console.WriteLine($"Send:{message}");        }    }} | 
运行代码。
然后我们使用命令行rabbitmqctl list_queues,去RabbitMQ的服务器查看当前消息队列,如下图:

可以看到,我们的消息已经发送成功了。
KibaRabbitMQReceived
现在我们编写接收消息代码,如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | staticvoidMain(string[] args){    varfactory = newConnectionFactory();    factory.HostName = "localhost";    factory.UserName = "guest";    factory.Password = "guest";    using(varconnection = factory.CreateConnection())    {        using(varchannel = connection.CreateModel())        {            channel.QueueDeclare("kibaQueue", false, false, false, null);            /* 这里定义了一个消费者,用于消费服务器接受的消息             * C#开发需要注意下这里,在一些非面向对象和面向对象比较差的语言中,是非常重视这种设计模式的。             * 比如RabbitMQ使用了生产者与消费者模式,然后很多相关的使用文章都在拿这个生产者和消费者来表述。             * 但是,在C#里,生产者与消费者对我们而言,根本算不上一种设计模式,他就是一种最基础的代码编写规则。             * 所以,大家不要复杂的名词吓到,其实,并没那么复杂。             * 这里,其实就是定义一个EventingBasicConsumer类型的对象,然后该对象有个Received事件,             * 该事件会在服务接收到数据时触发。             */            varconsumer = newEventingBasicConsumer(channel);//消费者            channel.BasicConsume("kibaQueue", true, consumer);//消费消息            consumer.Received += (model, ea) =>            {                varbody = ea.Body;                varmessage = Encoding.UTF8.GetString(body);            };        }    }} | 
运行代码。
然后我们使用命令行rabbitmqctl list_queues,去RabbitMQ的服务器查看当前消息队列,如下图:

可以看到,消息已经被使用了。
----------------------------------------------------------------------------------------------------
现在我们在发送代码出做一个for循环,看看消息接收速度是什么样的,代码如下,for循环了100次,每次间隔3秒。
| 1 2 3 4 5 6 7 8 9 10 | for(inti = 0; i < 100; i++){    channel.QueueDeclare("kibaQueue", false, false, false, null);//创建一个名称为kibaQueue的消息队列    varproperties = channel.CreateBasicProperties();    properties.DeliveryMode = 1;    stringmessage = "I am Kiba518"; //传递的消息内容    channel.BasicPublish("", "kibaQueue", properties, Encoding.UTF8.GetBytes(message)); //生产消息    Console.WriteLine($"Send:{message}");    Thread.Sleep(3000);} | 
效果图如下:

可以看到,发送消息和接收消息,几乎是同步的,效果非常理想。
服务器端应用
在上文,我们的RabbitMQ服务是安装在我的本机上的;现在我们把服务移植到服务器上,然后再来测试一下。
在服务器端安装RabbitMQ和在本机安装的步骤是一样的,但是安装完成后,我们需要设置下防火墙的入站规则和出站规则,将5672的UDP端口开放一下。
为什么要开放端口是5672?因为RabbitMQ的默认的消息接收和发送端口就是5672,我们可以使用断点查看一下。

如上图,可以看到,在我们没有设置端口的时候,Endpoint的端口的默认值是5672。
配置完端口后,我们修改代码中的HostName为我们的服务器地址,如下。
| 1 | factory.HostName = "1.1.1.1"; | 
重新运行代码,会发现在运行到factory.CreateConnection()的时候,系统提示一个异常【RabbitMQ.Client.Exceptions.BrokerUnreachableException:“None of the specified endpoints were reachable”】,如下图:

这是因为我们使用的账号是guest,guest账号默认是不支持远程连接的。
解决办法很简单,新建一个账户即可。
创建用户
在服务器端打开浏览器,输入http://127.0.0.1:15672/,进入管理页面。
点击菜单栏的Admin选项,进入用户管理界面创建用户kiba,密码123456,如下图:

创建完用户后,得到如下界面。

如上图所示,刚刚创建的用户还没有任何访问权限。
现在我们点击用户名,进入权限管理页面设置权限。

如上图所示,页面默认为我们设置了一个可读,可写,可管理配置的权限;所以,我们只要点击Set premission就可以了。
设置完权限,我们回到用户管理页面。

如上图所示,权限设置成功。
现在我们回到代码,修改用户名密码如下。
| 1 2 3 | factory.HostName = "1.1.1.1";factory.UserName = "kiba";factory.Password = "123456"; | 
运行代码,不再抛异常,接受发送消息正常。
----------------------------------------------------------------------------------------------------
设置用户权限也可以通过命令的方式设置,如下:
rabbitmqctl set_permissions -p "/" kiba "." "." ".*"

----------------------------------------------------------------------------------------------------
到此C#调用RabbitMQ实现消息队列就讲完了。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号