RabbitMQ入门
单体架构的优点:简单方便,但是扩展性差。
分布式结构:对也业务进行拆分,每一个业务模块都作独立项目开发,可以降低耦合度。
SpringAMQP
高级消息队列协议,传递业务消息的规则。
SpringAMQP --发送消息
(publisher发送者)
①在父工程中导入依赖
<!--AMQP依赖,包含RabbitMQ-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
②添加mq的连接消息
spring:
rabbitmq:
host: 127.0.0.1 # 主机名
port: 5672 # 端口
virtual-host: / # 虚拟主机
username: guest # 用户名
password: guest # 密码
③注入rabbitTemplate
@Autowired
private RabbitTemplate rabbitTemplate;
④测试
@Test
public void testSendMessage2SimpleQueue(){
String queueName = "simple queue";
String message = "hello,spring amqp";
rabbitTemplate.convertAndSend(queueName,message);//队列名称,消息内容
}
SpringAMQP–接收消息
(consumer监听信息)
①在配置文件yml中
spring:
rabbitmq:
host: 127.0.0.1 #地址
virtual-host: / #虚拟主机
username: guest #用户名
password: guest #密码
port: 5672 #端口号
②编写消费者逻辑
@Component
public class SpringRabbitListener {
@RabbitListener(queues = "simple.queue")//监听的队列名称
public void listenSimpleQueue(String msg){
System.out.println("消费者接受到消息"+msg);
}
Work Queue工作队列
多个消费者绑定一个队列,同一条消息只会被一个消费者处理(防止消息堆积,提高处理速度)
交换机的作用
①接收publisher发送的消息
②将消息按照规则路由到与之绑定的队列
③不能缓存消息,路由失败,消息丢失
④FanoutExchange的会将消息路由到每一个绑定的队列
发布订阅
概念:允许同一信息发送给多个消费者,实现方式加入了exchange交换机(消息路由而不是存储只负责消息的转发)
类型:
①fanout广播
②Direct路由
③Topic话题
fanout广播模式
接收到的所有消息,只发送给绑定了queue的每一个队列
①手动绑定队列
②发送消息
③消息接收
Direct路由模式
将接收到的消息发送给指定的Queue
(Exchange通过对比bindingKey和RoutingKey是否一致,如果一致发送指定的消息)
①接收消息
②发送消息
Topic话题模式
和direct几乎相同,只不过topic的routingKey可以是多个单词的列表。*表示一个单词,#0个或者多个单词
(多种类型支持多个通配符)
接收端:
发送端:
消息转换器
①导入依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.10</version>
</dependency>
②发送端
③在启动类中设置消息转换器
/*消息转换器*/
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}