MassTransit 实现应用程序间交互
2018-05-21 16:59 李明成 阅读(5184) 评论(4) 编辑 收藏 举报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=100, NewPrice=1999, OldPrice=2000, }); 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);
消费端 你可以使用其他方式寄宿比如控制台等;
最后运行两个站点看下输出
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?