HTML5技术

使用NServiceBus开发分布式应用 - richiezhang

字号+ 作者:H5之家 来源:博客园 2015-12-15 08:04 我要评论( )

系列主题:基于消息的软件架构模型演变 NServiceBus 是一个.Net平台下开源的消息服务框架,这类产品有时也被称作ESB(Enterprise Service Bus)企业服务总线。 NServicebus官方地址: git: https://github.com/Particular/NServiceBus NServiceBus原作者Udi Dah

系列主题:基于消息的软件架构模型演变

NServiceBus 是一个.Net平台下开源的消息服务框架,这类产品有时也被称作ESB(Enterprise Service Bus)——企业服务总线。
NServicebus官方地址:
git: https://github.com/Particular/NServiceBus
NServiceBus原作者Udi Dahan,该产品最早于2006年发行了第一个版本,这是一个企业级的开源产品,企业开发需要购买License,参照:。

一、NServiceBus的特性

1、高性能和可扩展性

可以广泛应用于许多业务领域,可扩展性和性能都经过了实战检验。

2、具有自动重试的可靠性集成

通过配置机制提供基于消息通讯的的最佳实践方案,能够识别错误响应并自动重试。

3、工作流和后台任务调度

通过Saga来完成长时间运行的流程定义和管理功能,提供强大而灵活的工作流功能。

4、消息的集中审核流程

很容易将整个分布式系统聚集到一个中心位置配置消息审核。

5、通过发布/订阅来减少耦合

提供了发布/订阅机制。可扩展、可配置、易于理解和易于使用。

6、易于扩展和配置

多个灵活的扩展点和配置选项,NServieBus可以根据用户需求对各个特性进行自定义配置。

7、支持广泛的消息传输技术

提供了MSMQ, RabbitMQ, SQL Server, Windows Azure Queues,Windows AzureService Bus消息传输机制,当然你也可以自定义或者选择由社区开发的消息传输方案。

二、.NET平台下其他ESB介绍

1、Biztalk

在微软的世界里,BizTalk Server一直是用来解决异构平台上应用程序之间数据交换的复杂集成问题。BizTalk同样提供了发布/订阅模式实现松耦合的架构。有时候你需要将现有的代码和一个运行在不同技术和协议下的历史遗留程序集成,这是一个经典的企业应用程序集成(Enterprise Application Integration-EAI)的场景。在这种场景之下,可以在业务服务之间使用NServiceBus,在这些服务的边界之内,你可以使用BizTalk与现有的历史遗留应用进行集成。

如您所见,服务边界之后的BizTalk是一个对异构应用的整合。

2、MassTransit

MassTransit是一个.NET平台下用来创建分布式应用程序的轻量级开源消息总线。

官网:

git: https://github.com/MassTransit/MassTransit

MassTransit的第一个版本开发于2007年,作者Chris Patterson 和Dru Sellers 在一个会议中偶然相识,他们觉得当时.Net平台下没有一个他们想要的服务总线框架,而那时NServiceBus也刚刚发布,很多功能都不完善,并且也没有很好的社区支持。所以他俩开发了自己的ESB产品——MassTransit,目前最新的MassTransit基于NET4.0中的异步支持重写了所有代码。MassTransit的目标并不是要在分布式领域面面俱到从而适应大型的企业级开发,而是能实现一个强壮的轻量级消息总线。

三、从Hello World开始

分布式应用开发是一个比较复杂的过程,无论从涉及的技术知识体系还是开发,调试,部署都会带来很多挑战,我希望通过这个简单的例子展示分布式开发中的基本思想。

1、准备工作

安装MSMQ服务,NServiceBus默认使用MSMQ服务,所以在开始这个例子之前确保已安装MSMQ服务。

2、 新建一个类型为Console Application的客户端:NBus.Practice.GreetingClient,客户端会命令服务端输出“Hello World”。

安装nuget包:

Install-Package NServiceBus

3、 初始化一个Bus,然后给服务端发出命令。

NServiceBus提供了多个Host方案,应用程序自己Host或者使用NServiceBus.Host程序来Host应用程序。当然你还可以将NServicBus程序Host在一个Windows服务中。这个客户端我们选择Host在客户端自身当中。

我们只是用几个必要的选项来配置bus。重点是此段代码配置了一个EndPoint:“Nbus.Practice.HelloWorld.Client”,这个名称代表了了此客户端的网络地址。

有了这些配置,我们就可以利用这些配置来创建一个bus出来。

using (IBus bus = Bus.Create(busConfiguration).Start()) { SendGreetingCommand(bus); }

接下来的代码通过bus.Send<TCommand>(TCommand cmd)方法给服务端发送一个命令:

private static void SendGreetingCommand(IBus bus) { Console.WriteLine("Press 'Enter' to send a message.To exit, Ctrl + C"); var i = 0; while (Console.ReadLine() != null) { var id = Guid.NewGuid(); bus.Send(new GreetingCommand() { Id = id, Times = i }); i++; Console.WriteLine("Send a new GreetingCommand message with id: {0}", id.ToString("N")); } }

GreetingCommand就是一个消息,在消息总线中,一切交流都是通过消息来实现的。

4、建立一个公共的类库:NBus.Practice.GreetingMessage来定义消息
定义GreetingCommand,在NServiceBus中,命令类型要继承于ICommand,事件类型要继承于IEvent,消息是一个由属性构成的简单类型,最终需要序列化并可以在网络中传播。

public class GreetingCommand:ICommand { public Guid Id { get; set; } public int Times { get; set; } }

5、这个客户端几乎要完成了,我们创建了个bus,然后发送了一条消息。现在的问题在于这条息发送给谁呢?发送给谁这件事通过配置文件来完成。

<MessageEndpointMappings> <add Messages="NBus.Practice.GreetingMessage" Endpoint="Nbus.Practice.HelloWorld.Server" /> </MessageEndpointMappings>

这个配置的含义是:将程序集NBus.Practice.GreetingMessage中的消息发送到EndPoint为Nbus.Practice.HelloWorld.Server的程序中。

6、显然我们需要一个EndPoint为Nbus.Practice.HelloWorld.Server的服务端,新建一个类型为Console Application类型的服务端:NBus.Practice.GreetingServer,并且用同样的方法创建一个bus并启动。

static void Main(string[] args) { var busConfiguration = new BusConfiguration(); busConfiguration.EndpointName("Nbus.Practice.HelloWorld.Server"); busConfiguration.UseSerialization<JsonSerializer>(); busConfiguration.UsePersistence<InMemoryPersistence>(); using (IBus bus = Bus.Create(busConfiguration).Start()) { Console.WriteLine("Press any key to exit"); Console.ReadKey(); } }

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 【Vue 入门】使用 Vue2 开发一个展示项目列表的应用 - zhangjk

    【Vue 入门】使用 Vue2 开发一个展示项目列表的应用 - zhangjk

    2017-04-30 16:00

  • 对于Bootstrap的介绍以及如何使用 - novai-L

    对于Bootstrap的介绍以及如何使用 - novai-L

    2017-04-29 09:00

  • 在Delphi下使用迅雷APlayer组件进行免注册开发 - Delphi力量

    在Delphi下使用迅雷APlayer组件进行免注册开发 - Delphi力量

    2017-04-28 15:00

  • 探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用 - nzbin

    探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用 - nzb

    2017-04-25 09:02

网友点评