• 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
    static void Main(string[] args)
    {
        var factory = new ConnectionFactory();
        factory.HostName = "localhost";//主机名,Rabbit会拿这个IP生成一个endpoint,这个很熟悉吧,就是socket绑定的那个终结点。
        factory.UserName = "guest";//默认用户名,用户可以在服务端自定义创建,有相关命令行
        factory.Password = "guest";//默认密码
     
        using (var connection = factory.CreateConnection())//连接服务器,即正在创建终结点。
        {
            //创建一个通道,这个就是Rabbit自己定义的规则了,如果自己写消息队列,这个就可以开脑洞设计了
            //这里Rabbit的玩法就是一个通道channel下包含多个队列Queue
            using (var channel = connection.CreateModel())
            {
                 channel.QueueDeclare("kibaQueue"falsefalsefalsenull);//创建一个名称为kibaqueue的消息队列
                 var properties = channel.CreateBasicProperties();
                 properties.DeliveryMode = 1;
                 string message = "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
    static void Main(string[] args)
    {
        var factory = new ConnectionFactory();
        factory.HostName = "localhost";
        factory.UserName = "guest";
        factory.Password = "guest";
     
        using (var connection = factory.CreateConnection())
        {
            using (var channel = connection.CreateModel())
            {
                channel.QueueDeclare("kibaQueue"falsefalsefalsenull);
     
                /* 这里定义了一个消费者,用于消费服务器接受的消息
                 * C#开发需要注意下这里,在一些非面向对象和面向对象比较差的语言中,是非常重视这种设计模式的。
                 * 比如RabbitMQ使用了生产者与消费者模式,然后很多相关的使用文章都在拿这个生产者和消费者来表述。
                 * 但是,在C#里,生产者与消费者对我们而言,根本算不上一种设计模式,他就是一种最基础的代码编写规则。
                 * 所以,大家不要复杂的名词吓到,其实,并没那么复杂。
                 * 这里,其实就是定义一个EventingBasicConsumer类型的对象,然后该对象有个Received事件,
                 * 该事件会在服务接收到数据时触发。
                 */
                var consumer = new EventingBasicConsumer(channel);//消费者
                channel.BasicConsume("kibaQueue"true, consumer);//消费消息
                consumer.Received += (model, ea) =>
                {
                    var body = ea.Body;
                    var message = Encoding.UTF8.GetString(body);
                };
            }
        }
    }

    运行代码。

    然后我们使用命令行rabbitmqctl list_queues,去RabbitMQ的服务器查看当前消息队列,如下图:

    可以看到,消息已经被使用了。

    ----------------------------------------------------------------------------------------------------

    现在我们在发送代码出做一个for循环,看看消息接收速度是什么样的,代码如下,for循环了100次,每次间隔3秒。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (int i = 0; i < 100; i++)
    {
        channel.QueueDeclare("kibaQueue"falsefalsefalsenull);//创建一个名称为kibaQueue的消息队列
        var properties = channel.CreateBasicProperties();
        properties.DeliveryMode = 1;
        string message = "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实现消息队列就讲完了。

  • 相关阅读:
    谷歌浏览器中安装JsonView扩展程序
    谷歌浏览器中安装Axure扩展程序
    PreferencesUtils【SharedPreferences操作工具类】
    Eclipse打包出错——提示GC overhead limit exceeded
    IntentActionUtil【Intent的常见作用的工具类】
    DeviceUuidFactory【获取设备唯一标识码的UUID(加密)】【需要运行时权限的处理的配合】
    AndroidStudio意外崩溃,电脑重启,导致重启打开Androidstudio后所有的import都出错
    DateTimeHelper【日期类型与字符串互转以及日期对比相关操作】
    ACache【轻量级的开源缓存框架】
    WebUtils【MD5加密(基于MessageDigest)】
  • 原文地址:https://www.cnblogs.com/zoujinhua/p/15492104.html
Copyright © 2020-2023  润新知