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代码如下

  1. public interface OrderSubmitted
  2. {
  3. long Id { get; set; }
  4. decimal OrderPrice { get; set; }
  5. }
  6.  
  7. public interface SubmitOrder
  8. {
  9. long Id { get; set; }
  10. Decimal OrderPrice { get; set; }
  11. }

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

  1. public class Producer
  2. {
  3. public static void TestProducer()
  4. {
  5. //rabbitmq 配置
  6. string rabbitMqUri = "rabbitmq://localhost:5672";
  7. string rabbitMqUserName = "your";
  8. string rabbitMqPassword = "your";
  9.  
  10. PulishEvent(rabbitMqUri, rabbitMqUserName, rabbitMqPassword);
  11. SendCommand(rabbitMqUri, rabbitMqUserName, rabbitMqPassword);
  12. }
  13.  
  14. /// <summary>
  15. /// 发布事件
  16. /// </summary>
  17. /// <param name="rabbitMqUri"></param>
  18. /// <param name="rabbitMqUserName"></param>
  19. /// <param name="rabbitMqPassword"></param>
  20. private static void PulishEvent(string rabbitMqUri, string rabbitMqUserName, string rabbitMqPassword)
  21. {
  22. IBusControl busControl = ServiceBusManager.Instance.UseRabbitMq(rabbitMqUri, rabbitMqUserName, rabbitMqPassword)
  23. .BuildEventProducer();
  24.  
  25. TaskUtil.Await(busControl.Publish<OrderSubmitted>(new
  26. {
  27. Id = 1010,
  28. OrderPrice = 1024
  29. }));
  30. }
  31. /// <summary>
  32. /// 发送命令
  33. /// </summary>
  34. /// <param name="rabbitMqUri"></param>
  35. /// <param name="rabbitMqUserName"></param>
  36. /// <param name="rabbitMqPassword"></param>
  37. private static void SendCommand(string rabbitMqUri, string rabbitMqUserName, string rabbitMqPassword)
  38. {
  39. string queueName = "submitorder.queue";
  40.  
  41. ISendEndpoint busControl = ServiceBusManager.Instance.UseRabbitMq(rabbitMqUri, rabbitMqUserName, rabbitMqPassword)
  42. .BuildCommandProducer(queueName);
  43.  
  44. TaskUtil.Await(busControl.Send<SubmitOrder>(new
  45. {
  46. Id = 1010,
  47. OrderPrice=1024
  48. }));
  49. }
  50. }

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

  1. public class Consumer
  2. {
  3. public static void TestConsumer()
  4. {
  5. //rabbitmq 配置
  6. string rabbitMqUri = "rabbitmq://localhost:5672";
  7. string rabbitMqUserName = "your";
  8. string rabbitMqPassword = "your";
  9. string queueName = "submitorder.queue";
  10.  
  11. var busControl = ServiceBusManager.Instance.UseRabbitMq(rabbitMqUri, rabbitMqUserName, rabbitMqPassword)
  12. .RegisterConsumer<SubmitOrderCommandConsumer>(queueName)//注册提交订单命令消费者
  13. .RegisterConsumer<OrderSubmittedEventConsumer>(null) //注册订单已创建事件消费者
  14. .Build();
  15. busControl.Start();
  16. }
  17. }
  18. /// <summary>
  19. ///订单已经提交了 事件消费者
  20. /// </summary>
  21. public class OrderSubmittedEventConsumer : IConsumer<OrderSubmitted>
  22. {
  23. public async Task Consume(ConsumeContext<OrderSubmitted> context)
  24. {
  25. var @event = context.Message;
  26. Console.WriteLine($"接收到订单创建了事件消息单价:{@event.OrderPrice}");
  27. //do somethings...
  28. }
  29. }
  30.  
  31. /// <summary>
  32. /// 提交订单 命令消费者
  33. /// </summary>
  34. public class SubmitOrderCommandConsumer : IConsumer<SubmitOrder>
  35. {
  36. public async Task Consume(ConsumeContext<SubmitOrder> context)
  37. {
  38. var command = context.Message;
  39. Console.WriteLine($"接收到了创建订单命令消息单价:{command.OrderPrice}");
  40. //do somethings...
  41. }
  42. }

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

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. MSc in Robotics

    MSc in RoboticsProgramming Methods for Robotics AssignmentIrene Moulitsas & Peter SherarCranfiel ...

  2. SparkSQL读写外部数据源-jext文件和table数据源的读写

    object ParquetFileTest { def main(args: Array[String]): Unit = { val spark = SparkSession .builder() ...

  3. api的url规则设计,带参数的路由

    api的url设计规则 router := gin.Default() router.GET("/topic/:topic_id", func(context *gin.Conte ...

  4. S1_搭建分布式OpenStack集群_07 nova服务配置 (计算节点)

    一.服务安装(计算节点)安装软件:# yum install openstack-nova-compute -y 编辑/etc/nova/nova.conf文件并设置如下内容:# vim /etc/n ...

  5. pgloader 学习(八) pg 2 pg 简单demo

    pg 数据到pg 数据的迁移,同时支持名称的变更 环境准备 docker-compose文件 内容偏多可以忽略部分 version: "3" services: pgloader- ...

  6. urql 高度可自定义&&多功能的react graphql client

    urql 是一个很不错的graphql client,使用简单,功能强大,通过exchanges 实现了完整的自定义特性 通过urql 的exchanges 我们可以实现灵活的cache策略 参考资料 ...

  7. HTML Meta标签和link标签

    一.meta 标签 name属性主要用于描述网页,对应于content(网页内容)  1.<meta name="Generator" contect="" ...

  8. git下载指定分支到本地

    从网上查了很多方法有很多种,自我感觉下面这种更方便 git clone xxx.git --branch 分支名/dev/...

  9. Dense Semantic Labeling with Atrous Spatial Pyramid Pooling and Decoder for High-Resolution Remote Sensing Imagery(高分辨率语义分割)

    对 Potsdam and Vaihingen 公开数据集进行处理,得到了SOTA的结果,超越DeepLab_v3+,提出的网络结构如下:结合了ASPP和FCN,UNet

  10. 四种CSS样式的引入方式

    准备 1.首先准备一个html文件:test.html,不建议使用记事本创建文件,建议使用Notepad++来创建并编辑文件,注意编码格式为:以UTF-8无BOM格式编码,否则会出现中文乱码,内容如下 ...