NET Core 2.0利用MassTransit集成RabbitMQ
NET Core 2.0利用MassTransit集成RabbitMQ
https://www.cnblogs.com/Andre/p/9579764.html
在ASP.NET Core上利用MassTransit来集成使用RabbitMQ真的很简单,代码也很简洁。近期因为项目需要,我便在这基础上再次进行了封装,抽成了公共方法,使得使用RabbitMQ的调用变得更方便简洁。那么,就让咱们来瞧瞧其魅力所在吧。
MassTransit
先看看MassTransit是个什么宝贝(MassTransit官网的简介):
MassTransit是一个免费的开源轻量级消息总线,用于使用.NET框架创建分布式应用程序。MassTransit在现有的顶级消息传输上提供了一系列广泛的功能,从而以开发人员友好的方式使用基于消息的会话模式异步连接服务。基于消息的通信是实现面向服务的体系结构的可靠且可扩展的方式。
通俗描述:
MassTransit就是一套基于消息服务的高级封装类库,下游可联接RabbitMQ、Redis、MongoDb等服务。
github官网:https://github.com/MassTransit/MassTransit
RabbitMQ
RabbitMQ是成熟的MQ队列服务,是由 Erlang 语言开发的 AMQP 的开源实现。关于介绍RabbitMQ的中文资料也很多,有需要可以自行查找。我这里贴出其官网与下载安装的链接,如下:
下载与安装:http://www.rabbitmq.com/download.html
实现代码
通过上面的介绍,咱们已对MassTransit与RabbitMQ有了初步了解,那么现在来看看如何在ASP.NET Core上优雅的使用RabbitMQ吧。
1、创建一个名为“RabbitMQHelp.cs”公共类,用于封装操作RabbitMQ的公共方法,并通过Nuget来管理并引用“MassTransit”与“MassTransit.RabbitMQ”类库。
2、“RabbitMQHelp.cs”公共类主要对外封装两个静态方法,其代码如下:
复制代码
1 using MassTransit;
2 using MassTransit.RabbitMqTransport;
3 using System;
4 using System.Collections.Generic;
5 using System.Text;
6 using System.Threading.Tasks;
7
8 namespace Lezhima.Comm
9 {
10 ///
12 ///
13 public class RabbitMQHelp
14 {
15 #region 交换器
16
17 ///
19 /// 同时需在RabbitMQ的管理后台创建同名交换器
20 ///
21 public static readonly string actionLogExchange = "Lezhima.ActionLogExchange";
22
23
24 #endregion
25
26
27 #region 声明变量
28
29 ///
31 ///
32 private static readonly string mqUrl = "rabbitmq://192.168.1.181/";
33
34 ///
36 ///
37 private static readonly string mqUser = "admin";
38
39 ///
41 ///
42 private static readonly string mqPwd = "admin";
43
44 #endregion
45
46 ///
48 /// 不对外公开
49 ///
50 private static IBusControl CreateBus(Action<IRabbitMqBusFactoryConfigurator, IRabbitMqHost> registrationAction = null)
51 {
52 //通过MassTransit创建MQ联接工厂
53 return Bus.Factory.CreateUsingRabbitMq(cfg =>
54 {
55 var host = cfg.Host(new Uri(mqUrl), hst =>
56 {
57 hst.Username(mqUser);
58 hst.Password(mqPwd);
59 });
60 registrationAction?.Invoke(cfg, host);
61 });
62 }
63
64
65 ///
67 /// 这里使用fanout的交换类型
68 ///
69 ///
70 public async static Task PushMessage(string exchange, object obj)
71 {
72 var bus = CreateBus();
73 var sendToUri = new Uri($"{mqUrl}{exchange}");
74 var endPoint = await bus.GetSendEndpoint(sendToUri);
75 await endPoint.Send(obj);
76 }
77
78 ///
80 /// 这里使用fanout的交换类型
81 /// consumer必需是实现IConsumer接口的类实例
82 ///
83 ///
84 public static void ReceiveMessage(string exchange, object consumer)
85 {
86 var bus = CreateBus((cfg, host) =>
87 {
88 //从指定的消息队列获取消息 通过consumer来实现消息接收
89 cfg.ReceiveEndpoint(host, exchange, e =>
90 {
91 e.Instance(consumer);
92 });
93 });
94 bus.Start();
95 }
96 }
97 }
98
复制代码
3、“RabbitMQHelp.cs”公共类已经有了MQ“生产者”与“消费者”两个对外的静态公共方法,其中“生产者”方法可以在业务代码中直接调用,可传递JSON、对象等类型的参数向指定的交换器发送数据。而“消费者”方法是从指定交换器中进行接收绑定,但接收到的数据处理功能则交给了“consumer”类(因为在实际项目中,不同的数据有不同的业务处理逻辑,所以这里我们直接就通过IConsumer接口交给具体的实现类去做了)。那么,下面我们再来看看消费者里传递进来的“consumer”类的代码吧:
复制代码
1 using MassTransit;
2 using System;
3 using System.Collections.Generic;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Lezhima.Storage.Consumer
8 {
9 ///
11 /// 实现MassTransit的IConsumer接口
12 ///
13 public class LogConsumer : IConsumer
14 {
15 ///
17 /// 接收并处理数据
18 ///
19 ///
20 ///
21 public Task Consume(ConsumeContext context)
22 {
23 return Task.Run(async () =>
24 {
25 //获取接收到的对象
26 var amsg = context.Message;
27 Console.WriteLine($"Recevied By Consumer:{amsg}");
28 Console.WriteLine($"Recevied By Consumer:{amsg.ActionLogId}");
29 });
30 }
31 }
32 }
33
复制代码
调用代码
1、生产者调用代码如下:
复制代码
1 ///
3 ///
4 ///
5 [HttpGet]
6 public async Task AddMessageTest()
7 {
8 //声明一个实体对象
9 var model = new ActionLog();
10 model.ActionLogId = Guid.NewGuid();
11 model.CreateTime = DateTime.Now;
12 model.UpdateTime = DateTime.Now;
13 //调用MQ
14 await RabbitMQHelp.PushMessage(RabbitMQHelp.actionLogExchange, model);
15
16 return new MobiResult(1000, "操作成功");
17 }
复制代码
2、消费者调用代码如下:
复制代码
1 using Lezhima.Storage.Consumer;
2 using Microsoft.Extensions.Configuration;
3 using System;
4 using System.IO;
5
6 namespace Lezhima.Storage
7 {
8 class Program
9 {
10 static void Main(string[] args)
11 {
12 var conf = new ConfigurationBuilder()
13 .SetBasePath(Directory.GetCurrentDirectory())
14 .AddJsonFile("appsettings.json", true, true)
15 .Build();
16
17 //调用接收者
18 RabbitMQHelp.ReceiveMessage(RabbitMQHelp.actionLogExchange,
19 new LogConsumer()
20 );
21
22 Console.ReadLine();
23 }
24 }
25 }
26
复制代码
总结
1、基于MassTransit库使得我们使用RabbitMQ变得更简洁、方便。而基于再次封装后,生产者与消费者将不需要关注具体的业务,也跟业务代码解耦了,更能适应项目的需要。
2、RabbitMQ的交换器需在其管理后台自行创建,而这里使用的fanout类型是因为其发送速度最快,且能满足我的项目需要,各位可视自身情况选用不同的类型。fanout类型不会存储消息,必需要消费者绑定交换器后才会发送给消费者。
NET Core 2.0利用MassTransit集成RabbitMQ的更多相关文章
- ASP.NET Core2利用MassTransit集成RabbitMQ
在ASP.NET Core上利用MassTransit来集成使用RabbitMQ真的很简单,代码也很简洁.近期因为项目需要,我便在这基础上再次进行了封装,抽成了公共方法,使得使用RabbitMQ的调用 ...
- .Net core 2.0 利用Attribute获取MVC Action来生成菜单
最近在学习.net core的同时将老师的MVC5项目中的模块搬过来用,其中有一块就是利用Attribute来生成菜单. 一·首先定义Action实体 /// <summary> /// ...
- Dapr Pub/Sub 集成 RabbitMQ 、Golang、Java、DotNet Core
前置条件: <Dapr运用> <Dapr 运用之 Java gRPC 调用篇> <Dapr 运用之集成 Asp.Net Core Grpc 调用篇> 搭建 Rabb ...
- asp.net core 2.0集成signalr
在博客园也很多年了,一直未曾分享过什么东西,也没有写过博客,但自己也是汲取着博客园的知识成长的: 这两天想着不能这么无私,最近.NET CORE貌似挺流行的,闲来无事也自己搞了个asp.net cor ...
- asp.net core 2.0 webapi集成signalr
asp.net core 2.0 webapi集成signalr 在博客园也很多年了,一直未曾分享过什么东西,也没有写过博客,但自己也是汲取着博客园的知识成长的: 这两天想着不能这么无私,最近.N ...
- .NET Core 3.0之深入源码理解Kestrel的集成与应用(一)
写在前面 ASP.NET Core 的 Web 服务器默认采用Kestrel,这是一个基于libuv(一个跨平台的基于Node.js异步I/O库)的跨平台.轻量级的Web服务器. 在开始之前,先回 ...
- DotNet Core 1.0 集成 CentOS 开发与运行环境部署
一. DotNet Core 1.0 开发环境部署 操作系统安装 我们使用CentOS 7.2.1511版本. 安装libunwind库 执行:sudo yum install libunwi ...
- .NET Core 3.0之深入源码理解Kestrel的集成与应用(二)
前言 前一篇文章主要介绍了.NET Core继承Kestrel的目的.运行方式以及相关的使用,接下来将进一步从源码角度探讨.NET Core 3.0中关于Kestrel的其他内容,该部分内容,我们 ...
- ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介
概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...
随机推荐
- iOS 学习@autoreleasepool{}
" ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有al ...
- C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServic
C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider DESCryptoS ...
- 计算机网络概述---传输层 UDP和TCP
传输层的功能 传输层为应用进程间提供端到端的逻辑通信(网络层是提供主机之间的逻辑通信), 传输层两大重要的功能:复用 和 分用. 复用:在发送端,多个应用进程公用一个传输层: 分用:在接收端,传输层会 ...
- samtools使用过程中出现的问题
1.EOP marker is absent 在使用samtools index时出现 EOF是指the end of file,即samtools认为你的bam文件是不完整的. 如果把view参数的 ...
- request模块 一基础部分
一.HTTP请求 通过requests发送网络请求,方法有get post put delete head options import requests r=requests.get(" ...
- mini2440移植uboot 2014.04(六)
上一篇博文:<mini2440移植uboot 2014.04(五)> 代码已经上传到github上:https://github.com/qiaoyuguo/u-boot-2014.04- ...
- Centos7 关闭Ipv6
- Spark 属性配置
1.Spark1.x 属性配置方式 Spark属性提供了大部分应用程序的控制项,并且可以单独为每个应用程序进行配置. 在Spark1.0.0提供了3种方式的属性配置: SparkConf方式 Spar ...
- jquery02-jQuery效果=隐藏和显示+切换+淡入淡出+滑动+动画+回调+链
隐藏和显示 $(selector).hide(speed,callback); $(selector).show(speed,callback); 可选的 speed 参数规定隐藏/显示的速度, ...
- 关于UML方法学图中类之间的关系:依赖,泛化,关联
类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什 ...