在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

下载与安装: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. /// <summary>
  11. /// RabbitMQ公共操作类,基于MassTransit库
  12. /// </summary>
  13. public class RabbitMQHelp
  14. {
  15. #region 交换器
  16.  
  17. /// <summary>
  18. /// 操作日志交换器
  19. /// 同时需在RabbitMQ的管理后台创建同名交换器
  20. /// </summary>
  21. public static readonly string actionLogExchange = "Lezhima.ActionLogExchange";
  22.  
  23. #endregion
  24.  
  25. #region 声明变量
  26.  
  27. /// <summary>
  28. /// MQ联接地址,建议放到配置文件
  29. /// </summary>
  30. private static readonly string mqUrl = "rabbitmq://192.168.1.181/";
  31.  
  32. /// <summary>
  33. /// MQ联接账号,建议放到配置文件
  34. /// </summary>
  35. private static readonly string mqUser = "admin";
  36.  
  37. /// <summary>
  38. /// MQ联接密码,建议放到配置文件
  39. /// </summary>
  40. private static readonly string mqPwd = "admin";
  41.  
  42. #endregion
  43.  
  44. /// <summary>
  45. /// 创建连接对象
  46. /// 不对外公开
  47. /// </summary>
  48. private static IBusControl CreateBus(Action<IRabbitMqBusFactoryConfigurator, IRabbitMqHost> registrationAction = null)
  49. {
  50. //通过MassTransit创建MQ联接工厂
  51. return Bus.Factory.CreateUsingRabbitMq(cfg =>
  52. {
  53. var host = cfg.Host(new Uri(mqUrl), hst =>
  54. {
  55. hst.Username(mqUser);
  56. hst.Password(mqPwd);
  57. });
  58. registrationAction?.Invoke(cfg, host);
  59. });
  60. }
  61.  
  62. /// <summary>
  63. /// MQ生产者
  64. /// 这里使用fanout的交换类型
  65. /// </summary>
  66. /// <param name="obj"></param>
  67. public async static Task PushMessage(string exchange, object obj)
  68. {
  69. var bus = CreateBus();
  70. var sendToUri = new Uri($"{mqUrl}{exchange}");
  71. var endPoint = await bus.GetSendEndpoint(sendToUri);
  72. await endPoint.Send(obj);
  73. }
  74.  
  75. /// <summary>
  76. /// MQ消费者
  77. /// 这里使用fanout的交换类型
  78. /// consumer必需是实现IConsumer接口的类实例
  79. /// </summary>
  80. /// <param name="obj"></param>
  81. public static void ReceiveMessage(string exchange, object consumer)
  82. {
  83. var bus = CreateBus((cfg, host) =>
  84. {
  85. //从指定的消息队列获取消息 通过consumer来实现消息接收
  86. cfg.ReceiveEndpoint(host, exchange, e =>
  87. {
  88. e.Instance(consumer);
  89. });
  90. });
  91. bus.Start();
  92. }
  93. }
  94. }

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. /// <summary>
  10. /// 从MQ接收并处理数据
  11. /// 实现MassTransit的IConsumer接口
  12. /// </summary>
  13. public class LogConsumer : IConsumer<ActionLog>
  14. {
  15. /// <summary>
  16. /// 实现Consume方法
  17. /// 接收并处理数据
  18. /// </summary>
  19. /// <param name="context"></param>
  20. /// <returns></returns>
  21. public Task Consume(ConsumeContext<ActionLog> 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. }

调用代码

1、生产者调用代码如下:

  1. /// <summary>
  2. /// 测试MQ生产者
  3. /// </summary>
  4. /// <returns></returns>
  5. [HttpGet]
  6. public async Task<MobiResult> 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. }

总结

1、基于MassTransit库使得我们使用RabbitMQ变得更简洁、方便。而基于再次封装后,生产者与消费者将不需要关注具体的业务,也跟业务代码解耦了,更能适应项目的需要。

2、RabbitMQ的交换器需在其管理后台自行创建,而这里使用的fanout类型是因为其发送速度最快,且能满足我的项目需要,各位可视自身情况选用不同的类型。fanout类型不会存储消息,必需要消费者绑定交换器后才会发送给消费者。

声明

本文为作者原创,转载请备注出处与保留原文地址,谢谢。如文章能给您带来帮助,请点下推荐或关注,感谢您的支持!

