网站集约化建设 要求,网站内容页怎么设计模板,如何开发微信公众平台,做网站采集目录 前言
RabbitMQ
什么是RabbitMQ
RabbitMQ特点
安装启动
RabbitMQ和Kafka的消息收发区别
RabbitMQ使用案例
添加依赖
添加配置
创建RabbitMQ配置类
RabbitMQ消息的发送
RabbitMQ消息的接收
测试
结语 前言
前一篇#xff0c;我们学习了Kafka的基本使用#…目录 前言
RabbitMQ
什么是RabbitMQ
RabbitMQ特点
安装启动
RabbitMQ和Kafka的消息收发区别
RabbitMQ使用案例
添加依赖
添加配置
创建RabbitMQ配置类
RabbitMQ消息的发送
RabbitMQ消息的接收
测试
结语 前言
前一篇我们学习了Kafka的基本使用这一篇我们来学习RabbitMQ。他们作为消息队列本身都具有很强大的功能博主写完后的感受是这也只能算是初体验了。毕竟师父领进门修行靠个人但是博主怎么会做这种师傅呢一定要手把手教会各位童鞋暂时不去深入的讲解了这一块内容等博主研究准备好之后会在后续的系列中对消息队列来一个进阶的教程大家先入个门慢慢学习微服务的东西很多先学会才是正道。
RabbitMQ
RabbitMQ多用于Java和Kafka多用于大数据不同RabbitMQ更偏向于功能性能一般所以在Java开发中比较受欢迎。那么下面我们就来了解一下RabbitMQ及其特点。
什么是RabbitMQ
RabbitMQ是使用Erlang语言开发的开源消息队列系统基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景对性能和吞吐量的要求还在其次。所以在Java业务中使用很多目前我所知道的很多都是用的此消息队列只不过大家评价都是功能强性能一般。与其相反的就是Kafka了性能强功能弱。
这是因为他们设计的目的不一样RabbitMQ 在有大量消息堆积的情况下性能会下降其优势体现在功能上。而Kafka一开始是用来处理海量日志的所以体现出来就是性能强功能弱。
所谓尺有所短寸有所长正是这个道理。全都兼顾的几乎是不存在的。
RabbitMQ特点
本想去百科里复制出来哈哈结果百科写的太简单了
可伸缩性集群服务消息持久化从内存持久化消息到硬盘再从硬盘加载到内存
真是想偷懒都没办法。
RabbitMQ拥有数以万计的用户是最受欢迎的开源消息代理之一。从T-Mobile到RuntasticRabbitMQ在全球范围内用于小型初创企业和大型企业。
RabbitMQ体量轻易于在本地和云端部署。它支持多种消息协议。RabbitMQ可以部署在分布式和联合配置中以满足大规模、高可用性的要求。
RabbitMQ可在许多操作系统和云环境中运行并为大多数流行的语言提供大量的开发工具。
官网地址RabbitMQ Tutorials — RabbitMQ
RabbitMQ的可靠性体现在持久化、传输确认和发布确认上。
Flexible Routing灵活路由消息进入队列之前通过RabbitMQ内置的Exchange来路由消息 针对一些复杂路由还能将多个Exchange绑定在一起通过插件实现自己的Exchange。
集群这个是很多微服务软件都有的功能比如RedisES等通过此功能可以实现高可用性的能力在一个节点发生故障时其他节点能快速使用。
多协议RabbitMQ支持多种协议具体看这里Which protocols does RabbitMQ support? — RabbitMQ
多语言客户端RabbitMQ 几乎支持所有常用语言具体可查看这里Clients Libraries and Developer Tools — RabbitMQ
管理监控这个我们在下面安装的时候会提到此后台页面还会登录上去给大家看类似于nacos的管理页面通过此界面可以管理和监控RabbitMQ。
插件RabbitMQ 提供了许多插件可多方面扩展也可以自定义插件详情可看这里Plugins — RabbitMQ
以上可通过访问此链接查看详细内容Messaging that just works — RabbitMQ
安装启动
这也是本篇内容最痛苦的一个地方因为RabbitMQ是Erlang语言开发的,所以要先安装Erlang语言的运行环境为了不去分别讲解Mac和Windows的安装方式博主准备偷个懒让大家也偷个懒。
首先看到这里足以说明是至少是一名初级Java工程师你至少开发过一个项目那么你一定知道Docker所以下面让我们愉快的使用Docker来安装RabbitMQ吧。
在Docker中搜索RabbitMQ下载rabbitmq:management 你下载上面的那个也是可以的都没关系。
接着打开终端在里面直接输入记住是直接输入不用进任何目录
docker run -d --hostname localhost --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:management 这个命令输入完成你的 rabbitmq容器就已经跑起来了 此时为了测试rabbitmq是否启动成功我们需要在浏览器输入http://localhost:15672
打开后是一个登录页面 因为没有设置登录的账户名和密码所以我们采用默认的账户密码guest来登录输入账户密码都为guest即可登录 如果你想添加用户密码那就来这里 如果你想修改当前用户密码你可点击此处 有个Update this user输入新密码即可 如果你不想使用当前用户名那就新增一个用户再删除原来的用户。到这里安装启动这一环节就结束了你说博主是不是偷了个大懒呢
RabbitMQ和Kafka的消息收发区别
Kafka使用话题名称来收发信息同一个话题一个发可多个收使用起来结构简单易懂。
RabbitMQ则要略复杂些它是通过交换机和路由key来指定要发送的消息队列生产者发送消息时指定交换机和路由key这样一个确定的消息队列就产生了而消费者只需要指定这个产生的消息队列就可以接收到消息。
所以在编写代码时RabbitMQ会比Kafka多一个配置类确切的说是每个业务都要有一个配置类这个配置类坐的就是指定交换机和路由key再由路由key指定队列的工作。
RabbitMQ使用案例
此处我们依然采用前面的微服务项目作为基础在stock模块来完成RabbitMQ的简单使用。
添加依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId
/dependency 添加配置 spring:rabbitmq:host: localhostport: 5672username: guestpassword: guestvirtual-host: / 用户名和密码要用你上面管理页面添加的 有效用户名密码不添加默认guest。
创建RabbitMQ配置类
上面提到过交换机路由key队列这三者的指定需要在配置类中完成具体要怎么做我们来看看stock模块之前写过quartz我们就把config类建在quartz包下
package com.codingfire.cloud.stock.quartz;import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;// SpringBoot整合RabbitMQ之后
// 这些配置信息要保存在Spring容器中,所以这些配置也要交给SpringBoot管理
Configuration
public class RabbitMQConfig {// 声明需要使用的交换机\路由Key\队列的名称public static final String STOCK_EXstock_ex;public static final String STOCK_ROUTstock_rout;public static final String STOCK_QUEUEstock_queue;// 声明交换机,需要几个声明几个,这里就一个// 方法中实例化交换机对象,确定名称,保存到Spring容器Beanpublic DirectExchange stockDirectExchange(){return new DirectExchange(STOCK_EX);}// 声明队列,需要几个声明几个,这里就一个// 方法中实例化队列对象,确定名称,保存到Spring容器Beanpublic Queue stockQueue(){return new Queue(STOCK_QUEUE);}// 声明路由Key(交换机和队列的关系),需要几个声明几个,这里就一个// 方法中实例化路由Key对象,确定名称,保存到Spring容器Beanpublic Binding stockBinding(){return BindingBuilder.bind(stockQueue()).to(stockDirectExchange()).with(STOCK_ROUT);}
}都是比较固定的模版直接用就行。
RabbitMQ消息的发送
发送消息我们可以在QuartzJob类中进行
package com.codingfire.cloud.stock.quartz;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;import java.time.LocalDateTime;public class QuartzJob implements Job {// RabbitTemplate就是amqp框架提供的发送消息的对象Autowiredprivate RabbitTemplate rabbitTemplate;Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {//输出当前时间System.out.println(-------------- LocalDateTime.now() ---------------);// 先简单的发送一串文字rabbitTemplate.convertAndSend(RabbitMQConfig.STOCK_EX,RabbitMQConfig.STOCK_ROUT,黄河之水天上来奔流到海不复还。);}
}我们在讲解Quartz时只用这个类每隔10s打印出当前时间现在我们在打印时间的同时再用RabbitMQ发送一串文字rabbitTemplate和使用redi很像不同的是这里是通过template指定发送的交换机和路由。
RabbitMQ消息的接收
我们在quartz包下再建一个用于接收消息的类
package com.codingfire.cloud.stock.quartz;import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;// 这个对象也是需要交由Spring容器管理的,才能实现监听Spring容器中保存的队列的效果
Component
// 和Kafka不同的是Kafka在一个方法上声明监听器
// 而RabbitMQ是在类上声明,监听具体的队列名称
RabbitListener(queues {RabbitMQConfig.STOCK_QUEUE})
public class RabbitMQConsumer {// 监听了类,但是运行代码的一定是个方法// 框架要求这个类中只允许一个方法包含下面这个注解// 表示这个方法是处理消息的方法// 方法的参数就是消息的值RabbitHandlerpublic void process(String str){System.out.println(接收到的消息为:str);}}里面的方法名可以是自定义的只要类上指定队列名称就可以接收类中注释认真看要记住。
测试
做完这些下面就是启动并测试的环节由于此微服务模块配置了nacos和seata所以这两个服务是要起的接着就是RabbitMQ上面已经教大家启动过了保证是运行状态然后运行stock的启动文件在控制台查看消息发送接收的情况由于博主还依赖了数据库此处还需要启动mysql服务大家根据自身情况启动服务然后再次运行 可以看到我们的消息收发是正常的测试成功同时能看到我们做Quartz时减少库存的操作也在运行。这就是 RabbitMQ的基本使用。
在RabbitMQ后台也能看到我们注册的交换机和消息队列等信息 感兴趣的可以去看看。
结语
又到了说再见的时候RabbitMQ和Kafka一样博大精深这里只是基本的使用你只要知道他们是用来收发消息的且不需要关心什么时候完成你可以认为他们是在系统不忙的时候才去做这样可以降低服务器压力另外还能实时监控 是不是很方便呢赶快到自己的项目中使用吧。