AOP切面和消息队列支持高并发简易原理
Posted 麟工作室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP切面和消息队列支持高并发简易原理相关的知识,希望对你有一定的参考价值。
在开始前首先想必大家已经接触过面对切面的编程如果没有我们先简单介绍一下吧。我们都知道,编程的方式有:面对过程的编程和面对对象的编程了,那么什么是面对切面的编程呢?
AOP(面对切面编程)
如上图所示,切面是一个横跨多个业务的模型,切面的宗旨是(个人理解):在不影响主 业务的情况下,进行特定的行为。什么意思呢?
比如你是一名节目主持人,电视台派人员要求统计每次你每次节目的口误次数,那么用来记录你口误次数的方式是可以通过切面实现的,因为每次统计你的口误次数是不能影响你主持节目,不能说你口误了口误统计人要你停下节目再记录你的次数,然后再让你主持,这样就太不符合逻辑了。本质就是分离代码,把和业务无关的代码分离,减少项目耦合
那么AOP能干嘛呢?
AOP既然有着不影响主业务的特性,那么做日志收集,信息采集是最好不过的,比如我在淘宝购买了一个日用品,那么切面可能就会记录下我这次的购买行为,然后让其保存起来,下次我再次访问网站的时候就可以根据我近期购买行为推荐商品。或者在安全方面就是记录下每次我登陆的信息,后台再分析我的登陆是否有异常,如果有就做相应的安全处理,下面我们举个例子吧!
例子:登陆记录
首先我们有相应的登陆业务处理,我这里使用的是一个支持负载均衡,使用Token下发的登陆模式:
(这里逻辑有点不合理哈,但是不影响主流程)
下面我们将创建一个切面:
我们有注解和xml两种配置切面的方式,我们先使用xml的配置
(这里还没写业务代码,具体根据每个人自己的业务代码决定)
如图我们使用的是before但是实际上使用after-returning会比较合适(切面有几种触发方式,一个是在切点前before,一个是切点后after还有一个是切点方法成功后after-returning)
加入消息队列
简单的记录登陆状态,当然无所谓,但是我们是要支持高并发的,如果只是简答的通过JDBC直接写入在高并发的情况下,必然导致服务器压力山大,那么我们加入消息队列,将日志写入消息队列再由消息队列的Listen监听器监听后依次去处理,这里我们使用(rabbitMQ)作为例子,这里我们使用队列绑定的方式,而不是订阅模式,因为登陆记录是唯一的
消息队列整合spring
生产者(集成spring):
(这里的默认已经把登陆记录对象序列化了)
创建消费者监听
核心代码区:
(具体业务逻辑取决于实际需求)
另外说明
这里我们将登陆记录传入rabbitMQ的时候是需要序列化的,我的序列化工具maven:
我的序列方式是:
这里类不一样(因为截图的是我的邮件验证业务但是逻辑是一样的),只需要修改成你需要序列化的类名,并让其实现serializable接口即可
反序列化过程:
这里也是需要把类换成目标类就行了
以上是关于AOP切面和消息队列支持高并发简易原理的主要内容,如果未能解决你的问题,请参考以下文章
高并发消息队列补充篇:在所依赖存储不授信的场景下实现柔性事务降级