Eventbus的功能

http://masstransit-project.com/

MassTransit is a free, open source, lightweight message bus for creating distributed applications using the .NET framework. MassTransit provides an extensive set of features on top existing message transports, resulting in a developer friendly way to asynchronously connect services using message-based conversation patterns. Message-based communication is a reliable and scalable way to implement a service oriented architecture.

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 = 1010,
OrderPrice = 1024
}));
}
/// <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 = 1010,
OrderPrice=1024
}));
}
}

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...
}
}

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

Eventbus的功能的更多相关文章

  1. 事件总线功能库,Reface.EventBus 详细使用教程

    Reface.AppStarter 中的事件总线功能是通过 Reface.EventBus 提供的. 参考文章 : Reface.AppStarter 框架初探 使用 Reface.EventBus ...

  2. 分布式事务,EventBus 解决方案:CAP【中文文档】

    前言 很多同学想对CAP的机制以及用法等想有一个详细的了解,所以花了将近两周时间写了这份中文的CAP文档,对 CAP 还不知道的同学可以先看一下这篇文章. 本文档为 CAP 文献(Wiki),本文献同 ...

  3. 分布式事务,EventBus 解决方案:CAP【中文文档】(转)

    出处:http://www.cnblogs.com/savorboard/p/cap-document.html 前言 很多同学想对CAP的机制以及用法等想有一个详细的了解,所以花了将近两周时间写了这 ...

  4. Guava源码解析之EventBus

    最近看Elastic-Job源码,看到它里面实现的任务运行轨迹的持久化,使用的是Guava的AsyncEventBus,一个内存级别的异步事件总线服务,实现了简单的生产-消费者模式,从而在不影响任务执 ...

  5. 【转】分布式事务,EventBus 解决方案:CAP【中文文档】

    [转]分布式事务,EventBus 解决方案:CAP[中文文档] 最新文档地址:https://github.com/dotnetcore/CAP/wiki 前言 很多同学想对CAP的机制以及用法等想 ...

  6. MASA Framework - EventBus设计

    目录 MASA Framework - 整体设计思路 MASA Framework - EventBus设计 概述 利用发布订阅模式来解耦不同架构层级,亦可用于解决隔离业务之间的交互 优点: 松耦合 ...

  7. MailOtto 实现完美预加载以及源码解读

    背景: 最近项目组需要一个小课题分享,小白刚好从微博里看到一个这样有趣的开源工具MailOtto,是阿里巴巴员工 Drakeet 维护的一个专注懒事件的事件总线,gitHub地址为:https://g ...

  8. AjaxManager的实现

    在NeralJS思路整理一章中我们提到过实用ajax管理模块控制ajax请求,以减少ajax请求数量,优化加载,以下是ajax模块的实现,我已经确保经历简单. /** * Created by wil ...

  9. .NET Core Community 首个千星项目诞生:CAP

    项目简介 在我们构建 SOA 或者 微服务系统的过程中,我们通常需要使用事件来对各个服务进行集成,在这过程中简单的使用消息队列并不能保证数据的最终一致性, CAP 采用的是和当前数据库集成的本地消息表 ...

随机推荐

  1. java-we不在esclipse创建servlet之后改名不起作用的问题归纳

    有时候我们不满意类名而去改名,但是改过了之后却发现不能实现它本来该实现的功能了,这是为什么呢,原因就是在2.5里面创建了servlet之后就会在web.xml里生成关于这个servlet的配置,你只是 ...

  2. postgresql从库提升为主库

    一.停主库 1.查看当前连接 select pid,datname,usename,client_addr,client_port, application_name from pg_stat_act ...

  3. oracle 按每天,每周,每月,每季度,每年查询统计数据

    oracle 按每天,每周,每月,每季度,每年查询统计数据 //按天统计 select count(dataid) as 每天操作数量, sum() from tablename group by t ...

  4. vue基本使用及脚手架使用

    一.基本使用: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  5. [RN] React Native 常见基本问题归纳总结

    [RN] React Native  常见基本问题归纳总结 本问题总结涉及到版本为: "react": "16.8.3","react-native& ...

  6. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  7. 打造VIM成为IDE - nerdtree

    nerdtree 自动缩进 :set paste :set nopaste set tabstop=4 set softtabstop=4 set shiftwidth=4 set noautoind ...

  8. idea 导入 eclipse java ee 项目,并使用 tomcat 7 部署运行

    1.导入java ee项目.直接open 2.导入jar依赖 3.修改编译的目录 4.修改tomcat目录 5.tomcat添加目录 请注意classes单词 D:\project\xxxxxx\We ...

  9. 初始CSS3小知识【99%人不知道的小技巧】

    一.引入样式    1.行内样式表   <h1 style="color: red;font-size: 18px;">10-30</h1>     2.内 ...

  10. 【软工实践】Alpha冲刺(5/6)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 任务界面设计,任务功能后端实现 任务计时功能及界面实现 展示GitHub代码签 ...