MQ全称为Message Queue,即消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。常见的消息队列产品(消息队列中间件)ActiveMQ、RabbitMQ、Kafka、RocketMQ等。
消息队列应用场景:
- 任务异步处理,将不需要同步处理的并且耗时长的 *** 作由消息队列通知消息接收方进行异步处理
- 应用程序解耦 ,MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合
RabbitMQ是由erlang语言开发,基于AMQP( Advanced Message Queuing Protocol,即高级消息队列协议)实现的消息队列产品。
RabbitMQ官方地址:http://www.rabbitmq.com/
RabbitMQ的优点:
- 使用简单,功能强大
- 基于AMQP协议
- 社区活跃,文档完善
- 高并发性能好,这主要得益于Erlang语言
- Spring Boot默认已集成RabbitMQ
RabbitMQ的工作原理如下:
组成部分说明如下:
- Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue。
- Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过滤。
- Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。
- Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。
- Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。
拉取镜像:
docker pull rabbitmq:3.7.7-management
查看镜像:
docker images
启动服务:
docker run -d --name rabbitmq3.7.7 -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin 2888deb59dfc
参数说明:
-d 后台运行容器;
–name 指定容器名;
-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
-v 映射目录或文件;
–hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)
访问web控制台:
http://服务ip:15672/
登录成功:
第一步:创建maven工程并配置pom.xml文件
4.0.0 org.springframework.boot spring-boot-starter-parent2.2.5.RELEASE com.test mq-producer1.0-SNAPSHOT org.springframework.boot spring-boot-starter-amqporg.springframework.boot spring-boot-starter-test
第二步:编写配置文件application.yml
spring: rabbitmq: host: 68.79.7.219 port: 5672 username: admin password: admin@2021 virtual-host: /
第三步:编写配置类RabbitmqConfig
package com.test.rabbitmq.config; import org.springframework.amqp.core.*; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitmqConfig { public static final String EXCHANGE = "myexchange"; public static final String QUEUE = "myqueue"; public static final String ROUTING_KEY = "fire"; @Bean(EXCHANGE) public DirectExchange exchange() { return ExchangeBuilder.directExchange(EXCHANGE).durable(true).build(); } @Bean(QUEUE) public Queue queue() { return new Queue(QUEUE); } @Bean public Binding binding(@Qualifier(QUEUE) Queue queue, @Qualifier(EXCHANGE) DirectExchange exchange) { return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY); } }
第四步:编写启动类RabbitmqApplication
package com.test; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class RabbitmqApplication { public static void main(String[] args) { SpringApplication.run(RabbitmqApplication.class,args); } }
第五步:编写测试类
package com.test.rabbitmq.test; import com.test.rabbitmq.config.RabbitmqConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @SpringBootTest @RunWith(SpringRunner.class) public class RabbitmqTest { @Autowired RabbitTemplate rabbitTemplate; @Test public void testSendMsg(){ rabbitTemplate.convertAndSend(RabbitmqConfig.EXCHANGE, RabbitmqConfig.ROUTING_KEY, "hello world"); } }
执行测试方法,可以通过RabbitMQ的web控制台查看消息已经发送到队列中,如下:
第一步:创建maven工程并配置pom.xml文件
4.0.0 org.springframework.boot spring-boot-starter-parent2.2.5.RELEASE com.test mq-consumer1.0-SNAPSHOT org.springframework.boot spring-boot-starter-amqporg.springframework.boot spring-boot-starter-test
第二步:编写配置文件application.yml
spring: rabbitmq: host: 68.79.7.219 port: 5672 username: admin password: admin@2020 virtual-host: /
第三步:编写启动类RabbitmqApplication
package com.test; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class RabbitmqApplication { public static void main(String[] args) { SpringApplication.run(RabbitmqApplication.class,args); } }
第四步:编写消息处理类MyConsumer
package com.test.consumer; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class MyConsumer { @RabbitListener(queues = {"myqueue"}) public void receive(String msg){ System.out.println("消费者接收到消息:"+msg); } }
执行启动类,查看控制台:
RabbitMQ提供了6种工作模式,分别为:
1、简单模式 Hello World
2、工作队列模式 Work Queue
3、发布/订阅模式 Publish/Subscribe
4、路由模式 Routing
5、通配符模式 Topics
6、RPC模式(不建议使用)
5.1 简单模式简单模式的特点为:一个生产者发送消息到队列,一个消费者接收。
工作队列模式的特点为:存在一个生产者和多个消费者, 多个消费者共同消费同一个队列中的消息。在工作队列模式下,一条消息只能被一个消费者接收到。对于任务过重或任务较多的情况下使用工作队列模式可以提高任务处理的速度。 rabbitmq采用轮询的方式将消息平均发送给消费者。
发布/订阅模式的特点为:每个消费者监听自己的队列。生产者将消息发送给交换机,由交换机将消息转发到绑定此交换机的每个队列,结果就是每个绑定交换机的队列都将接收到消息。
注意:在发布订阅模式下,交换机的类型为fanout
路由模式的特点为:
1、每个消费者监听自己的队列。
2、生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列。
注意:在路由模式下,交换机的类型为direct
通配符模式的特点为:
1、每个消费者监听自己的队列。
2、生产者声明队列和交换机,并且绑定交换机和队列时设置通配符方式的routingkey。
3、生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列。
注意:在通配符模式下,交换机的类型为topic
通配符规则:
1、中间以“.”分隔。
2、#可以匹配一个或多个词,*可以匹配一个词。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)