对于目前大多的.NET项目,其实使用的技术栈都是差不多,估计现在很少用控件开发项目的了,毕竟一大堆问题。对.NET的项目,目前比较适合的架构ASP.NET MVC,ASP.NET WebAPI,ORM(较多Dapper.NET或者其扩展,稍大一些的项目用EF等等),为了提高速度也会采用缓存(.NET自带的Memcache,或者Redis),请求较多的项目,使用Nginx做负载均衡和使用队列等等。

上面简单的介绍一下.NET的项目的技术架构,具体的技术根据具体的需求做出选择。介绍到队列,很多人都会很熟悉,例如MSMQ,RabbitMQ等等队列。既然需要使用队列,那就要考虑如何使用C#更好的操作队列。

一.RabbitMQ概述

在现在的项目中,消息队列的使用比较的频繁,消息队列的种类也较多,如:ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。

在这里主要介绍RabbitMQ消息队列,支持开放的高级消息队列协议 (AMQP)。RabbitMQ的特点:强大的应用程序消息传递;使用方便;运行在所有主要操作系统上;支持大量开发人员平台;开源和商业支持。消息队列的模式有两种模式:P2P(Point to Point),P2P模式包含三个角色:消息队列(Queue),发送者(Sender),接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。Publish/Subscribe(Pub/Sub),包含三个角色主题(Topic),发布者(Publisher),订阅者(Subscriber) 。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

上面介绍了RabbitMQ的相关特点和模式,更多的知识就不再介绍,需要了解安装和配置,可以进入官网进行细致的了解。

二.EasyNetQ组件概述

上面介绍了RabbitMQ的应用场景和使用的模式,在.NET的项目开发中,较多的使用MSMQ作为消息队列,很多人对于MSMQ的操作比较熟悉,也属于轻量级的消息队列。对于RabbitMQ是较为重量级的消息队列,有多个语言的版本,作为.NET开发者对于RabbitMQ的操作可能就比较少。在.NET项目中如何更方便的使用RabbitMQ,在这里就介绍一个.NET操作RabbitMQ的组件EasyNetQ。

EasyNetQ的目标是提供一个使.NET中的RabbitMQ尽可能简单的库。在EasyNetQ中消息应由.NET类型表示,消息应通过其.NET类型进行路由。EasyNetQ按消息类型进行路由。发布消息时,EasyNetQ会检查其类型,并根据类型名称,命名空间和装配体给出一个路由密钥。在消费方面,用户订阅类型。订阅类型后,该类型的消息将路由到订户。默认情况下,EasyNetQ使用Newtonsoft.Json库将.NET类型序列化为JSON。这具有消息是人类可读的优点,因此您可以使用RabbitMQ管理应用程序等工具来调试消息问题。

EasyNetQ是在RabbitMQ.Client库之上提供服务的组件集合。这些操作可以像序列化,错误处理,线程编组,连接管理等。它们由mini-IoC容器组成。您可以轻松地用自己的实现替换任何组件。因此,如果您希望XML序列化而不是内置的JSON,只需编写一个ISerializer的实现并将其注册到容器。

以下是官方提供的一个结构图,这个结构图可以很好的解析该组件的结构:

三.EasyNetQ组件使用方式

介绍完毕EasyNetQ组件的相关背景,现在就要介绍一下该组件的使用方式。EasyNetQ组件的使用方式比较简单,跟很多组件都类似,例如:建立连接,进行操作做等等,对于EasyNetQ组件也是如此。

1.创建连接:

var bus = RabbitHutch.CreateBus(“host=myServer;virtualHost=myVirtualHost;username=mike;password=topsecret”);

与RabbitMQ服务器的延迟连接由IBus接口表示,创建连接的方式连接字符串由格式为key = value的键/值对组成,每一个用分号(;)分隔。host:主机地址;virtualHost:默认是默认的虚拟主机'/';username:用户名,默认为'guest';password:密码,默认是'guest';

   2.关闭连接:

bus.Dispose();

要关闭连接,只需简单地处理总线,这将关闭EasyNetQ使用的连接,渠道,消费者和所有其他资源。

  3.发布消息:

var message = new MyMessage { Text = "Hello Rabbit" };
bus.Publish(message);

   4.订阅邮件:

bus.Subscribe<MyMessage>("my_subscription_id", msg => Console.WriteLine(msg.Text));

5.远程过程调用:

var request = new TestRequestMessage {Text = "Hello from the client! "};
bus.Request<TestRequestMessage, TestResponseMessage>(request, response => Console.WriteLine("Got response: '{0}'", response.Text));

 6.RPC服务器:

