Masstransit 是一个非常优秀的基于消息进行通信的分布式应用程序框架,详情参考官网

在介绍AA.ServiceBus开源地址:https://github.com/ChengLab/AAFrameWork  之前,先介绍下几个概念.

分布式

分布式系统如何定义?这里引用一下Distributed Systems Concepts and Design(Third Edition)中的一句话:"A distributed system is one in which components located at networked computers communicate and coordinate their actions only by passing messages"(分布式系统是指位于联网计算机上的组件仅通过传递消息来通信和协调其操作的系统)。从这句话里面我们可以看到几个重点:
1、组件分布在网络计算机上
2、组件之间仅仅通过消息传递来通信并协调行动
严格讲,同一个分布式系统中的计算机在空间部署上是可以随意分布的,这些计算机可能被放在不同的机柜上,也可能在不同的机房中,甚至分布在不同的城市。

中间件

中间件是介于操作系统和在其上运行的应用程序之间的软件。中间件实质上充当隐藏转换层,实现了分布式应用程序的通信和数据管理。它有时被称为管道,因为它将两个应用程序连接在一起,使数据和数据库可在“管道”间轻松传递。参考Azure

常见的中间件比如:远程过程调用中间件,消息中间件,数据库访问中间。

消息中间件

Message-oriented middleware (MOM) is software or hardware infrastructure supporting sending and receiving messages between distributed systems.

面向消息的中间件(MOM)是支持在分布式系统之间发送和接收消息的软件或硬件基础设施

AA.ServiceBus 介绍

AA.ServiceBus 是基于MassTransit的消息中间件,提供点对点和发布订阅的通信方式。这两个之间的区别:

  • 端点对端点通信 该消息仅处理一次 并且被一个消费者处理。

例如命名模式 命令告诉服务做某事,推荐动词-名词顺序的命名风格:如提交订单命令(SubmitOrder)

  • 发布订阅通信 可以被多个订阅者进行消费处理。

例如事件驱动模式 事件意味着某事已经发生了,推荐以名词-动词(过去时态)顺序的命名风格,表明发生了某事。示例订单提交过了事件 OrderSubmitted

目前实现消息中间件有多种方式,参考微服务.NET:容器化应用架构指南 如图

AA.ServiceBus 快速开始

实例我们创建两个控制台程序生产者、消费者分别命名ServiceBus.Producers、ServiceBus.Consumers,然后在创建一个消息契约类库命名为ServiceBus.MsgContract ,分别被生产者和消费者引用。

1.在消息契约类库中创建两个消息 分别是 提交订单 SubmitOrder 和 订单已提交OrderSubmitted代码如下

 public interface OrderSubmitted
{
long Id { get; set; }
decimal OrderPrice { get; set; }
} public interface SubmitOrder
{
long Id { get; set; }
Decimal OrderPrice { get; set; }
}

2.在生产者控制台项目中安装Install-Package AA.ServiceBus -Version 1.0.0,生产者主要对消息的构造然后进行发送或发布;

public class Producer
{
public static void TestProducer()
{
//rabbitmq 配置
string rabbitMqUri = "rabbitmq://localhost:5672";
string rabbitMqUserName = "your";
string rabbitMqPassword = "your"; PulishEvent(rabbitMqUri, rabbitMqUserName, rabbitMqPassword);
SendCommand(rabbitMqUri, rabbitMqUserName, rabbitMqPassword);
} /// <summary>
/// 发布事件
/// </summary>
/// <param name="rabbitMqUri"></param>
/// <param name="rabbitMqUserName"></param>
/// <param name="rabbitMqPassword"></param>
private static void PulishEvent(string rabbitMqUri, string rabbitMqUserName, string rabbitMqPassword)
{
IBusControl busControl = ServiceBusManager.Instance.UseRabbitMq(rabbitMqUri, rabbitMqUserName, rabbitMqPassword)
.BuildEventProducer(); TaskUtil.Await(busControl.Publish<OrderSubmitted>(new
{
Id = ,
OrderPrice =
}));
}
/// <summary>
/// 发送命令
/// </summary>
/// <param name="rabbitMqUri"></param>
/// <param name="rabbitMqUserName"></param>
/// <param name="rabbitMqPassword"></param>
private static void SendCommand(string rabbitMqUri, string rabbitMqUserName, string rabbitMqPassword)
{
string queueName = "submitorder.queue"; ISendEndpoint busControl = ServiceBusManager.Instance.UseRabbitMq(rabbitMqUri, rabbitMqUserName, rabbitMqPassword)
.BuildCommandProducer(queueName); TaskUtil.Await(busControl.Send<SubmitOrder>(new
{
Id = ,
OrderPrice=
}));
}
}

3.在消费者控制台项目中安装Install-Package AA.ServiceBus -Version 1.0.0,生产者需要创建对应的消费者进行处理消息,只需要继承IConsumer接口即可

public class Consumer
{
public static void TestConsumer()
{
//rabbitmq 配置
string rabbitMqUri = "rabbitmq://localhost:5672";
string rabbitMqUserName = "your";
string rabbitMqPassword = "your";
string queueName = "submitorder.queue"; var busControl = ServiceBusManager.Instance.UseRabbitMq(rabbitMqUri, rabbitMqUserName, rabbitMqPassword)
.RegisterConsumer<SubmitOrderCommandConsumer>(queueName)//注册提交订单命令消费者
.RegisterConsumer<OrderSubmittedEventConsumer>(null) //注册订单已创建事件消费者
.Build();
busControl.Start();
}
}
/// <summary>
///订单已经提交了 事件消费者
/// </summary>
public class OrderSubmittedEventConsumer : IConsumer<OrderSubmitted>
{
public async Task Consume(ConsumeContext<OrderSubmitted> context)
{
var @event = context.Message;
Console.WriteLine($"接收到订单创建了事件消息单价:{@event.OrderPrice}");
//do somethings...
}
} /// <summary>
/// 提交订单 命令消费者
/// </summary>
public class SubmitOrderCommandConsumer : IConsumer<SubmitOrder>
{
public async Task Consume(ConsumeContext<SubmitOrder> context)
{
var command = context.Message;
Console.WriteLine($"接收到了创建订单命令消息单价:{command.OrderPrice}");
//do somethings...
}
}

