本文主要介绍window平台下RabbitMQ和protobuf的结合使用。
目录
1. RabbitMQ的简介
RabbitMQ是一种消息队列,实现了AMQP协议——消息中间件。通俗一点的解释就是担任了类似于邮局的工作。你想象一下你在发邮件的时候,这个邮件是如何被你朋友收到的呢?你只需要将信封塞到邮箱,而你朋友只需要在收件箱里面接收,剩下的工作全部交给了后台服务。当然这不是一两句话能说清楚里面的细节,所以提供官网链接,以备想深入了解的读者.
2.RabbitMQ的安装
RabbitMQ是用Erlang编写的,Erlang是世界著名的通信服务厂商——爱立信开发的,它的特点是原生支持高并发,所以特别适合应用在通信领域。所以我们首先需要安装Erlang。首先,进入RabbitMQ的下载页,滑到下面的下载页:
点击Download,跳转到下载页,在RabbitQM server栏目下选择与你系统对应的版本(以Windows为例):
直接选择绿色框框中的版本。进入下载页:
点击即可开始下载,上面是rabbitmq的可执行文件,在安装之前我们还需要 安装Erlang。其实在上图显示的页面有详细的安装教程。这里直接给出Erlang的下载链接,单机进入后,选择对应的版本:
我这里直接选择64位的可执行版本。
好了,我们下载了 2个可执行的文件,剩下的安装就是鼠标点点点。记住要先装Erlang,直接装RabbitMq时会报错。安装成功之后,在你的开始菜单里面就可以看到RabbitMq的新添加文件:
选择RabbitMQ Service -start就可以启动RabbitMQ了。
3. RabbitMQ的使用(基于本地服务器)
这里我们基于C#语言,所以选择VS建立一个项目,我给项目的取名为rabbitmq_Send .首先要给项目添加RabbitMQ链接库:选择项目->管理NuGet程序包:
进入管理页面,点击浏览,搜索RabbitMQ,找到一个叫RabbitMQ.Client的包,点击,然后安装:
因为我这里已经安装过了,所以可以只能选择卸载,没有安装的话,会是安装按钮。安装好了之后在你的项目引用中就可以找RabbitMQ.Client: 这样我们就是使用:
using RabbitMQ.Client;
把下面的代码复制到你的Main函数:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RabbitMQ.Client;
using System.Text;
namespace rabbitmq_Send
{
public class Program
{
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
string message = "你好啊,我是秦始皇!";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "",
routingKey: "hello",
basicProperties: null,
body: body);
Console.WriteLine($"发送消息为: {message}");
}
Console.WriteLine("按 【回车】键退出。");
Console.ReadLine();
}
}
}
上面的代码基本上和官方的示例一致,所以代码的理解可以参考这里,(项目的命名空间用你自己的)。
有了发送端,我们还需建立一个接收项目。在该解决方案下添加一个新项目,我取名为rabbitmq_Receive.同样为该项目添加RabbitMQ.Client.将下面的代码复制到Program.cs文件。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
namespace rabbitmq_Receive
{
class Program
{
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine($"接收到的消息是: {message}");
};
channel.BasicConsume(queue: "hello",
autoAck: true,
consumer: consumer);
Console.WriteLine("请按【Enter】键退出。");
Console.ReadLine();
}
}
}
}
同样官网有详细的说明。剩下的就是运行这两个项目了,首先运行接收程序,运行结果如下:
接收端会不断的去消息队列中取消息。然后我们再运行发送端,你可能会问,我们已经运行了 一个项目,怎么再运行第二个呢?
有办法的,VS早为我们想好了。如下图所示:我们点击运行"新实例",就可以让send也同时运行起来。
运行后的结果如下:
可以看到一运行send,接收端立马收到了消息。其中Send程序在发送后自动结束,而接收程序则仍在运行,再次运行shend,则接收端仍然会收到消息。
4. 后续学习
你肯定不想只是利用本地服务器来进行消息传输,所以你当然可以利用远端服务器,在构造服务器时你只需要给出远端服务器的IP地址就可以。
当然,你也不想只是用来传输字符串,你可能想用来传输图像,声音,甚至视频,我们再前面的代码中可以看到,我们将一段文字(string)类型转化为了字节数组,说明RabbitMq的传输单位是字节,也就是是二进制流,所以我们把图像,视频文件转化为 了字节数组,那么就可以通过RabbitMQ传输,接收端接收二进制后再恢复成原来的图像或者视频,当然在传输之前如果能将图像视频压缩一下,可能会更快。
甚至,我想传输一个对象,只要能将对象序列化成二进制文件,就可以,只是从二进制恢复成对象,或将对象转化为特定的二进制格式,实现起来比较复杂,这里我向大家推荐一个新工具:ProtoBuf,是由google开发的,官网有详细资料。以后可能会给大家介绍一些相关知识。