ASP.NET Core2利用MassTransit集成RabbitMQ的更多相关文章

  1. NET Core 2.0利用MassTransit集成RabbitMQ

    NET Core 2.0利用MassTransit集成RabbitMQ https://www.cnblogs.com/Andre/p/9579764.html 在ASP.NET Core上利用Mas ...

  2. ASP.NET Core2利用Jwt技术在服务端实现对客户端的身份认证

    背景 在微服务架构下,一般都会按不同的业务或功能将整个系统切分成不同的独立子系统,再通过REST API或RPC进行通讯并相互调用,形成各个子系统之间的串联结构.在这里,我们将采用REST API的通 ...

  3. ASP.NET MVC:利用ASP.NET MVC4的IBundleTransform集成LESS

    ASP.NET MVC:利用ASP.NET MVC4的IBundleTransform集成LESS 背景 LESS确实不错,只是每次写完LESS都要手工编译一下有点麻烦(VS插件一直没有安装好),昨天 ...

  4. ASP.NET Core2基于RabbitMQ对Web前端实现推送功能

    在我们很多的Web应用中会遇到需要从后端将指定的数据或消息实时推送到前端,通常的做法是前端写个脚本定时到后端获取,或者借助WebSocket技术实现前后端实时通讯.因定时刷新的方法弊端很多(已不再采用 ...

  5. 一步一步带你做WebApi迁移ASP.NET Core2.0

    随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP ...

  6. 【4】Asp.Net Core2.2中间件多扩展对应应用

    [前言] 上一篇完成了Asp.Net Core 2.2全新的管道处理模型解析,“俄罗斯套娃”式的委托嵌套和传递,组建了扩展性无与伦比的管道模型!与此同时,委托嵌套过于复杂,使用起来并不友好,然后多种扩 ...

  7. 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 查看硬 ...

  8. ASP.NET Core2调用Azure云上的PowerBI报表展示

    在开发企业应用中,报表功能是当之无愧的重头戏,如何将数据通过合适的报表呈现出来成为每个项目人员必需面临的问题.而找到一款合适的报表往往都需要考率价格.开发.风格.支撑等因素.那么,我在这里给大家介绍一 ...

  9. WebApi迁移ASP.NET Core2.0

    WebApi迁移ASP.NET Core2.0 一步一步带你做WebApi迁移ASP.NET Core2.0   随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的AS ...

随机推荐

  1. ipv6地址累加函数

    #include <stdio.h> #include <arpa/inet.h> int main() { int i; int ret; struct in6_addr a ...

  2. UI设计教程分享:让你彻底读懂字体

    一份普普通通.规规矩矩的设计 一份让人印象深刻.新颖有趣的设计 差在哪?其实就差在三个字上! “优秀的设计不是每一个细节都有亮点,而是弱化其他元素,让某一个亮点最大化.” 今天“骉叔的设计心得”就来总 ...

  3. 适合新手小白的UI学习路线完整版

    UI设计是很多年轻人活着想转行学习的人的新职业目标,越来越多的人看到UI设计良好的就业发展前景,纷纷投入到UI设计的大军中来,想学习UI设计,很多小白并不知道从何开始学起,用什么样的方法去学习,所以今 ...

  4. YII配置mysql读写分离

    Mysql 读写分离 YIi 配置 <?php return [ 'class' => 'yii\db\Connection', 'masterConfig' => [ // 'ds ...

  5. 日志分析工具、日志管理系统、syslog分析

    日志分析工具.日志管理系统.syslog分析 系统日志(Syslog)管理是几乎所有企业的重要需求.系统管理员将syslog看作是解决网络上系统日志支持的系统和设备性能问题的关键资源.人们往往低估了对 ...

  6. JavaScript函数和内置对象

    一.函数 function f1(){ console.log("666"); } f1(); //调用函数 1.普通函数定义 function f1(a,b){ console. ...

  7. 通过http.client解析url返回的数据时为什么中文变成了unicode码

    今天在解析json数据的时候得到了一堆这样的数据:{"errNum":0,"errMsg":"success","retData& ...

  8. 2018.12.15 bzoj3676: [Apio2014]回文串(后缀自动机)

    传送门 对原串建立一个后缀自动机,然后用反串在上面匹配. 如果当前匹配的区间[l,r][l,r][l,r]包裹了当前状态的endposendposendpos中的最大值,那么[l,maxpos][l, ...

  9. 高性能Java RPC框架Dubbo与zookeeper的使用

    https://blog.csdn.net/qq_38982845/article/details/83795295

  10. $.cookie is not a function的错误原因

    网上说的原因是:“手残导入2次jquery库文件 ” 是的,就是这个原因.引入了两次jquery.js