首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微服务实战(四):落地微服务架构到直销系统(将生产者与消费者接入消息总线)

微服务实战(四):落地微服务架构到直销系统(将生产者与消费者接入消息总线)

作者头像
用户1910585
发布于 2018-08-02 08:09:52
发布于 2018-08-02 08:09:52
63900
代码可运行
举报
运行总次数:0
代码可运行

前一篇文章我们已经完成了基于RabbitMq实现的的消息总线,这篇文章就来看看生产者(订单微服务)与消费者(经销商微服务)如何接入消息总线实现消息的发送与消息的接收处理。

定义需要发送的消息:

下单消息要被发送到消息总线,并被经销商微服务的处理器处理。经销商微服务处理时,需要知道要对哪个经销商处理多少的PV值与电子币余额。这些信息就是事件消息需要承载的重要信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class OrderCreatedProcessDealerEvent:BaseEvent
    {
        public decimal OrderTotalPrice { get; set; }
        public decimal OrderTotalPV { get; set; }
        public Guid DealerId { get; set; }
        public Guid OrderId { get; set; }
        public OrderCreatedProcessDealerEvent(Guid dealerid,Guid orderid,decimal ordertotalprice,decimal
            ordertotalpv)
        {
            this.OrderTotalPrice = ordertotalprice;
            this.OrderTotalPV = ordertotalpv;
            this.DealerId = dealerid;
            this.OrderId = orderid;
        }
    }

生产者(订单微服务)连接到消息总线:

生产者-订单微服务通过Asp.net core WebApi自带的依赖注入,连接到RabbitMq消息总线。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            services.AddSingleton<IEventHandlerExecutionContext>(new EventHandlerExecutionContext(services));
            var connectionFactory = new ConnectionFactory { HostName = "localhost" };
            services.AddSingleton<IEventBus>(sp => new RabbitMqEB(connectionFactory,
                sp.GetRequiredService<IEventHandlerExecutionContext>(), "exchange2", "direct", "ordereventqueue", 1));

从上面代码可以看出,生产者连接到了localhost的Rabbit服务器,并通过调用消息总线的构造函数,定义了发送消息的通道。构造函数具体内容可以查看上一篇文章。

生产者(订单微服务)发送消息到消息总线:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ieventbus.Publish(new OrderCreatedProcessDealerEvent(orderdto.DealerId,
                        orderid, order.OrderTotalPrice.TotalPrice, order.OrderTotalPV.TotalPV));

ieventbus是注入到订单微服务的构造函数中,并传递到订单创建的用例中。 

实现消费者(经销商微服务)的消息处理器:

消费者会连接到消息总线,接收到特定类型的消息(这里是OrderCreatedProcessDealerEvent),会交给特定的处理器进行处理,所以需要先定义并实现消息处理器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class OrderCreatedEventHandler : IEventHandler
    {
        ServiceLocator servicelocator = new ServiceLocator();
        public Task<bool> HandleAsync<TEvent>(TEvent @event) where TEvent : IEvent
        {
            var idealercontext = servicelocator.GetService<IDealerContext>();
            var irepository =
                servicelocator.GetService<IRepository>(new ParameterOverrides { { "context", idealercontext } });
            var idealerrepository = servicelocator.GetService<IDealerRepository>(new ParameterOverrides { { "context", idealercontext } });
  //先将接收到的消息转换成特定类型          
var ordercreatedevent = @event as OrderCreatedProcessDealerEvent;
            using (irepository)
            {
                try
                {
                  //根据消息内容,处理自己的逻辑与持久化
                    idealerrepository.SubParentEleMoney(ordercreatedevent.DealerId, ordercreatedevent.OrderTotalPrice);
                    idealerrepository.AddDealerPV(ordercreatedevent.DealerId, ordercreatedevent.OrderTotalPV);
                    irepository.Commit();
                }
                catch (EleMoneyNotEnoughException)
                {
                     //先不处理电子币余额不足的情况                   

                }
            }
            return Task.FromResult(true);
        }
    }

消费者(经销商微服务)连接到消息总线:

