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 ...
随机推荐
- Loadrunder之脚本篇——参数类型
Internal data Date/Time,Group Name,Iteration Number,Load Generator Name,Ramdom Number,Table,Unique N ...
- Qt浅谈之二十六图片滑动效果
一.简介 博客中发现有作者写的仿360的代码,觉得其中图片滑动的效果很有意思,特提取其中的代码.并加上类似mac的画面移动的动画效果. 二.详解 1.代码一:界面滑动(QWidget) (1)slid ...
- Struts2笔记01——基础MVC架构(转)
原始内容:https://www.tutorialspoint.com/struts_2/basic_mvc_architecture.htm Apache Struts 2是用来创建企业级Java ...
- level-4
[1.网页乱码的问题是如何产生的.怎么样解决?] 造成html网页乱码原因主要是html源代码内中文字内容与html编码不同造成.主要情况有以下三种: 1.比如网页源代码是gbk的编码,而内容中的中文 ...
- 【Flask】ORM 关系一对一
### 一对一的关系:在sqlalchemy中,如果想要将两个模型映射成一对一的关系,那么应该在父模型中,指定引用的时候,要传递一个`uselist=False`这个参数进去.就是告诉父模型,以后引用 ...
- 前端之CSS进阶
一.CSS属性操作 1.背景属性 常用: background-color 规定要使用的背景颜色 background-image 规定要使用的背景图像 background-repeat 规定如何重 ...
- python的计算保留小数
1.要使得算术运算的结果有小数,则运算的对象至少有一个是float型的. 2.控制小数的位数:字符串格式化 格式:需要进行格式化的字符串%插入对象 需要进行格式化的字符串中带有一个或多个嵌入的转换目标 ...
- java内置注解、元注解和自定义注解
注解的作用: 1.生成文档 2.跟踪代码依赖性 3.编译时进行格式检查 ---------------------------------------------------------------- ...
- Go tail库
HP团队出的tail库,常用于日志收集 示例代码: package main import ( "github.com/hpcloud/tail" "fmt" ...
- js,java,ajax实现跨域访问及其原理
http://blog.csdn.net/saytime/article/details/51540876 这篇文章对跨域访问做了较为细致得分析,我这里做下简单总结 1.实现跨域访问原理: 浏览器由于 ...