docker安装RabbitMQ
1.拉取RabbitMQ镜像
docker pull rabbitmq:latest
2.运行容器
自己创建了一个网络指定网络 --network=docker_network
docker run -d --name rabbitmq -p 5673:5672 -p 15673:15672 --network=docker_network --restart=always -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 rabbitmq:latest
如果不设置用户名和密码默认都是guest
3.docker logs rabbitmq
查看是否运行成功
4.放开这两个端口5673 、15673
5.开启web管理页面
5.1 需要先登录进容器中的rabbitmq
docker exec -it 容器名/容器id /bin/bash
5.2 执行下面命令
rabbitmq-plugins enable rabbitmq_management
6.访问这个页面
http://<宿主机IP地址>:15673
根据官网学习rabbitmq
官方文档:https://www.rabbitmq.com/tutorials
1.引入依赖
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.17.0</version>
</dependency>
hello world
复制这个发送消息的类到项目中
package com.yupi.springbootinit.mq;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.nio.charset.StandardCharsets;
public class SingleProducer {
//队列名称
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) throws Exception {
//1.创建到rabbitmq服务器的连接
ConnectionFactory factory = new ConnectionFactory();
//2.1指定需要连接的rabbitmq的服务器ip
factory.setHost("47.120.4.160");
//如果修改了用户名和密码和访问端口号,就需要进行设置
factory.setUsername("admin");
factory.setPassword("123456");
factory.setPort(5673);
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
//2.2声明一个队列
//queueName:消息队列名称(注意,同名称的消息队列,只能用同样的参数创建一次)
//durabale:消息队列重启后,消息是否丢失
//exclusive:是否只允许当前这个创建消息队列的连接操作消息队列
//autoDelete:没有人用队列后,是否要删除队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World!";
//使用channel.basicPublish方法将消息发布到指定的队列中。这里我门指定的队列名为"hello"
channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
Work Queues(多消费者)
公平分配:一人一条
交换机
- fontout:广播,很适合发布/订阅模型
也就是生产者发送一条消息,绑定这个交换机的每个队列都会收到这条消息
生产者和队列都需要绑定同一个交换机
Direct交换机【常用】
绑定:交换机和队列进行关联,可以让交换机把指定的消息发送给哪些队列。
routingKey:控制消息要转发到哪个队列的
消息会根据这个routingKey发送到指定的队列
一个队列可以绑定多个路由键
特点:绑定关系完全匹配路由键
Topic交换机【常用】
特点:消息会根据一个模糊的路由键转发到指定的队列
场景:特定的一类消息可以交给特定的一类系统(程序)来处理
绑定关系:可以模糊匹配多个绑定
*:匹配一个单词
#:匹配0个或多个单词
Headers交换机
性能差,实践比较复杂,不推荐使用
使用消息队列实现RPC远程过程调用
没必要直接使用现成的Dubbo、GRPC等RPC框架就好。