java中间件kabuka java中间件mq
转载
1.走进RabbitMQ
一.消息中间件简介
- 消息中间件(消息队列)是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和最终一致性[架构] 使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
- 以下介绍消息队列在实际应用中常用的使用场景:异步处理,应用解耦,流量削锋和消息通讯四个场景
二.什么是RabbitMQ
- RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。
- AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。
- RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。具体特点包括:
- 可靠性(Reliability)
RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。 - 灵活的路由(Flexible Routing)
在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。 - 消息集群(Clustering)
多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。 - 高可用(Highly Available Queues)
队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。 - 多种协议(Multi-protocol)
RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。 - 多语言客户端(Many Clients)
RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。 - 管理界面(Management UI)
RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。 - 跟踪机制(Tracing)
如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。 - 插件机制(Plugin System)
RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。
三.架构图与主要概念
- 架构图
- 主要概念
- RabbitMQ Server: 也叫broker server,它是一种传输服务。 他的角色就是维护一条从Producer到Consumer的路线,保证数据能够按照指定的方式进行传输。
- Producer: 消息生产者,如图A、B、C,数据的发送方。消息生产者连接RabbitMQ服务器然后将消息投递到Exchange。
- Consumer:消息消费者,如图1、2、3,数据的接收方。消息消费者订阅队列,RabbitMQ将Queue中的消息发送到消息消费者。
- Exchange:生产者将消息发送到Exchange(交换器),由Exchange将消息路由到一个或多个Queue中(或者丢弃)。Exchange并不存储消息。RabbitMQ中的Exchange有direct、fanout、topic、headers四种类型,每种类型对应不同的路由规则。
- Queue:(队列)是RabbitMQ的内部对象,用于存储消息。消息消费者就是通过订阅队列来获取消息的,RabbitMQ中的消息都只能存储在Queue中,生产者生产消息并最终投递到Queue中,消费者可以从Queue中获取消息并消费。多个消费者可以订阅同一个Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理。
- RoutingKey:生产者在将消息发送给Exchange的时候,一般会指定一个routing key,来指定这个消息的路由规则,而这个routing key需要与Exchange Type及binding key联合使用才能最终生效。在Exchange Type与binding key固定的情况下(在正常使用时一般这些内容都是固定配置好的),我们的生产者就可以在发送消息给Exchange时,通过指定routing key来决定消息流向哪里。RabbitMQ为routing key设定的长度限制为255bytes。
- Connection: (连接):Producer和Consumer都是通过TCP连接到RabbitMQ Server的。以后我们可以看到,程序的起始处就是建立这个TCP连接。
- Channels: (信道):它建立在上述的TCP连接中。数据流动都是在Channel中进行的。也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。
- VirtualHost:权限控制的基本单位,一个VirtualHost里面有若干Exchange和MessageQueue,以及指定被哪些user使用。
四.RabbitMQ安装与启动
- 下载并安装 Eralng 配套软件中已提供otp_win64_20.2.exe
- 下载并安装rabbitmq
配套软件中已提供rabbitmq-server-3.7.4.exe。双击安装,注意不要安装在包含中文和空格的目录下!安装后window服务中就存在rabbitMQ了,并且是启动状态。 - 安装管理界面(插件)
进入rabbitMQ安装目录的sbin目录,输入命令 - 重新启动服务
- 打开浏览器,地址栏输入 http://127.0.0.1:15672 ,即可看到管理界面的登陆页
输入用户名和密码,都为guest 进入主界面
最上侧的导航依次是:概览、连接、信道、交换器、队列、用户管理
2. RabbitMQ发送与接收消息
一.直接模式(Direct)
- 什么是Direct模式
我们需要将消息发给唯一一个节点时使用这种模式,这是最简单的一种形式。
任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
1.一般情况可以使用rabbitMQ自带的Exchange:”"(该Exchange的名字为空字符串,下文称其为default Exchange)。
2.这种模式下可以不需要将Exchange进行任何绑定(binding)操作
3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。
4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。 - 创建队列
创建队列,名为queue.test - 代码实现-消息生产者
- 创建工程rabbitmq_demo,引入依赖 ,pom.xml如下:
- 编写配置文件applicationContext-rabbitmq-producer.xml
- 编写测试代码
- 代码实现-消息消费者
- 编写消息监听类
- 创建配置文件applicationContext-rabbitmq-consumer.xml
- 编写测试代码Test2
二.分列模式(Fanout)
- 什么是分列(Fanout)模式
当我们需要将消息一次发给多个队列时,需要使用这种模式。如下图:
任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上。
1.这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。
2.这种模式不需要RouteKey
3.如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。 - 交换器绑定队列
创建队列queue.test1 和queue.test2
创建交换器exchange.fanout_test,并绑定queue.test1和queue.test2 - 代码实现-消息生产者
测试代码,发现队列queue.test1 和queue.test2都收到消息 - 代码实现-消息消费者
- 将MessageConsumer复制为MessageConsumer1和MessageConsumer2。
- 修改applicationContext-rabbitmq-consumer.xml,增加配置
- 修改applicationContext-rabbitmq-consumer.xml
- 创建队列与交换器(配置方式)
修改配置文件applicationContext-rabbitmq-producer.xml
3. 用户注册
一.需求分析
- 注册账号,用手机号注册,填写后发送短信验证码,填写短信验证码正确方可注册成功。
二.实现思路
- 发送短信验证码逻辑:用户服务将要发送的短信验证码发送给rabbitmq和redis ,短信服务将消息从rabbitmq中取出并调用阿里云通信发送短信。阿里云通信整合了三大运营商的短信网关,最终把验证码发送到用户的手机上。rabbitmq采用直接模式,用户服务为消息生产者,短信服务为消息消费者。
- 注册逻辑:注册时从redis中提取短信验证码与用户填写的验证码进行比对,如果一致则可以注册,否则拦截请求。
三.发送短信验证码到MQ
- 实现思路: 在用户服务编写API ,生成手机验证码,存入Redis并发送到RabbitMQ
- 因为要用到消息队列,所以在用户服务引入rabbit与spring的整合依赖。
- 添加配置文件applicationContext-rabbitmq-producer.xml
- 在UserService中新增方法定义
- UserServiceImpl方法实现
- qingcheng_web_portal新增UserController
四.短信服务接收消息
- 短信发送是由单独的短信服务提供的功能,所有的短信都是先发送到消息队列,短信服务从消息队列中提取手机号和验证码,调用短信发送接口进行发送短信。我们这个环节实现的是将手机号和验证码从消息队列中提取出来,打印到控制台。
- 创建qingcheng_service_sms工程,pom文件引入依赖
- 添加web.xml,参见其它服务工程
- 添加监听实现类SmsMessageConsumer
- 添加配置文件applicationContext-rabbitmq-consumer.xml
五.用户注册
- UserService增加方法定义
- UserServiceImpl实现方法
- UserController增加方法
六.前端代码
- 将register.html拷贝到qingcheng_web_portal的webapp下,在body中放置div
- 表单部分代码绑定
- 编写js部分代码
4. 阿里云通信(了解)
一.阿里云通信简介
- 阿里云通信(原名阿里大于),是阿里云旗下产品,融合了三大运营商的通信能力,通过将传统通信业务和能力与互联网相结合,创新融合阿里巴巴生态内容,全力为中小企业和开发者提供优质服务阿里大于提供包括短信、语音、流量直充、私密专线、店铺手机号等个性化服务。通过阿里大于打通三大运营商通信能力,全面融合阿里巴巴生态,以开放API及SDK的方式向开发者提供通信和数据服务,更好地支撑企业业务发展和创新服务。
二.发短信前你要准备什么
- 在阿里云官网 https://www.aliyun.com/ 注册账号
- 手机下载”阿里云“APP,完成实名认证
- 登陆阿里云,产品中选择”短信服务“
- 申请签名(选择验证码类型)
- 申请模板
- 创建 accessKey
- 充值
三.快速入门
- 创建工程引入依赖
- 创建测试类,以下代码从官网获取
四.短信服务发送短信
- 短信服务pom.xml引入阿里云sdk依赖
- 添加配置文件sms.properties
- 添加配置文件applicationContext-sms.xml
- 创建短信工具类SmsUtil
- 修改消息监听类,完成短信发送
5. 商品上下架消息处理(作业)
一.需求分析
- 在商品上架后,生成商品详细页和新增elasticsearch索引数据。
在商品下架后,删除商品详细页和删除elasticsearch数据.
以上操作采用消息中间件rabbitmq解耦调用。
二.实现思路
- 因为有多种业务逻辑需要处理,所以我们需要使用分列模式来处理请求。
- 创建两个服务工程
一是商品详细页生成服务(qingcheng_service_page),对上架的商品重新生成上新品详细页。
二是索引数据更新服务(qingcheng_service_index),对上架的商品重新导入索引库。 - 通过配置文件实现:
rabbitmq 新增两个交换器 ,分别是商品上架交换器和商品下架交换器。
rabbitmq 新增商品详细页生成队列、商品详细页删除队列、elasticsearch数据新增队列、elasticsearch数据删除队列。
商品上架交换器绑定新增商品详细页生成队列和elasticsearch数据新增队列
商品下架交换器绑定商品详细页删除队列和elasticsearch数据删除队列 - 在商品服务的上架发送消息到rabbitmq的商品上架交换器,在商品服务的下架发送消息到rabbitmq的商品下架交换器
- 商品详细页生成服务从 新增商品详细页生成队列和商品详细页删除队列提取消息进行逻辑处理
- 索引数据更新服务从elasticsearch数据新增队列和elasticsearch数据删除队列提取消息进行逻辑处理。
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。