首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
跨域ajax请求中的cookie传输问题
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。 它允许浏览器向跨源服务器发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。 对CORS协议不了解的同学,可以猛击这里。
跑马溜溜的球
2020/12/07
2.3K0
跨域ajax请求中的cookie传输问题
【NGINX入门】9.Nginx负载均衡并实现session共享的方法和实践
在项目实践中,有时我们需要多台服务器进行负载,以扩展服务器的宽带、增加吞吐量和提高网络数据的处理能力,从而提高用户的体验感,保证项目的质量。当一个项目部署在多台服务器上,我们习惯于使用nginx做负载均衡,这样同一个IP访问项目的时候会被自动分配到不同的服务器上; 但是,如果多台服务器的session不同步的话,则会导致很多问题,比如我们的登录状态、用户信息、数字字典等都会归零,都需要重新登录之后才能获取到,这样给用户的体验感就会很差,所以在多台服务器进行负载均衡的时候我们就得要考虑到多台服务器之间的session同步了。
辉哥
2021/02/04
4.5K0
深入解析Cookie技术
0×00 引言 在Web技术的发展史上,Cookie技术的出现是一次重大的 变革。但是, Cookie技术又是一项非常有争议的技术,从它诞生之日起就成了广大网络用户和Web开发人员的一个争论焦点,原因不是Cookie的功能太弱,而是认为Cookie的使用会对网络用户的隐私信息构成危害。 Cookie技术最先被Netscape公司引入到Navigator浏览器中。之后,WoridWideWeb协会支持并采纳了Cookie标准,微软也在InternetExpiorer浏览器中使用了Cookie。现在,绝大多数
FB客服
2018/02/05
1.4K0
深入解析Cookie技术
SSO单点登录
SSO单点登录是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
WindRunnerMax
2020/08/27
2.3K0
二维码劫持案例分析
微信扫描二维码登录网站,相信很多网站登录中都有这个功能。但是这个功能使用不当,将会出现劫持漏洞。话不多说,直接分享三个实战挖掘的案例,三个的实现方式都不一样(已脱敏).
FB客服
2020/05/14
2.2K0
二维码劫持案例分析
跨域 Cookie 实现单点登录
单点登录(SSO - Single Sign On):对于同一个客户端(例如 Chrome 浏览器),只要登录了一个子站(例如 a.com),则所有子站(b.com、c.com)都认为已经登录。
用户7657330
2020/08/14
1.9K0
【基本功】 前端安全系列之二:如何防止CSRF攻击?
当当当当,我是美团技术团队的程序员鼓励师美美~“基本功”专栏又来新文章了,本篇是我们前端安全系列文章的第二篇,主要聊聊前端开发过程中遇到的CSRF问题,希望对你有帮助哦~
美团技术团队
2019/03/22
2K0
【基本功】 前端安全系列之二:如何防止CSRF攻击?
同源策略和跨域解决方法
第一部分:同源策略:same-origin policy 1.同源策略的由来: 1995年,同源策略由Netscape(曾经的浏览器霸主,拒绝微软收购请求,被IE给整垮。现在发展为火狐浏览器背后的Mozilla)引入。目前,所有浏览器都遵循同源策略。 2.同源定义:即同协议、同域名、同端口号 例如:http://www.test.com:80/test.html;     协议:http;域名:www.test.com;端口号:80(默认端口,可以省略) http://www.test.com/test10
用户1149564
2018/01/11
2K0
同源策略和跨域解决方法
快速入门网络爬虫系列 Chapter13 | 模拟登陆
在输入账号密码和验证码成功后,要点击Preserve log,如果不选择此处,当我们打开新的的网页时,会被冲刷掉。
不温卜火
2020/10/28
6720
快速入门网络爬虫系列 Chapter13 | 模拟登陆
【安全】573- 大前端网络安全精简指南手册
DOM型和反射性都是通过诱导用户点击链接执行,并且都是临时型的,但是反射型属于服务端安全漏洞而DOM型属于客户端安全漏洞
pingan8787
2020/04/26
7000
全面解读HTTP Cookie
今天webryan给team做了一个关于HTTP cookie的分享,从各个方面给大家介绍一下大家耳熟能详的Cookie。主要是翻了维基百科的很多内容,因为维基百科的逻辑实在是很清晰:),ppt就不分享了,把原始的草稿贴出来给大家。欢迎批评指正。
j_bleach
2019/07/02
9960
【安全】 Cookie
后面会把前端进阶的课程内容都总结一遍。有些都是很常见的知识,但是为了梳理自己的知识树,所以尽量模糊的地方都会记录
神仙朱
2020/02/17
1.4K0
面试官:说下Cookie和Session的关系和区别
在技术面试中,经常被问到“Cookie和Session的区别”,大家都知道一些,Session比Cookie安全,Session是存储在服务器端的,Cookie是存储在客户端的,然而如果让你更详细地说明,恐怕就不怎么清楚了。
公众号 IT老哥
2021/01/14
16.6K0
面试官:说下Cookie和Session的关系和区别
web 应用常见安全漏洞一览
SQL 注入就是通过给 web 应用接口传入一些特殊字符,达到欺骗服务器执行恶意的 SQL 命令。
用户7657330
2020/08/14
7790
CSRF攻击原理介绍和利用
注意:本文分享给安全从业人员,网站开发人员和运维人员在日常工作中使用和防范恶意攻击,请勿恶意使用下面描述技术进行非法操作。
全栈工程师修炼指南
2020/10/23
4.7K0
CSRF攻击原理介绍和利用
小饼干Cookie的大魅力
早期互联网只是用于简单的页面浏览,并没有交互,服务器也无法知道不同的请求是否来自同一个浏览器,不知道某用户上一次做了什么。每次请求都是相互完全独立的,这也是 HTTP 协议无状态特征的表现。这种缺陷显然无法满足交互式 Web 发展的需求,Cookie 作为一种解决这一问题的方案,被当时最强大的网景浏览器公司提出。
天存信息
2021/06/21
8750
小饼干Cookie的大魅力
XSS的一些基本概念
若两个URL 协议,端口,host都相同,则这两个URL同源。 这个方案叫做“协议/主机/端口元组”,或者直接是 “元组”
ConsT27
2022/02/11
1.2K0
XSS的一些基本概念
理解Cookie和Session机制
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
哲洛不闹
2018/09/18
1.4K0
理解Cookie和Session机制
前端网络安全 常见面试题速查
XSS 安全漏洞 简单转义是否有防护作⽤ HTML 标签⽂字内容 有 HTML 属性值 有 CSS 内联样式 ⽆ 内联 JavaScript ⽆ 内联 JSON ⽆ 跳转链接 ⽆
Cellinlab
2023/05/17
8070
前后端接口鉴权全解 Cookie/Session/Token 的区别
不知不觉也写得比较长了,一次看不完建议收藏夹!本文主要解释与请求状态相关的术语(cookie、session、token)和几种常见登录的实现方式,希望大家看完本文后可以有比较清晰的理解,有感到迷惑的地方请在评论区提出。
前端达人
2021/05/11
1.4K0
相关推荐
跨域ajax请求中的cookie传输问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档