bus.Respond<TestRequestMessage, TestResponseMessage>(request => new TestResponseMessage{ Text = request.Text + " all done!" });

 7.记录器:

var logger = new MyLogger() ;
var bus = RabbitHutch.CreateBus(“my connection string”, x => x.Register<IEasyNetQLogger>(_ => logger));

  8.路由:

bus.Subscribe("my_id", handler, x => x.WithTopic("X.*"));

RabbitMQ具有非常好的功能,基于主题的路由,允许订阅者基于多个标准过滤消息。*(星号)匹配一个字。#(哈希)匹配为零个或多个单词。

四.EasyNetQ组件核心对象解析

上面简单的介绍了一下该组件的应用方式,还有比较多的方式没有做介绍,又需要的可以做深入的了解。在这里介绍一下该组件的一些核心的对象。

 1.RabbitHutch.CreateBus():

 public static IBus CreateBus(ConnectionConfiguration connectionConfiguration, AdvancedBusEventHandlers advancedBusEventHandlers,              Action<IServiceRegister> registerServices){Preconditions.CheckNotNull(connectionConfiguration, "connectionConfiguration");Preconditions.CheckNotNull(advancedBusEventHandlers, "advancedBusEventHandlers");Preconditions.CheckNotNull(registerServices, "registerServices");var container = createContainerInternal();if (container == null){throw new EasyNetQException("Could not create container. " +"Have you called SetContainerFactory(...) with a function that returns null?");}connectionConfiguration.Validate();container.Register(_ => connectionConfiguration);container.Register(_ => advancedBusEventHandlers);registerServices(container);ComponentRegistration.RegisterServices(container);return container.Resolve<IBus>();}

在RabbitHutch类中主要包含的方法是CreateBus()方法,具有12个重载。该方法主要根据用户的连接配置信息,连接服务端。该方法接收三个参数,connectionConfiguration表示连接实例,advancedBusEventHandlers用于添加处理程序的AdvancedBusEventHandlers实例到新创建的IBus.Advanced”的事件。registerServices覆盖默认服务。 ComponentRegistration.RegisterServices(container);在我们内部的超简单IoC容器中注册默认的EasyNetQ组件。container.Resolve<IBus>()获取所请求的服务的实例。 注意所有服务都是单例的,多次通话Resolve将返回相同的实例。

 2.IBus.Publish():

  public virtual void Publish<T>(T message, Action<IPublishConfiguration> configure) where T : class{Preconditions.CheckNotNull(message, "message");Preconditions.CheckNotNull(configure, "configure");var configuration = new PublishConfiguration(conventions.TopicNamingConvention(typeof(T)));configure(configuration);var messageType = typeof(T);var easyNetQMessage = new Message<T>(message){Properties ={DeliveryMode = messageDeliveryModeStrategy.GetDeliveryMode(messageType)}};if (configuration.Priority != null)easyNetQMessage.Properties.Priority = configuration.Priority.Value;if (configuration.Expires != null)easyNetQMessage.Properties.Expiration = configuration.Expires.ToString();var exchange = publishExchangeDeclareStrategy.DeclareExchange(advancedBus, messageType, ExchangeType.Topic);advancedBus.Publish(exchange, configuration.Topic, false, easyNetQMessage);}

该方法用于发布消息,该方法是一个虚方法,在子类中可以被重写。 var configuration = new PublishConfiguration(conventions.TopicNamingConvention(typeof(T)))用于定义发布信息的配置,Message定义邮件正文内容。

五.总结

以上是对该组件的简单的介绍,如果需要了解更多的内容可以自己去深入的学习和研究。知识在于自己的勤奋,他人只是一个简单的引导。

http://www.cnblogs.com/pengze0902/p/6654296.html

