工程建设网站怎么提交,网络搭建与维护,网站安全制度体系的建设情况,网站备案 拍照在往期文章中#xff0c;我们讲了如何在Windows与Linux环境下安装RabbitMq服务#xff0c;并访问Web管理端。 有很多同学其实并不知道RabbitMq是用来干嘛的#xff0c;它起到一个什么作用#xff0c;并且如何在常见的SpringBoot项目中集成mq并实现消息收发#xff0c;本章… 在往期文章中我们讲了如何在Windows与Linux环境下安装RabbitMq服务并访问Web管理端。 有很多同学其实并不知道RabbitMq是用来干嘛的它起到一个什么作用并且如何在常见的SpringBoot项目中集成mq并实现消息收发本章就来给大家讲解一下什么是RabbitMq并对接Java项目实现生产者与消费者。 –分割线– 为什么要使用RabbitMq 通常我们服务与服务直接调用时通过Http接口或者Rpc远程调用的方式进行但是这种方式对服务直接耦合性和依赖性比较高在使用时两个服务必须同时在线否则将无法使用所以为解决此问题我们引入了RabbitMq消息中间件发送者可以直接将数据载体发送至云端上接收者随时都可以主动在云端读取想要的数据相互之间不牵制不影响降低耦合性。
什么是RabbitMq能干什么 RabbitMQ是一个开源的消息代理软件实现了高级消息队列协议(AMQP)。它是一个面向消息的中间件用于在分布式系统中存储和转发消息。RabbitMQ的主要组件包括生产者、消费者和代理其中代理负责将消息路由到相应的消费者。这种模型允许应用程序在不直接依赖彼此的情况下进行通信从而实现异步和解耦。 RabbitMQ支持多种客户端如Python、Java、PHP等并且可以在不同平台上运行包括嵌入式系统、多核心集群以及基于云端的服务器。它具有高可用性、灵活的路由扩展性和易用性等特点适用于大型软件系统的模块之间高效通信支持高并发和可扩展性。
什么是消息队列
通常说的消息队列简称MQMessage Queue指的就是消息中间件。简单理解为一个使用队列来通信的组件本质上就是个转发器包含发消息存消息消费消息的过程。
此时生产者将消息发送到队列中由消费者依次进行消费是一种先进先出的模式并且所有消息为串行每次只有一条消息被递出。在RabbitMq中也是这样的队列不同的是RabbitMq中消息既可以直接推送到队列也可以将消息推送到交换机由交换机经过一些列策略再推送到队列中。
RabbitMq的组成结构
1. 服务器broker
RabbitMQ 服务器是 RabbitMQ 的核心组件负责管理所有的交换器和队列。一个 RabbitMQ 实例可以包含多个服务器每个服务器负责一部分交换器和队列。服务器之间通过 HTTP 协议通信可以使用多种方式进行部署如单机、集群、云服务等。
2. 交换器exchange
交换器是 RabbitMQ 中的消息传递核心负责接收、路由、传递消息。RabbitMQ 支持多种交换器类型如 fanout、direct、topic 等每种类型的交换器都有不同的消息传递方式和应用场景。
3. 队列queue
队列是 RabbitMQ 中的消息存储容器用于存储消息。RabbitMQ 支持多种队列类型如持久化、非持久化、排他访问等每种类型的队列都有不同的存储方式和应用场景。
4. 用户admin
管理用户与用户权限所属的host比如系统默认的guest用户只能在本地服务使用如果想要其他同事也使用rabbitmq服务就需要新建一个用户并设置host与权限。
5. 虚拟主机virtual Hosts
将所有交换机与队列等进行虚拟隔离不同的host之间相互独立无法互通类似于docker中的容器概念。
6. 生产者producer
实际产生消息的地方将消息投递至队列或交换机的发送者。
7. 消费者consumer
接收队列中消息的地方消费消息读取消息并消耗掉。
到这里我们想把消息发送到Mq上还不够还需要了解它的工作模式才能更好的使用它。
RabbitMq的工作模式有哪些
官方网站中给出了7种模式
地址https://www.rabbitmq.com/tutorials
1、简单模式 一个生产者一个队列一个消费者生产者直接将消息发送至队列并由消费者消费。2、工作模式 一个生产者一个队列多个消费者此时队列里的消息会随机分配给其中一个消费者即一个消息只能被一个消费者消费分工合作。3、发布/订阅模式广播模式 一个生产者一个交换机多个队列多个消费者交换机类型为fanout此时生产者将消息发送至交换机由交换机广播至所绑定的队列中每一个队列都有相同的消息再由消费者进行消费。4、路由模式 一个生产者一个交换机多个队列多个消费者交换机类型为direct、此时生产者发送消息时会携带一个关键字专业名词叫routing key再由交换机与队列之间的绑定匹配策略进行分发由消费者进行消费。5、主题模式 此模式与4中模式一致交换机类型为topic、在携带关键字的基础上增加了通配符如*#等。第6第7中主要是介绍消息传递机制可简单理解为消息发布确认与消息消费确认。
SpringBoot如何对接RabbitMq 好接下来我们就来具体实现一下在SpringBoot项目中如何对接RabbitMq并实现消息发送与接收。 第一步导入Pom
!-- rabbit --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId
/dependency第二步、在Yml文件中Spring下增加配置
spring:# rabbitmqrabbitmq:host: 127.0.0.1port: 5672username: guestpassword: guestvirtual-host: /我们暂且先使用guest账号host使用默认。第三步、创建RabbitMq的配置类
本次我们采用最常用的路由模式符合大多数业务。/*** rabbitmq配置类* author wfeil211foxmail.com*/
Configuration
public class RabbitConfig {// Direct交换机BeanDirectExchange routingExchange() {return new DirectExchange(routingExchange, true, false);}// queueBeanpublic Queue routingQueueOne() {return new Queue(routingQueueOne, true);}// 绑定BeanBinding bindingAsDirectOne() {return BindingBuilder.bind(routingQueueOne()).to(routingExchange()).with(routingKey);}// queueBeanpublic Queue routingQueueTwo() {return new Queue(routingQueueTwo, true);}// 绑定BeanBinding bindingAsDirectTwo() {return BindingBuilder.bind(routingQueueTwo()).to(routingExchange()).with(routingKey);}
}这里创建了一个交换机两个队列并使用routingKey将队列与交换机进行绑定上。第四步、创建一个生产者类
/*** 生产者* author wfeil211foxmail.com*/
Slf4j
Service
public class RabbitMqProducer {Autowiredprivate RabbitTemplate rabbitTemplate;/*** 发送消息*/public void sendMessage() {rabbitTemplate.convertAndSend(routingExchange, routingKey, 这是生产者发来的消息);}}第五步、创建两个消费者
/*** 消费者-1* author wfeil211foxmail.com*/
Slf4j
Component
public class ConsumerOne {/*** 监听队列*/RabbitListener(queues routingQueueOne)public void listenMessage(Message message) {log.info(消费者-1收到mq消费请求message{}, new String(message.getBody()));try {// 业务处理String content new String(message.getBody());} catch (Exception e) {log.error(mq消费异常原因{}, e.toString());}}
}/*** 消费者-2* author wfeil211foxmail.com*/
Slf4j
Component
public class ConsumerTwo {/*** 监听队列*/RabbitListener(queues routingQueueTwo)public void listenMessage(Message message) {log.info(消费者-2收到mq消费请求message{}, new String(message.getBody()));try {// 业务处理String content new String(message.getBody());} catch (Exception e) {log.error(mq消费异常原因{}, e.toString());}}
}第六步、启动服务
当我们启动好服务后在我们的RabbitMq-Web管理端就可以看到创建的交换机与队列。此时的两个队列已经绑定到交换机中
第七步、发布消息与消费消息
1、编写调用代码
/*** 接口调用* author wfeil211foxmail.com*/
RestController
RequestMapping(/rabbitPath)
public class RabbitMqProducerController {Autowiredprivate RabbitMqProducer rabbitMqProducer;PostMapping(/send)public void send() {rabbitMqProducer.sendMessage();}
}2、先将消费者代码注释掉启动服务使用PostMan接口功能进行发起调用消息成功发送到RabbitMq服务上。 3、放开消费者代码启动服务消息成功被消费。 教程到这里就结束了是不是非常简单上面提到发布确认与消费确认我们下期文章再详细讲解。 本次教程到这里就结束了希望大家多多关注支持首席摸鱼师 微信同号持续跟踪最新文章吧~