ASP.NET Core2利用MassTransit集成RabbitMQ
在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”公共类主要对外封装两个静态方法,其代码如下:
using MassTransit;
using MassTransit.RabbitMqTransport;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace Lezhima.Comm
{
/// <summary>
/// RabbitMQ公共操作类,基于MassTransit库
/// </summary>
public class RabbitMQHelp
{
#region 交换器
/// <summary>
/// 操作日志交换器
/// 同时需在RabbitMQ的管理后台创建同名交换器
/// </summary>
public static readonly string actionLogExchange = "Lezhima.ActionLogExchange";
#endregion
#region 声明变量
/// <summary>
/// MQ联接地址,建议放到配置文件
/// </summary>
private static readonly string mqUrl = "rabbitmq://192.168.1.181/";
/// <summary>
/// MQ联接账号,建议放到配置文件
/// </summary>
private static readonly string mqUser = "admin";
/// <summary>
/// MQ联接密码,建议放到配置文件
/// </summary>
private static readonly string mqPwd = "admin";
#endregion
/// <summary>
/// 创建连接对象
/// 不对外公开
/// </summary>
private static IBusControl CreateBus(Action<IRabbitMqBusFactoryConfigurator, IRabbitMqHost> registrationAction = null)
{
//通过MassTransit创建MQ联接工厂
return Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri(mqUrl), hst =>
{
hst.Username(mqUser);
hst.Password(mqPwd);
});
registrationAction?.Invoke(cfg, host);
});
}
/// <summary>
/// MQ生产者
/// 这里使用fanout的交换类型
/// </summary>
/// <param name="obj"></param>
public async static Task PushMessage(string exchange, object obj)
{
var bus = CreateBus();
var sendToUri = new Uri($"{mqUrl}{exchange}");
var endPoint = await bus.GetSendEndpoint(sendToUri);
await endPoint.Send(obj);
}
/// <summary>
/// MQ消费者
/// 这里使用fanout的交换类型
/// consumer必需是实现IConsumer接口的类实例
/// </summary>
/// <param name="obj"></param>
public static void ReceiveMessage(string exchange, object consumer)
{
var bus = CreateBus((cfg, host) =>
{
//从指定的消息队列获取消息 通过consumer来实现消息接收
cfg.ReceiveEndpoint(host, exchange, e =>
{
e.Instance(consumer);
});
});
bus.Start();
}
}
}
3、“RabbitMQHelp.cs”公共类已经有了MQ“生产者”与“消费者”两个对外的静态公共方法,其中“生产者”方法可以在业务代码中直接调用,可传递JSON、对象等类型的参数向指定的交换器发送数据。而“消费者”方法是从指定交换器中进行接收绑定,但接收到的数据处理功能则交给了“consumer”类(因为在实际项目中,不同的数据有不同的业务处理逻辑,所以这里我们直接就通过IConsumer接口交给具体的实现类去做了)。那么,下面我们再来看看消费者里传递进来的“consumer”类的代码吧:
using MassTransit;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace Lezhima.Storage.Consumer
{
/// <summary>
/// 从MQ接收并处理数据
/// 实现MassTransit的IConsumer接口
/// </summary>
public class LogConsumer : IConsumer<ActionLog>
{
/// <summary>
/// 实现Consume方法
/// 接收并处理数据
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public Task Consume(ConsumeContext<ActionLog> context)
{
return Task.Run(async () =>
{
//获取接收到的对象
var amsg = context.Message;
Console.WriteLine($"Recevied By Consumer:{amsg}");
Console.WriteLine($"Recevied By Consumer:{amsg.ActionLogId}");
});
}
}
}
调用代码
1、生产者调用代码如下:
/// <summary>
/// 测试MQ生产者
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MobiResult> AddMessageTest()
{
//声明一个实体对象
var model = new ActionLog();
model.ActionLogId = Guid.NewGuid();
model.CreateTime = DateTime.Now;
model.UpdateTime = DateTime.Now;
//调用MQ
await RabbitMQHelp.PushMessage(RabbitMQHelp.actionLogExchange, model);
return new MobiResult(1000, "操作成功");
}
2、消费者调用代码如下:
using Lezhima.Storage.Consumer;
using Microsoft.Extensions.Configuration;
using System;
using System.IO;
namespace Lezhima.Storage
{
class Program
{
static void Main(string[] args)
{
var conf = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.Build();
//调用接收者
RabbitMQHelp.ReceiveMessage(RabbitMQHelp.actionLogExchange,
new LogConsumer()
);
Console.ReadLine();
}
}
}
总结
1、基于MassTransit库使得我们使用RabbitMQ变得更简洁、方便。而基于再次封装后,生产者与消费者将不需要关注具体的业务,也跟业务代码解耦了,更能适应项目的需要。
2、RabbitMQ的交换器需在其管理后台自行创建,而这里使用的fanout类型是因为其发送速度最快,且能满足我的项目需要,各位可视自身情况选用不同的类型。fanout类型不会存储消息,必需要消费者绑定交换器后才会发送给消费者。
声明
本文为作者原创,转载请备注出处与保留原文地址,谢谢。如文章能给您带来帮助,请点下推荐或关注,感谢您的支持!
ASP.NET Core2利用MassTransit集成RabbitMQ的更多相关文章
- NET Core 2.0利用MassTransit集成RabbitMQ
NET Core 2.0利用MassTransit集成RabbitMQ https://www.cnblogs.com/Andre/p/9579764.html 在ASP.NET Core上利用Mas ...
- ASP.NET Core2利用Jwt技术在服务端实现对客户端的身份认证
背景 在微服务架构下,一般都会按不同的业务或功能将整个系统切分成不同的独立子系统,再通过REST API或RPC进行通讯并相互调用,形成各个子系统之间的串联结构.在这里,我们将采用REST API的通 ...
- ASP.NET MVC:利用ASP.NET MVC4的IBundleTransform集成LESS
ASP.NET MVC:利用ASP.NET MVC4的IBundleTransform集成LESS 背景 LESS确实不错,只是每次写完LESS都要手工编译一下有点麻烦(VS插件一直没有安装好),昨天 ...
- ASP.NET Core2基于RabbitMQ对Web前端实现推送功能
在我们很多的Web应用中会遇到需要从后端将指定的数据或消息实时推送到前端,通常的做法是前端写个脚本定时到后端获取,或者借助WebSocket技术实现前后端实时通讯.因定时刷新的方法弊端很多(已不再采用 ...
- 一步一步带你做WebApi迁移ASP.NET Core2.0
随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP ...
- 【4】Asp.Net Core2.2中间件多扩展对应应用
[前言] 上一篇完成了Asp.Net Core 2.2全新的管道处理模型解析,“俄罗斯套娃”式的委托嵌套和传递,组建了扩展性无与伦比的管道模型!与此同时,委托嵌套过于复杂,使用起来并不友好,然后多种扩 ...
- Centos7 编译安装 Nginx Mariadb Asp.net Core2 (实测 笔记 Centos 7.3 + Openssl 1.1.0h + Mariadb 10.3.7 + Nginx 1.14.0 + Asp.net. Core 2 )
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7-x86_64-Minimal-1611.iso 安装步骤: 1.准备 1.0 查看硬 ...
- ASP.NET Core2调用Azure云上的PowerBI报表展示
在开发企业应用中,报表功能是当之无愧的重头戏,如何将数据通过合适的报表呈现出来成为每个项目人员必需面临的问题.而找到一款合适的报表往往都需要考率价格.开发.风格.支撑等因素.那么,我在这里给大家介绍一 ...
- WebApi迁移ASP.NET Core2.0
WebApi迁移ASP.NET Core2.0 一步一步带你做WebApi迁移ASP.NET Core2.0 随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的AS ...
随机推荐
- linux日志查找技巧
1.查找日志最后10行 tail -n test.log 查询日志尾部最后10行的日志; 2.关键词查询 grep '2014-12-17 16:17:20' test.log
- where
(二)WHERE //where不单独使用,与match,optional match,start,with搭配 where 与match,optional match 一起用,表示约束 where ...
- windows一键配置 php mysql apache 记录
记录下 方便查找(最近机器老重装 资料丢失严重) wamp http://www.wampserver.com/en/#download-wrapper https://sourceforge.net ...
- Maven中maven-source-plugin,maven-javadoc-plugin插件的使用
摘要:今天领导说要把项目通过maven生产源码包和文档包并发布到自己的私服上,经过查看mavne官网发现有两个maven插件可以做到这些工作,一个是maven-source-plugin,另一个是ma ...
- OneZero第三周第五次站立会议(2016.4.8)
1. 时间: 15:10--15:25 共计15分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http ...
- 41.App 框架的搭建思路以及代码的规范
本链接 引用别人文章https://www.jianshu.com/p/d553096914ff
- 2019.02.09 codeforces gym 100548F. Color(容斥原理)
传送门 题意简述:对n个排成一排的物品涂色,有m种颜色可选. 要求相邻的物品颜色不相同,且总共恰好有K种颜色,问所有可行的方案数.(n,m≤1e9,k≤1e6n,m\le1e9,k\le1e6n,m≤ ...
- Codeforces 1107 简要题解
文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 A题 传送门 题意简述:问你能不能把一个数字串切成若干块,使得切出来的kkk个数k≤2k\le2k≤2满足a1<a2<...&l ...
- 2019.01.19 洛谷P2787 语文1(chin1)- 理理思维(ODT)
传送门 ODTODTODT水题. 题意:有一个字母序列,支持区间赋值,查询区间某个字母的数量,区间按字母序排序. 思路: 可以开262626棵线段树搞过去,然而也可以用ODTODTODT秒掉. 如果用 ...
- Codeforces Round #543 (Div. 2) D 双指针 + 模拟
https://codeforces.com/contest/1121/problem/D 题意 给你一个m(<=5e5)个数的序列,选择删除某些数,使得剩下的数按每组k个数以此分成n组(n*k ...