NServiceBus
NServiceBus的核心并不依赖于MSMQ。NServiceBus可扩展性允许我们插入自行编写的通信传送器,、订阅存储器和工作流的实现。我已经基于MSMQ实现了一个传送器,还有一个则借助了WCF的NetTCP。开发人员既可以使用这些现有组件,也可以根据需要进行自定义。我们知道当前的许多SOA产品都与HTTP紧密耦合,因此NServiceBus的这种实现方式也将是个另辟蹊径的设计。
之所以选择使用MSMQ,是因为它是微软公司的两大主流的通讯技术之一(另一个是SQL Server Service Broker)。MSMQ允许双方在离线的状态下进行通信,且它提供了一整套易于使用的API,并已经集成到了.NET框架中,这一点要比Service Broker好得多。我个人认为支持离线通信是任何SOA基础框架都必须考虑的关键部分——因为Tenet of Service Autonomy 并不能保证当前通信的另一端处于可用状态。
学习创建一个简单的由客户端向服务端发送消息的订单系统。
- 创建 Client 项目
- 创建 Messages 项目
- 创建 Server 项目
- 发送订单
- 运行解决方案
创建项目之前先记得安装MSMQ消息队列服务,Windows自带这个功能了,只需要安装一下。

创建 Client 项目
让我们开始创建 Client 项目,它将负责发送订单请求到一个 NServiceBus 终结点(Endpoint)。
先创建一个解决方案命名为“Ordering”,然后添加一个名叫“Ordering.Client”的类库项目。
我们现在需要引用 NServiceBus 的程序集,最快的方式是使用 NuGet 包管理控制台。
打开 NuGet 包管理控制台:
输入以下命令:
- PM> Install-Package NServiceBus.Host-ProjectName Ordering.Client
注:需要重新加载项目
包安装程序将引用 NServiceBus 程序集并在 Client 项目中创建几个模板文件。
例如,“EndpointConfig.cs” 被用来配置项目的终结点,并且自动应用了服务端配置。
为了将配置修改为客户端配置,我们需要打开“EndpointConfig.cs”文件并修改以下代码:
- namespace Ordering.Client
- {
- using NServiceBus;
- publicclassEndpointConfig : IConfigureThisEndpoint, AsA_Client
- {
- publicvoid Customize(BusConfiguration configuration)
- {
- configuration.UsePersistence<InMemoryPersistence>();
- configuration.UseTransport<MsmqTransport>();
- }
- }
- }
- 注:仅继承的基类由 AsA_Server 修改为 AsA_Client。
稍后我们将在 Client 项目中添加更多代码,现在让我们先把焦点放在如何处理订单请求上面。
创建 Messages 项目
首先添加一个名叫“Ordering.Messages”的类库项目。
该项目将包含消息定义,并且将由客户端和服务端共享,这样两边都将获得强类型的消息描述。
在该项目中安装“NServiceBusInterfaces”NuGet包,在包管理控制台,输入以下命令:
- PM> Install-Package NServiceBus.Host -ProjectName Ordering.Messages
可以将自动添加的配置文件app.config和EndpointConfig.cs两个文件删除。
添加一个“PlaceOrder.cs”文件,在其中添加以下代码:
- namespace Ordering.Messages
- {
- publicclassPlaceOrder : ICommand
- {
- publicGuid Id { get; set; }
- publicstring Product { get; set; }
- }
- }
创建 Server 项目
现在我们可以开始创建处理订单的服务端,首先添加一个名为“Ordering.Server”的类库项目。
为该项目安装“NServiceBusHost”NuGet包,在包管理控制台,输入以下命令:
- PM> Install-Package NServiceBus.Host -ProjectName Ordering.Server
注:需要重新加载项目
添加对 Messages 项目的引用,以便服务端解释消息内容。
添加一个“PlaceOrderHandler.cs”文件,向其中写入以下代码:
- namespace Ordering.Server
- {
- publicclassPlaceOrderHandler : IHandleMessages<PlaceOrder>
- {
- publicIBus Bus { get; set; }
- publicvoid Handle(PlaceOrder message)
- {
- Console.WriteLine(@"Order for Product:{0} placed with id: {1}", message.Product, message.Id);
- }
- }
- }
发送订单
我们差不多快做好了,现在唯一剩下的就是回到 Client 项目中,添加对 Messages 项目的引用,并添加一个“SendOrder.cs”文件,向其中写入以下代码:
- namespace Ordering.Client
- {
- publicclassSendOrder : IWantToRunWhenBusStartsAndStops
- {
- publicIBus Bus { get; set; }
- publicvoid Start()
- {
- Console.WriteLine("Press 'Enter' to send a message. To exit, Ctrl+C");
- while (Console.ReadLine() !=null)
- {
- var id =Guid.NewGuid();
- Bus.Send("Ordering.Server", newPlaceOrder() { Id = id, Product ="New shoes" });
- Console.WriteLine("=============================================");
- Console.WriteLine("Send a new PlaceOrder message with id: {0}",id.ToString("N"));
- }
- }
- publicvoid Stop()
- {
- }
- }
- }
注:以上代码基于 4.x 版本,若使用 3.x 版本需要使用 “IWantToRunAtStartup”接口。
运行解决方案
已经完成编码了,现在是时候运行解决方案了。
在解决方案中设置启动项目,将 Client 和 Server 项目设置为同时运行。
最后点击 F5 按钮运行解决方案,即可看到整个系统。
将会有两个控制台应用程序启动,在客户端控制台中按下回车,将在服务端窗口中看到“Order for Product: New shoes placed”。
NServiceBus的更多相关文章
- 使用NServiceBus开发分布式应用
系列主题:基于消息的软件架构模型演变 NServiceBus 是一个.Net平台下开源的消息服务框架,这类产品有时也被称作ESB(Enterprise Service Bus)--企业服务总线.NSe ...
- SOA、ESB、NServiceBus、云计算 总结
SOA SOA 是通过功能组件化.服务化,来实现系统集成.解决信息孤岛,这是其主要目标.而更进一步则是实现更快响应业务的变化.更快推出新的应用系统.与此同时,SOA 还实现了整合资源,资源复用. SO ...
- NServiceBus 更换服务名及队列名称
可以通过起动时的参数处理 NServiceBus.Host.exe /serviceName:”服务名称” /endpointName:”默认队列名称”
- NserviceBus+rabbitmq
Ok so I figured this out after looking a bit at the code and the requirements for amqp URI and it sh ...
- NServiceBus 结合 RabbitMQ 使用
参考官方教程: Step by Step Guide 新建4个项目: A Console Application named Client A Console Application named Se ...
- NServiceBus教程-持久化配置
当配置在NServiceBus v5持久性,秩序是非常重要的.最后赢得持久性配置选项.我们看看一些例子. 示例1 在本例中最后一个配置选项将会覆盖前面的所有选项. v5.2 v5.0 编辑 var c ...
- NServiceBus教程-持久化
NServiceBus的各种特性需要持久性.其中有超时.传奇和订阅存储. 四个持久化技术在NServiceBus在使用: RavenDB nHibernate 内存中 MSMQ 读到安装Raven D ...
- NServiceBus教程-NServiceBus和WCF
WCF中缺少的最主要的事情是发布/订阅,但为什么你必须建立它自己吗?NServiceBus,你把它弄出来. 下一个重要的事情是容错.异常导致WCF代理休息,需要"刷新"的代码,但调 ...
- NServiceBus教程-消息传递与处理
nservicebus"的容错默认"设计的一部分,基础设施管理事务自动所以你不需要记住所有的线程和状态管理要素配置. 客户端和服务器 理想情况下,服务器代码处理消息事务,但它往往不 ...
随机推荐
- Div高度百分比
有时候设置高度百分比,没有效果. 原因是父元素没有设置高度. 父元素可以设置高度为具体的px.或是100%等百分比. 这样子元素再能根据百分比来设置高度. <style type="t ...
- 一行 Python 实现并行化 -- 日常多线程操作的新思路
春节坐在回家的火车上百无聊赖,偶然看到 Parallelism in one line 这篇在 Hacker News 和 reddit 上都评论过百的文章,顺手译出,enjoy:-) http:// ...
- bat面试总结
bat是国内互联网行业的龙头老大,招聘要求自然也是互联网行业最高-面试过程一般考查四个方面:基础+算法+数据结构+项目. 基础:c/c++/java等语言基础,这个根据你应聘所选的语言来定(一般不会考 ...
- 上传控件swfupload的使用笔记
1.下载下来的官方domo里不同的例子里会引入各自的JS,注意区分.可以直接拿官方例子来改成自己想要的例子. 2.注意PHP配置文件里也有最大上传文件限制,如果文件太大会上传不成功. 3.如果有问题可 ...
- 【转】Linux下的多线程编程
1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...
- 《Java数据结构与算法》笔记-CH5-链表-4用链表实现堆栈
//用链表实现堆栈 /** * 节点类 */ class LinkS { private long data; public LinkS next; public LinkS(long d) { th ...
- 《Java数据结构与算法》笔记-CH4-6优先级队列
/** * 优先级队列 * 效率:插入O(n),删除O(1).第12章介绍如何通过堆来改进insert时间 */ class PriorityQueue { private int maxSize; ...
- Mono 之 Jexus
Jexus web server for linux 是运行在Linux上的Web服务器.其安装和部署及其简单,直接支持Asp.net . 下载Jexus wget http://linux.j66. ...
- CentOS下MySQL 5.7.9编译安装
MySQL 5.7 GA版本的发布,也就是说从现在开始5.7已经可以在生产环境中使用,有任何问题官方都将立刻修复. MySQL 5.7主要特性: 更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化 ...
- Jsp页面设计易忘点
文本标签: <b>文本加粗 <i>斜体 <u>下划线 <sub>作为下标 <sup>作为上标 样式: italic;斜体 text-deco ...