RabbitMQ 核心名词简介
Publisher:消息生产者
Exchange: 交换器,用来接收生产者发送的消息并将这些消息根据路由键和队列的绑定关系路由给服务器中的队列
Exchange有4种类型:direct(默认),fanout, topic, 和headers:
diract: 完全匹配策略,交换器的路由键key必须和binding中的路由key完全一直,才能发送消息到对应的消息队列,点对点模式;
fanout: 广播策略,不进行路由键的匹配,把消息发送给所有绑定了该交换器的队列,由于不进行路由键的匹配处理,速度最快
topic: 通配符匹配主题策略, 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。它同样也会识别两个通配符:符号“#”和符号“*”。#匹配0个或多个单词,*匹配一个单词
headers: 基本不用,匹配的是消息内的header,不是匹配的路由键,性能很差
Queue:消息队列
Binding:绑定关系,用来表示绑定交换器和队列的关联,一个交换器能指定多个队列,也可以是多对多的关系
路由键: 通过路由键的key来匹配到交换器和队列的绑定关系
Channel :
多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。
Consumer:消息消费者
Virtual Host :虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。
Broker: 表示消息队列服务器实体,就是一个rabbitmq服务器
1. 使用docker 简单安装
拉取镜像文件
(如果没配置国内镜像 则使用registry.docker-cn.com/library/rabbitmq 配置了国内镜像地址则直接使用 rabbitmq)
docker pull registry.docker-cn.com/library/rabbitmq
启动
docker -d --name myrabbitmq -p 5672:5672 -p 15672:15672 registry.docker-cn.com/library/rabbitmq
配置访问web页面
进入容器
docker exec -it b198e5bff969 /bin/bash
启动web管理模块命令如下(另外rabbitmq好多命令 ,百度下就可以知道)
rabbitmqctl start_app
rabbitmq-plugins enable rabbitmq_management访问 ip:15672
账号密码 guest : guest
使用springboot 集成使用
springboot 中的 amqpAdmin 封装了对交换器,队列等的系统操作,rabbitmqTemplate 封装了对消息的发送接受处理
添加依赖
org.springframework.boot
spring-boot-starter-amqp
配置 rabbitmq地址
编写配置类
/**
* Created by Administrator on 2018/11/30.
*自动配置类 RabbitAutoConfiguration
* 里面注入了 rabbitTamplate CachingConnectionFactory RabbitConnectionFactoryBean
* AmqpAdmin 系统管理组件
* RabbitProperties 封装了rabbitmq 配置
*@EnableRabbit // 开启rabbitmq 的自动配置
*/
@EnableRabbit // 开启rabbitmq 的自动配置
@Configuration
public class MyRabbitmqConfig {
}
手动在页面添加一个交换器exchanges
direct 策略的交换器
fanout 策略的交换器
topic 策略的交换器
添加 消息队列
绑定交换器和消息队列
编写消息发送服务者 代码
@Test
public void send() {
// 路由键默认等于队列名称
Map map = new HashMap();
map.put("123","123");
map.put("lists",new int[]{1,2,3});
rabbitTemplate.convertAndSend("xiaodu.direct","key01",map);
}
查看rabbitmq管理页面
如果传输的是对象则消息是对象序列化后的结果
接受代码
@Test
public void receive() {
// 参数为队列的名称 ,另外接受到的消息能自动反序列化回来,(注意实现序列化接口)
// 消息取出来会自动删除
Object o = rabbitTemplate.receiveAndConvert("xiaodu.queue01");
System.out.println("接受到消息为==" + o);
}
序列化规则
在springboot中自动使用的是SimpleMessageConverter默认是jdk的序列化规则
使用转换为json的messageConverter,在配置类中配置
使用后效果消息体中的内容Payload 是json类型的,而不是存储的对象序列化后的结果
测试广播模式:广播模式不用指定路由键,但是记得把交换器和你需要的队列绑定
使用监听 来获取队列中的消息: 使用注解@RabbitListener (注意要在开启rabbitmq配置 在启动类上添加@EnableRabbit)
@Service
public class RabbitmqService {
@RabbitListener(queues = "xiaodu.queue01")
public void receive(User user) {
System.out.println("监听到的消息为 = " + user);
}
}
//使用参数 Message 获取消息内容
@RabbitListener(queues = "xiaodu.queue01")
public void receive02(Message message) {
byte[] body = message.getBody();
System.out.println("接受到的消息体内容 = " + new String(body));
MessageProperties messageProperties = message.getMessageProperties();
System.out.println("接受到的消息headers= " + messageProperties);
}
使用AmqpAdmin 创建交换器 ,队列 ,绑定关系等
1 创建交换器 exchenge
根据不同的策略可以创建不同的交换器,创建 队列, 创建绑定关系
@Autowired
private AmqpAdmin amqpAdmin;
/**
* 创建
*/
@Test
public void createExchange() {
// 参数 交换器名, durable 是否持久化, autoDelete 是否自动删除
Exchange exchange = new DirectExchange("exchange.direct",true,false);
amqpAdmin.declareExchange(exchange);
// 创建 queue-01 队列
amqpAdmin.declareQueue(new Queue("queue-01"));
// 创建绑定关系
// destination 绑定的目的地, Binding.DestinationType destinationType 绑定的类型是交换器还是队列,
// String exchange 绑定到那个交换器上, String routingKey 路由键, Map arguments 命令参数
Binding binding = new Binding("queue-01",Binding.DestinationType.QUEUE,
"exchange.direct","exkey-01",null );
amqpAdmin.declareBinding(binding);
}
其他的操作都是大同小异,也可以在配置文件中直接注册 你的交换器。队列等
转载rabbitmq分布式:https://blog.csdn.net/gokeiryou263/article/details/54312094