运行消费者和生产者控制台 输出如下:

Masstransit的应用服务总线的更多相关文章

  1. 基于AgileEAS.NET企业应用平台实现基于SOA架构的应用整合方案-开篇

    开篇 系统架构的文章,准备在这段时间好好的梳理和整理一下,然后发布基于AgileEAS.NET平台之上的企业级应用架构实践,结合具体的案例来说明AgileEAS.NET平 台之上如何进行系统的逻辑架构 ...

  2. 企业服务总线Enterprise service bus介绍

    企业服务总线(Enterprise service bus). 以往企业已经实现了很多服务, 构成了面向服务的架构,也就是我们常说的SOA. 服务的参与双方都必须建立1对1 的联系,让我们回顾一下SO ...

  3. 【转载】企业服务总线Enterprise service bus介绍

    企业服务总线(Enterprise service bus). 以往企业已经实现了很多服务, 构成了面向服务的架构,也就是我们常说的SOA. 服务的参与双方都必须建立1对1 的联系,让我们回顾一下SO ...

  4. SOA实践之基于服务总线的设计

    在上文中,主要介绍了SOA的概念,什么叫做“服务”,“服务”应该具备哪些特性.本篇中,我将介绍SOA的一种很常见的设计实践--基于服务总线的设计. 基于服务总线的设计 基于总线的设计,借鉴了计算机内部 ...

  5. MassTransit 实现发布/订阅

    MassTransit 介绍  先看下masstransit 官网介绍:MassTransit 是一个自由.开源.轻量级的消息总线, 用于使用. NET 框架创建分布式应用程序.MassTransit ...

  6. 译MassTransit 快速入门

    给我看代码! 下面是MassTransit的功能设置. public class YourMessage { public string Text { get; set; } } public cla ...

  7. 译MassTransit 创建消息消费者

    创建消息消费者一个消息消费者是一个 可以消费一个或多个消息类型的类,指定IConsumer<T>接口,T为消息类型 public class UpdateCustomerConsumer ...

  8. .NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.预备知识:数据一致性 关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认 ...

  9. .NET Core微服务之基于MassTransit实现数据最终一致性(Part 2)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.案例结构与说明 在上一篇中,我们了解了MassTransit这个开源组件的基本用法,这一篇我们结合一个小案例来了解在ASP.NET C ...

随机推荐

  1. Hadoop集群(第1期)CentOS安装配置

    1.准备安装 1.1 系统简介 CentOS 是什么? CentOS是一个基于Red Hat 企业级 Linux 提供的可自由使用的源代码企业级的 Linux 发行版本.每个版本的 CentOS 都会 ...

  2. ElasticSearch2.3.1环境搭建哪些不为人知的坑

    首先说明一点,大家最好不要用什么尝鲜版,用比稳定版就好了,要不麻烦不断,另外出了问题,最好去官网,或者google搜索,因为这样靠谱些,要不现在好多都是低版本的,1.4的什么的,结果按照安装,多少情况 ...

  3. MySQL如何转SQL server

    MySql的数据如何导入到Sql Server数据库中?(转载)   本文咱讨论的重点是如何将MySql数据导入到Sql Server数据库中,所以就需要机器上同时安装了MySql和Sql Serve ...

  4. 【Linux杂记】screen命令

    screen命令: 解决的问题:有些进程启动后,一旦断开ssh容易断掉,所以新建一个screen(可以理解成窗口)并行运行 守护进程的方式:linux守护进程的方式实现开机启动某些特定的程序 屏幕命令 ...

  5. java中关于IO流的知识总结(重点介绍文件流的使用)

    今天做软件构造实验一的时候,用到了java文件流的使用,因为之前学的不是很踏实,于是决定今天好好总结一下, 也方便以后的回顾. 首先,要分清IO流中的一些基础划分: 按照数据流的方向不同可以分为:输入 ...

  6. ASP.NET Core on K8S学习初探(3)部署API到K8S

    在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...

  7. 深度探索c++对象模型 第一章

    1,声明与定义. //声明式如下: extern int x;   //对象式(变量式)声明 std::size_t numDigits(int number);  //函数式声明 class Wid ...

  8. shell遍历文件

    取文件每行的数据,需要按列取  可以 sed 加管道 使用 awk 取列 platform="list.txt" line=`grep -vc '^$' $platform` ; ...

  9. Python 3网络爬虫开发实战中文PDF+源代码+书籍软件包(免费赠送)+崔庆才

    Python 3网络爬虫开发实战中文PDF+源代码+书籍软件包+崔庆才 下载: 链接:https://pan.baidu.com/s/1H-VrvrT7wE9-CW2Dy2p0qA 提取码:35go ...

  10. LinkedList源码分析:JDK源码分析系列

    如果本文中有不正确的地方请指出由于没有留言可以在公众号添加我的好友共同讨论. 1.介绍 LinkedList 是线程不安全的,允许元素为null的双向链表. 2.继承结构 我们来看一下LinkedLi ...