对于当下大约的.NET项目,其实使用的技术栈都以大抵,测度未来很少用控件开发品种的了,终归一大堆难题。对.NET的种类,近来可比相符的架构ASP.NET
MVC,ASP.NET
WebAPI,O凯雷德M(较多Dapper.NET可能其扩展,稍大片段的类型用EF等等),为了升高速度也会利用缓存(.NET自带的Memcache,可能Redis),请求较多的品种,使用Nginx做负载均衡和行使队列等等。

 
 下边简单的牵线一下.NET的门类的技术架构,具体的技术依照实际的要求做出选用。介绍到行列,很多个人都会很纯熟,例如MSMQ,RabbitMQ等等队列。既然要求接纳队列,那就要考虑如何使用C#更好的操作队列。

一.RabbitMQ概述

 
 在到现在的档次中,新闻队列的应用比较的一再,音信队列的体系也较多,如:ActiveMQ,RabbitMQ,ZeroMQ,卡夫卡,MetaMQ,罗克etMQ等。消息队列中间件是分布式系统中最首要的机件,首要解决使用耦合,异步新闻,流量削锋等难题。落成高品质,高可用,可伸缩和最后一致性架构。是大型分布式系统不可缺失的中间件。

   在那里关键介绍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,在那里就介绍1个.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的兑现并将其注册到容器。

 
 以下是官方提供的一个协会图,那些布局图可以很好的解析该零件的布局:

图片 1

 

三.EasyNetQ组件使用方法

 
 介绍完结EasyNetQ组件的连带背景,将来将要介绍一下该零件的采纳方法。EasyNetQ组件的使用方法对比不难,跟很多组件都就像,例如:建立连接,实行操作做等等,对于EasyNetQ组件也是这般。

   1.创建连接:

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

   

与RabbitMQ服务器的推迟连接由IBus接口表示,创制连接的法子连接字符串由格式为key

value的键/值对构成,每1个用分号(;)分隔。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具有10分好的功效,基于宗旨的路由,允许订阅者基于多个规范过滤音讯。*(星号)匹配三个字。#(哈希)匹配为零个或几个单词。

四.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()方法,具有十个重载。该方法首要基于用户的连日配置音信,连接服务端。该办法接收多个参数,connectionConfiguration表示连接实例,advancedBus伊夫ntHandlers用于添加处理程序的AdvancedBus伊芙ntHandlers实例到新创造的IBus.Advanced”的事件。registerServices覆盖暗中认可服务。 ComponentRegistration.Register瑟维斯s(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定义邮件正文内容。

五.总结

 
 以上是对该器件的简约的牵线,要是急需了然越多的剧情能够团结去浓密的上学和商量。知识在于本身的任劳任怨,别人只是一个简便的指点。

相关文章

网站地图xml地图