简单易用的.NET免费开源RabbitMQ操作组件EasyNetQ解析相关推荐

  1. Naive UI - 火热出炉!基于 Vue 3.0/TypeScript 的免费开源前端 UI 组件库

    非大厂 KPI 项目!开源三天就收获 800 Star,还获得 Vue 作者尤雨溪的官方推荐. 关于 Naive UI Naive UI 是一款基于当前比较新的 Vue 3.0/TypeScript ...

  2. xgplayer.js 西瓜播放器 - 字节跳动团队出品的免费开源 HTML5 视频播放组件,内置解析器、也能节省流量

    一个功能强大,符合国内视频播放业务的 web 视频播放组件,由西瓜视频技术团队官方出品. 关于西瓜播放器 西瓜播放器 (xgplayer.js) 不是一个看片软件,而是一个 Web 开发上的视频播放器 ...

  3. 网上报名考试管理系统-功能齐全安全稳定-简单易用-系统试用免费

    1.系统简述 1.1.我们这款系统服务于事业单位人事招聘考试业务,覆盖人事招聘,考务管理,人才储备整套业务体系的SaaS软件系统,基于云计算技术开发,系统包含:招聘公告发布,网上报名.资格审查.在线缴 ...

  4. .NET使用免费开源类库操作Excel

    2019独角兽企业重金招聘Python工程师标准>>> 自从上次找到NPOI之后,根据园友提供的线索以及Google,又找到了一些开源免费的类库,所以都简单体验了一遍. 主要找到以下 ...

  5. 老牌开源Office操作组件NPOI现已支持.NET Core

    昨天在微信群里听到老牌Excel开发利器NPOI的作者瞿总说4.6.1版本的NPOI已经支持.NET Standard 2.0了,这也就意味着你可以在.NET Core中使用NPOI了. 作者:依乐祝 ...

  6. 免费的PDF转Word工具(简单易用)

    免费的PDF转Word工具(简单易用) 本篇文章,分享一个简单易用的,免费的PDF转Word工具:非常好用,下面是下载链接 下载地址 安装使用教程 下载好之后直接就是一个可以直接运行的程序了(.exe ...

  7. Pear Admin Layui - 基于 Layui 打造的免费开源、快速、高效的中后台管理系统前端框架

    代码量少.学习简单.功能强大.轻量级.易扩展,轻松开发从现在开始. 关于 Pear Admin Layui Pear Admin Layui 是一个快速,简洁且高效的 admin 前端框架,使用 La ...

  8. win10上启用HEIF文件缩略图显示 - 删除没用的微软内置HEIF组件 - 安装开源免费的三方HEIF组件CopyTransHEIC

    效果图 实现步骤 使用360安全卫士自带的360软件管家,卸载win10系统自带的组件"Microsoft.HEIFImageExtension" -- 这个组件看不了heic文件 ...

  9. 推荐 8 个支持 Vue3 的前端 UI 组件库,免费开源、漂亮美观,涵盖常用的业务组件

    Vue3 正式发布已经快2年了,今年2月也正式变成 Vue 项目的默认版本,今天分享8个优秀的 Vue3 UI 组件库. Element Plus 相关网址:https://www.thosefree ...

最新文章

  1. TSC打印机DLL说明
  2. 【Android 逆向】x86 CPU 架构体系 ( CPU 模型 | 内存模型 )
  3. 干货 | 万字长文全面解析GraphQL,携程微服务背景下的前后端数据交互方案
  4. STM32 串口 #pragma import(__use_no_semihosting)解析
  5. 可能是最简单易懂的人工智能入门书
  6. Gerrit的用法及与gitlab的区别
  7. docker镜像打包save,载入load,启动run
  8. flutter 获取android 还是ios_Flutter完整开发实战详解(二十、 Android PlatformView 和键盘问题)...
  9. python判定串口已连接_python 自动识别并连接串口的实现
  10. Android中使用Ant编译打包
  11. 剑指offer面试题[58]-二叉树的下一个结点
  12. Catch That Cow抓住那只奶牛(BFS,广度优先搜索)
  13. 20150406--RBAC+添加字段栏目
  14. os.path.exists判断文件是否存在
  15. 【译】45种Javascript技巧大全
  16. Java的测试方法有哪些?自动化测试让Java测试变得更简单!
  17. netsh winsock reset命令,作用是重置 Winsock 目录
  18. 苹果一体机电脑计算机图标找不到,mac电脑airplay图标不见了怎么办
  19. metasfresh 集成 yetiforce crm
  20. 替罪羊树[Scapegoat Tree]

热门文章

  1. OpenCV交互式相机校准应用
  2. OpenCV平滑图像Smoothing Images
  3. OpenGL创建hello Window窗口
  4. C语言实现最小堆minheap(附完整源码)
  5. memcpy和strcpy的区别 ?
  6. c++ 预处理命令 #if, #ifdef, #ifndef, #else, #elif, #endif用法
  7. 证书访问_3+证书|高考注册页面可访问,具体流程看这里!
  8. PyTorch的六个学习率调整
  9. Spark远程调试配置,在IDEA中的配置
  10. Hive分区、分桶操作及其比较(转自:http://blog.csdn.net/epitomizelu/article/details/41911657)