需要在经销商微服务指定需要连接到的消息总线,并订阅哪个类型的消息交给哪个事件处理器进行处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            //用于侦听订单上下文传递的消息
            services.AddSingleton<IEventHandlerExecutionContext>(new EventHandlerExecutionContext(services));
            var connectionFactory = new ConnectionFactory { HostName = "localhost" };
            services.AddSingleton<IEventBus>(sp => new RabbitMqEB(connectionFactory,
                sp.GetRequiredService<IEventHandlerExecutionContext>(), "exchange2", "direct", "ordereventqueue", 2));
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            var eventbus = app.ApplicationServices.GetService<IEventBus>();
//订阅消息
                        eventbus.Subscribe<OrderCreatedProcessDealerEvent, OrderCreatedEventHandler>();

这样,两个微服务直接就能通过RabbitMq消息总线进行消息的发送、消息的接收与处理了,实现了解耦。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微服务实战(七):落地微服务架构到直销系统(实现命令与命令处理器)
我们先来看看CQRS架构,你对下图的架构还有印象吗?每个组件的功能都还清楚吗?如果有疑问,请查考文章《微服务实战(五):落地微服务架构到直销系统(构建高性能大并发系统)》。
用户1910585
2018/10/18
8540
微服务实战(七):落地微服务架构到直销系统(实现命令与命令处理器)
微服务实战(二):落地微服务架构到直销系统(构建消息总线框架接口)
从上一篇文章大家可以看出,实现一个自己的消息总线框架是非常重要的内容,消息总线可以将界限上下文之间进行解耦,也可以为大并发访问提供必要的支持。
用户1910585
2018/08/02
6680
微服务实战(二):落地微服务架构到直销系统(构建消息总线框架接口)
DDD实战进阶第一波(十一):开发一般业务的大健康行业直销系统(实现经销商代注册用例与登录令牌分发)
前两篇文章主要实现了经销商代注册的仓储与领域逻辑、经销商登录的仓储与相关逻辑,这篇文章主要讲述经销商代注册的用例与经销商登录的查询功能。 一.经销商代注册用例 在经销商代注册用例中,我们需要传递经销商的基本注册信息,这个信息是做成了DTO对象。 1.经销商注册的DTO对象: public class AddDealerDTO { public string Name { get; set; } public string Tel { get; set; }
用户1910585
2018/06/19
4840
微服务实战(三):落地微服务架构到直销系统(构建基于RabbitMq的消息总线)
从前面文章可以看出,消息总线是EDA(事件驱动架构)与微服务架构的核心部件,没有消息总线,就无法很好的实现微服务之间的解耦与通讯。通常我们可以利用现有成熟的消息代理产品或云平台提供的消息服务来构建自己的消息总线;也可以自己完全写一个消息代理产品,然后基于它构建自己的消息总线。通常我们不用重复造轮子(除非公司有特殊的要求,比如一些大型互联网公司考虑到自主可控的白盒子),可以利用比如像RabbitMq这样成熟的消息代理产品作为消息总线的底层支持。
用户1910585
2018/08/02
8600
DDD实战进阶第一波(十):开发一般业务的大健康行业直销系统(实现经销商登录仓储与逻辑)
上一篇文章主要讲了经销商注册的仓储和领域逻辑的实现,我们先把应用服务协调完成经销商注册这部分暂停一下,后面文章统一讲。 这篇文章主要讲讲经销商登录的仓储和相关逻辑的实现。 在现代应用程序前后端分离的实现中,通常不是将用户登录的信息存储在服务器端Session,因为会存在服务器Session无法传递的情况,也存在WebApi调用时 无法通过Authorize Attribute判断用户是否已经登录并获取用户身份信息的问题。所以现代应用程序都是由服务器后端返回Token给客户端,客户端将Token存储在客户端
用户1910585
2018/07/04
3650
[项目更新] 集成RabbitMQ队列与EventBus总线
终于项目继续迭代更新了,在开源这两年多,也是感谢每一个支持Blog.Core项目的同学,同时也感谢每一个在生产环境中使用,并提出意见和建议的小伙伴,2,606个Star,是我们相互之间共同的努力和肯定,上边的这些都是我和各位使用者提出的需求,刚开始很快,越是到后边,开发起来越难,这里先说明几点问题:
老张的哲学
2022/04/11
1.2K0
[项目更新] 集成RabbitMQ队列与EventBus总线
DDD实战进阶第一波(十四):开发一般业务的大健康行业直销系统(订单上下文应用服务用例与接口)
上一篇文章我们主要讲了订单上下文的领域逻辑,在领域逻辑中完成了订单项的计算逻辑、订单的计算逻辑以及如何生成相应的实体code,这篇文章我们通过 在应用服务中实现一个下单的用例,来将这些领域逻辑以及仓储整合起来,完成一个下单的用例。 先看下单用例主体的代码: public class CreateOrderUseCase:BaseAppSrv { private readonly IOrderRepository iorderrepository; private r
用户1910585
2018/07/04
4210
eShopOnContainers 知多少[5]:EventBus With RabbitMQ
事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉。事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。
圣杰
2018/12/21
1K0
springcloud微服务架构开发实战:分布式消息总线
前面在1.4.2节中强调过,在微服务架构中,经常会使用REST 服务或基于消息的通信机制。
愿天堂没有BUG
2022/10/28
8990
springcloud微服务架构开发实战:分布式消息总线
eShopOnContainers 知多少[8]:Ordering microservice
Ordering microservice(订单微服务)就是处理订单的了,它与前面讲到的几个微服务相比要复杂的多。主要涉及以下业务逻辑:
圣杰
2019/05/29
1.3K0
微服务实战(一):落地微服务架构到直销系统(什么是微服务)
网上有很多关于微服务的文章,从不同的维度对微服务进行了相关的讲述;有些高屋建瓴,有些涉及细节,有些侧重理论,有些侧重代码,都是非常不错的了解微服务的文章。
用户1910585
2018/08/02
1.1K0
微服务实战(一):落地微服务架构到直销系统(什么是微服务)
.NET Core微服务之基于MassTransit实现数据最终一致性(Part 2)
  在上一篇中,我们了解了MassTransit这个开源组件的基本用法,这一篇我们结合一个小案例来了解在ASP.NET Core中如何借助MassTransit+Quartz.Net来实现数据的最终一致性。当然,实现数据的最终一致性有很多方案,这里只是举一种我所学到的比较简单易于学习的实现方式而已。
Edison Zhou
2018/08/01
1.6K0
.NET Core微服务之基于MassTransit实现数据最终一致性(Part 2)
微服务实战(九):落地微服务架构到直销系统(回顾总结)
这个系列我们大概写了八篇文章,将微服务的最重要的内容过了一遍。当然其中有些内容还没有涉及到,比如Docker(不是微服务架构风格中必须的)等,关于Docker我们自己可以在网上找找其他文章。
用户1910585
2018/11/07
8040
消息总线在微服务中的应用
在企业应用中,有时也会有多个项目共同使用一个 Github repo 的情况,这时候就需要将不同项目的资源文件放到不同目录下,使用如下配置,给你的服务指定一个独立的目录存放配置文件spring.cloud.config.server.git.search-paths=/{appName}
程序员波特
2024/02/03
3330
消息总线在微服务中的应用
.NET Core微服务之开源项目CAP的初步使用
下面的文字来自CAP的Wiki文档:https://github.com/dotnetcore/CAP/wiki
Edison Zhou
2018/07/31
1.8K0
.NET Core微服务之开源项目CAP的初步使用
【.net core】电商平台升级之微服务架构应用实战
这篇文章本来是继续分享IdentityServer4 的相关文章,由于之前有博友问我关于微服务相关的问题,我就先跳过IdentityServer4的分享,进行微服务相关的技术学习和分享。微服务在我的分享目录里面是放到四月份开始系列文章分享的,这里就先穿越下,提前安排微服务应用的开篇文章 电商系统升级之微服务架构的应用。本博客以及公众号坚持以架构的思维来分享技术,不仅仅是单纯的分享怎么使用的Demo。
Jlion
2022/04/07
9940
【.net core】电商平台升级之微服务架构应用实战
【微服务】微服务间通信的最佳实践
一个好的 API 架构对于有效处理微服务之间的通信很重要。不要害怕创建新的微服务,并尽可能地尝试解耦功能。例如,与其创建一个通知服务,不如尝试为电子邮件通知、SMS 通知和移动推送通知创建单独的微服务。 在这里,我假设您有一个 API 网关来管理请求、处理到负载平衡服务器的路由并限制未经授权的访问。 通讯类型 同步协议:HTTP 是一种同步协议。客户端发送请求并等待服务的响应。这与客户端代码执行无关,它可以是同步的(线程被阻塞)或异步的(线程未被阻塞,并且响应最终会到达回调)。这里的重点是协议(HTTP/H
架构师研究会
2022/03/08
1.2K0
《ASP.NET Core 微服务实战》-- 读书笔记(第6章)
我们大脑就是一种事件溯源系统,接收感官多种形式刺激,大脑负责对这些刺激进行合适排序,大约每隔几百毫秒,对刺激构成的流进行运算,而运算的结果,就是我们所说的事实
郑子铭
2021/01/13
5100
《ASP.NET Core 微服务实战》-- 读书笔记(第6章)
在ASP.NET Core微服务架构下使用RabbitMQ如何实现CQRS模式
在现代软件开发中,微服务架构和CQRS模式都是备受关注的技术趋势。微服务架构通过将应用程序拆分为一系列小型、自治的服务,提供了更好的可伸缩性和灵活性。而CQRS模式则通过将读操作和写操作分离,优化了系统的性能和可维护性。本文小编将为大家介绍如何在ASP.NET Core微服务架构下使用RabbitMQ来实现CQRS模式。
葡萄城控件
2024/01/10
3560
在ASP.NET Core微服务架构下使用RabbitMQ如何实现CQRS模式
微服务实战(八):落地微服务架构到直销系统(服务高可用性)
在微服务架构风格的系统中,如果单个微服务垮掉或地址不可访问,虽然对系统的影响是有限的,但我们也必须采取一定的手段来保证每个微服务尽量可用;并且在大并发的情况下,虽然可以通过EDA消息队列处理的方式提高吞吐量,但仍然需要WebApi能够更加高效的侦听用户请求,处理消息,即使在某个服务短暂不可用的情况下。本篇文章主要来详细讲一讲要保证微服务的高可用性,可以通过哪些手段来实现。
用户1910585
2018/10/11
9630
微服务实战(八):落地微服务架构到直销系统(服务高可用性)
推荐阅读
微服务实战(七):落地微服务架构到直销系统(实现命令与命令处理器)
8540
微服务实战(二):落地微服务架构到直销系统(构建消息总线框架接口)
6680
DDD实战进阶第一波(十一):开发一般业务的大健康行业直销系统(实现经销商代注册用例与登录令牌分发)
4840
微服务实战(三):落地微服务架构到直销系统(构建基于RabbitMq的消息总线)
8600
DDD实战进阶第一波(十):开发一般业务的大健康行业直销系统(实现经销商登录仓储与逻辑)
3650
[项目更新] 集成RabbitMQ队列与EventBus总线
1.2K0
DDD实战进阶第一波(十四):开发一般业务的大健康行业直销系统(订单上下文应用服务用例与接口)
4210
eShopOnContainers 知多少[5]:EventBus With RabbitMQ
1K0
springcloud微服务架构开发实战:分布式消息总线
8990
eShopOnContainers 知多少[8]:Ordering microservice
1.3K0
微服务实战(一):落地微服务架构到直销系统(什么是微服务)
1.1K0
.NET Core微服务之基于MassTransit实现数据最终一致性(Part 2)
1.6K0
微服务实战(九):落地微服务架构到直销系统(回顾总结)
8040
消息总线在微服务中的应用
3330
.NET Core微服务之开源项目CAP的初步使用
1.8K0
【.net core】电商平台升级之微服务架构应用实战
9940
【微服务】微服务间通信的最佳实践
1.2K0
《ASP.NET Core 微服务实战》-- 读书笔记(第6章)
5100
在ASP.NET Core微服务架构下使用RabbitMQ如何实现CQRS模式
3560
微服务实战(八):落地微服务架构到直销系统(服务高可用性)
9630
相关推荐
微服务实战(七):落地微服务架构到直销系统(实现命令与命令处理器)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档