1 $ 准备前提
前面两篇我们对 EasyNetQ 做了简单介绍,访问地址如下:
接下来我们基于 RabbitMQ 中的常用协议(direct、topic、fanout)实现在 .net5 控制台项目中的操作,此处主要是使用【NetServices.Helper.RabbitMQ】包编写案例。
1.1 环境准备条件
- RabbitMQ 下载
- RabbitMQ 安装
- 先安装 erlang
- 然后再安装 rabbitmq
- NuGet 包
- NetServices.Helper.RabbitMQ =》Install-Package NetServices.Helper.RabbitMQ -Version 1.0.1
- 项目环境
- Microsoft Visual Studio Enterprise 2019 版本 16.9.3+
- .NET 5.0 控制台应用程序 <TargetFramework>net5.0</TargetFramework>
nuget =》NuGet Gallery | Home ,安装参考 =》【RabbitMQ学习笔记:安装与配置】
1.2 RabbitMQ 客户端组件包:NetServices.Helper.RabbitMQ
【NetServices.Helper.RabbitMQ】包是基于【EasyNetQ v6.3.2】封装的,使用 .net5 平台的类库实现,版本v1.0.2;接下来我们按照 RabbitMQ 中的协议(direct、topic、fanout)逐一讲解。
上面的环境安装好后,RabbitMQ 默认会有一个【admin】账户,下面的演示我们均使用该默认账户进行相关数据通信操作;
2 $ 控制台项目搭建
为了体现 RabbitMQ 的角色概念,创建两个【控制台应用程序】项目分别为:生产者【Producer.ConsoleApp.Test】和消费者【Consumer.ConsoleApp.Test】角色扮演;然后依次在每个项目中引入 nuget 包【NetServices.Helper.RabbitMQ】,项目环境基本搭建ok,接下来我们介绍怎么使用【NetServices.Helper.RabbitMQ】包实现(direct、topic、fanout)协议的消息发送和消费的数据通信;
2.1 Fanout Exchange(广播模式)
此处链接 RabbitMQ 的格式如下:
private static readonly string mqConnStr = "host=192.168.10.27;virtualHost=/;username=admin;password=admin";
此处要说明一点,在该组件包中,提供两类 RabbitMQ 的客户端操作方式,分别如下:
- RabbitMQClientFactory (单例模式 + 享元模式)
- RabbitMQClientHelper (单例模式)
控制台的 Main 函数中代码示例分别如下:
// 消息发送【Producer.ConsoleApp.Test】
var player = RabbitMQClientFactory.GetInstance().GetRabbitMQClientRolePlayer<MsgProducer>("producer");
var mqClient = player.BuildRolePlayer();
var bus = player.CreateBus(mqConnStr);
while (true)
{
string msg = Console.ReadLine();
var (state, info) = mqClient.FanoutPublish(bus, "fanoutExchange", "fanoutRKey1", msg);
if (!state) Console.WriteLine(info); //输出异常信息
Thread.Sleep(200);
}
// 消息消费【Consumer.ConsoleApp.Test】
var bus = RabbitMQClientHelper.CreateBus(mqConnStr);
var mqClientHelper = new RabbitMQClientHelper();
while (true)
{
var (state, info) = mqClientHelper.Consumer.FanoutConsume<string>(bus, "fanoutExchange", "fanoutQueue1", "fanoutRKey1", (handler) => {
Console.WriteLine(handler); //接收消息
});
if (!state) Console.WriteLine(info); //输出异常信息
Thread.Sleep(200);
}
【NetServices.Helper.RabbitMQ】包提供的两种对象操作模式均可使用,使用区别如上代码中,发送消息使用 RabbitMQClientFactory 对象,消费消息使用 RabbitMQClientHelper,当然也可以调换执行或者全部都使用一个对象操作,此处只是客户端操作对象的一个 “多态” 模式,小伙伴喜欢哪个就使用哪个,不必纠结于此。
2.2 Direct Exchange (路由推送模式)
此处为了掩饰,我们把上面模式的客户端操作对象对调下,实现 Direct 模式的消息通信,控制台的 Main 函数中代码示例分别如下:
// 消息发送【Producer.ConsoleApp.Test】
var bus = RabbitMQClientHelper.CreateBus(mqConnStr);
var mqClientHelper = new RabbitMQClientHelper();
while (true)
{
string msg = Console.ReadLine();
//var (state, info) = mqClientHelper.Producer.DirectSend(bus, "directQueue1", msg);
var (state, info) = mqClientHelper.Producer.DirectPublish(bus, "directExchange", "directRKey1", msg);
if (!state) Console.WriteLine(info);
Thread.Sleep(200);
}
// 消息消费【Consumer.ConsoleApp.Test】
var player = RabbitMQClientFactory.GetInstance().GetRabbitMQClientRolePlayer<MsgConsumer>("consumer");
var mqClient = player.BuildRolePlayer();
var bus = player.CreateBus(mqConnStr);
while (true)
{
//var (state, info) = mqClientHelper.Consumer.DirectReceive<string>(bus, "directQueue1", (callback)=> {
// Console.WriteLine(callback);
//});
var (state, info) = mqClient.DirectConsume<string>(bus, "directExchange", "directQueue1", "directRKey1", (callbackHandler) => {
Console.WriteLine(callbackHandler);
});
if (!state) Console.WriteLine(info);
Thread.Sleep(200);
}
2.3 Topic Exchange (主题[模糊]匹配/订阅模式)
上面 Direct 模式的消息通信演示了两个客户端对象的对调,接下来的 Topic 模式的消息通信我们均采用一个对象来实现,控制台的 Main 函数中代码示例分别如下:
// 消息发送【Producer.ConsoleApp.Test】
var bus = RabbitMQClientHelper.CreateBus(mqConnStr);
var mqClientHelper = new RabbitMQClientHelper();
while (true)
{
string msg = Console.ReadLine();
//var (state, info) = mqClientHelper.Producer.TopicPublish(bus, "topic1", msg);
var (state, info) = mqClientHelper.Producer.TopicAdvancedPublish(bus, "topic2", "topicExchange", msg);
if (!state) Console.WriteLine(info);
Thread.Sleep(200);
}
// 消息消费【Consumer.ConsoleApp.Test】
var bus = RabbitMQClientHelper.CreateBus(mqConnStr);
var mqClientHelper = new RabbitMQClientHelper();
while (true)
{
//var (state, info) = mqClientHelper.Consumer.TopicSubscribe<string>(bus, "subTopic1", (callbackHandler) => {
// Console.WriteLine(callbackHandler);
//},"topic1");
var (state, info) = mqClientHelper.Consumer.TopicAdvancedConsume<string>(bus, "topicExchange", "subTopic2", (callbackHandler) =>
{
Console.WriteLine(callbackHandler);
}, "topic2");
if (!state) Console.WriteLine(info);
Thread.Sleep(200);
}
3 $ 两种客户端模式的简单介绍
- RabbitMQClientFactory 对象是单例模式和享元模式的结合实现,提供对 RabbitMQ 客户端的相关操作;
- RabbitMQClientHelper 对象是单例模式的实现,提供对 RabbitMQ 客户端的相关操作;
4 $ 生产者和消费者提供方法简单介绍
- 消息生产者:MessageProducer
- 消息消费者:MessageConsumer
以上通信模式中我们使用 string 字符串类型来演示的消息通信,同样可以使用提供的模型实现各种类型的消息通信,消息模型中提供如下:
- public class EntityMessage<TData> where TData : class
- public class FormatMessage<TData> where TData : class
我们只需将发送消息和接收消息采用模型构建即可,提供的 <TMsg> 的泛型参数,有兴趣的小伙伴可以自行去尝试,此处就不做过多的说明演示(都是类似的🎈🎈🎈)
以上就是关于【NetServices.Helper.RabbitMQ】包的简单介绍和使用,希望能通过上面的案例,在实际项目应用中帮助到更多的小伙伴,~~~///(^v^)\\\~~~