MassTransit 介绍 

先看下masstransit 官网介绍:MassTransit 是一个自由、开源、轻量级的消息总线, 用于使用. NET 框架创建分布式应用程序。MassTransit 在现有消息传输上提供了一组广泛的功能, 从而使开发人员能够友好地使用基于消息的会话模式异步连接服务。基于消息的通信是实现面向服务的体系结构的可靠和可扩展的方式。前段时间看eshop文档,在微服务之间实现基于事件的通信章节。有提到MassTransit是实现event Bus技术之一,于是就翻译了几篇

下面利用MassTransit实现eshop中的一个简单实例(前提你刚好了解eshop中的这个场景): Catelog微服务中产品价格更改,Basket微服务通知购车价格变动

如果没看源码,这个场景也很常见很好理解,我们在接下来创建两个webapi站点和一个类库来演示如何实现上述场景

在类库中定义产品价格变动消息

 public interface IProductPriceChanged
{
int ProductId { get; set; } decimal NewPrice { get; set; } decimal OldPrice { get; set; } }

MassTransit.Catalog站点

引入一下包:MassTransit、MassTransit.RabbitMQ、Autofac.Extensions.DependencyInjection。在Startup类ConfigureServices中添加:

 builder.Register(c =>
{
return Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Host(new Uri($"rabbitmq://{Configuration["HostName"]}"), h =>
{
h.Username(Configuration["UserName"]);
h.Password(Configuration["Password"]);
});
});
})
.As<IBusControl>()
.As<IBus>()
.As<IPublishEndpoint>()
.SingleInstance();
builder.Populate(services);
container = builder.Build();
return new AutofacServiceProvider(container);

然后在Configure方法添加:

var bus = container.Resolve<IBusControl>();
var busHandle = TaskUtil.Await(() => bus.StartAsync());
lifetime.ApplicationStopping.Register(() => busHandle.Stop());

最后在Controller添加模拟修改价格的接口

 private readonly IBus _bus;
public ValuesController(IBus bus)
{
_bus = bus;
}
// GET api/values
[HttpGet]
public async Task<IEnumerable<string>> GetAsync()
{
await _bus.Publish<IProductPriceChanged>(new
{
ProductId=,
NewPrice=,
OldPrice=,
});
return new string[] { "价格更改" };
}

到此发布端已经完成了

MassTransit.Basket站点

同样引入包,并在Configure方法中添加订阅的代码

var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
{
var host = sbc.Host(new Uri($"rabbitmq://{Configuration["RabbitMQ:HostName"]}"), h =>
{
h.Username(Configuration["RabbitMQ:UserName"]);
h.Password(Configuration["RabbitMQ:Password"]);
});
sbc.ReceiveEndpoint(host, "ProductPriceChangedQueue", e =>
{
e.Consumer<ProductPriceChangedConsumer>();
}); });
// start/stop the bus with the web application
applicationLifetime.ApplicationStarted.Register(bus.Start);
applicationLifetime.ApplicationStopped.Register(bus.Stop);

消费端 你可以使用其他方式寄宿比如控制台等;

最后运行两个站点看下输出

MassTransit 实现发布/订阅的更多相关文章

  1. RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用

    本文版权归博客园和作者本人吴双共同所有,转载请注明本Redis系列分享地址.http://www.cnblogs.com/tdws/tag/NoSql/ Redis Pub/Sub模式 基本介绍 Re ...

  2. 15天玩转redis —— 第九篇 发布/订阅模式

    本系列已经过半了,这一篇我们来看看redis好玩的发布订阅模式,其实在很多的MQ产品中都存在这样的一个模式,我们常听到的一个例子 就是邮件订阅的场景,什么意思呢,也就是说100个人订阅了你的博客,如果 ...

  3. 第五章 --- 关于Javascript 设计模式 之 发布-订阅模式

    先来个最简单的 发布订阅模式 document.body.addEventListener('click',function(){ alert(123); }); document.body.clic ...

  4. 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

    一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...

  5. 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载

    一.分布式消息总线 在很多MIS项目之中都有这样的需求,需要一个及时.高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已经完成,在通常的情况下,开发人中都是在使用者B所使用 ...

  6. NetMQ(三): 发布订阅模式 Publisher-Subscriber

    ZeroMQ系列 之NetMQ 一:zeromq简介 二:NetMQ 请求响应模式 Request-Reply 三:NetMQ 发布订阅模式 Publisher-Subscriber 四:NetMQ ...

  7. Redis系列(三)-Redis发布订阅及客户端编程

    阅读目录 发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易 ...

  8. Redis 发布订阅用法

    一.发布订阅模型发布订阅其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易变化的发送方和接收方. 发送方:只负责向第三方发送消息.(杂志社把读者杂志交给邮局)接 ...

  9. 使用SQLServer同义词和SQL邮件,解决发布订阅中订阅库丢失数据的问题

    最近给客户做了基于SQLServer的发布订阅的“读写分离”功能,但是某些表数据很大,经常发生某几条数据丢失的问题,导致订阅无法继续进行.但是每次发现问题重新做一次发布订阅又非常消耗时间,所以还得根据 ...

随机推荐

  1. 安卓笔记-可以滚动的TextView

    本来是想做一个显示文字信息的,当文字很多时View的高度不能超过一个固定的值,当文字很少时View的高度小于那个固定值时,按View的高度显示.因为ScrollView没有maxHeight,无法满足 ...

  2. how tomcat works 读书笔记 十一 StandWrapper 上

    方法调用序列 下图展示了方法调用的协作图:  这个是前面第五章里,我画的图:  我们再回顾一下自从连接器里  connector.getContainer().invoke(request, resp ...

  3. JAVA_Lock

    今天是毕业入职的第一个周末,一直对多线程并发方面的知识比较感兴趣,因为目前我手里的项目并没有涉及到并发方面的知识,所以怕以后遗忘,也便于以后复习和使用,所以总结了一下Lock里面的一些类的方法.具体的 ...

  4. 大型B2C网站高性能可伸缩架构技术探秘

    大型B2C网站高性能可伸缩架构技术探秘 2010-07-21 08:51 狂放不羁 JavaEye 字号:T | T 向您介绍大型B2C网站高性能的网站架构技术,包括缓存的使用.应用程序和数据库的拆分 ...

  5. JSP指令与动作

    Jsp基本指令和动作 (2011-08-18 16:25:13) 转载▼ 标签: 杂谈 分类: java JSP基本指令 jsp命令指令用来设置与整个jsp页面相关的属性,它并不直接产生任何可见的输出 ...

  6. SQL解决"双重职位的查询"

    双重身份问题: create table role_tab ( person char(5) not null, role  char(1) not null ) insert into role_t ...

  7. innobackupex 简单使用笔记

    innobackupex 选项介绍 --backup 备份 --apply-log   应用日志 --move-back  --copy-back 恢复 --export 只导出单个表.前提是使用in ...

  8. YUV420格式解析

    一般的的YUV420图像格式实际上是Y'UV,420指的是其在Y U V上面的采样率.在YUV420的格式中,首先存储每一个像素的Y'值,然后跟着存储的是每2*2方阵采样一次的U值,最后存储的是每2* ...

  9. 【转】H.264RTP封包原理

    原文地址:H.264RTP封包原理   作者:cnp11 1.  引言  随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡到音频和视频,并越来越强调获取资源的实时性和互动性.但人们又面 ...

  10. Scala编程入门---Map与Tuple

    创建Map //创建一个不可变的Map val ages = Map("Leo" -> 30,"Jen" ->25,"Jack" ...