rabbitmq简介与使用

概述

1,大多应用中,都可以通过消息中间件来提升系统异步通信,扩展解耦能力,中间件也可以说是消息队列

2,消息服务中两个关键点:

  • ​ 消息代理:也就是消息中间件的服务器,我们需要往消息中间件存数据,需要连接服务器,然后服务器会把消息发往目的地
  • 目的地:消息队列主要有两种形式的目的地
    • 队列:点对点消息通信,发送者发出消息,消息代理将其放入队列,接收者从队列获取消息,消息被移出队列,消息只有唯一的发送者与接受者(因为消息只有一个,取出去就没有了,自然第二个人取不出)
    • 主题:发布与订阅:发布者发送消息到主题,多个接收者订阅主题,只要发消息,所有人都能收到消息

JMS消息服务

是一个规范,ActiveMQ是实现了这种规范的中间件

AMQP

也是一种消息代理的规范,rabbitMQ就是实现了这种规范的中间件

可以跨语言,跨平台

spring支持它们两者。

  • spring在底层提供了JmsTemplate与RabbitTemplate来使用他们发送消息
  • 通过connectionFactory的实现来连接消息代理
  • @JmsListener 与@RabbitListener 注解在方法上监听消息代理发布的信息
  • @EnableJms @EnableRabbit 开启功能

RabbitMQ简介

实现了AMQP规范的中间件

核心:

message:由消息头与消息体组成,消息体是不透明的而消息头由一系列可选属性组成

Publisher:消息生产者,也是向交换器发布消息的客户端

Exchange:交换器,存在于服务器,用来接收生产者发布的消息并将这些消息路由给服务器中的队列

交换器有四种类型,不同类型有不同的转发消息策略

Queue:消息队列,消息的容器,在消息队列服务器中,可能有很多队列,交换器根据消息的类型分配给不同的消息队列,

Binding:绑定,消息队列与交换器之间的关联,一个绑定就是基于路由键将交换器与消息队列连接起来的规则

可以将交换器理解为一张绑定规则的路由表,交换器与队列可以是多对多关系

Conection:网络连接

Channel:信道,发送消息时,我们只需要一条连接,然后在这个连接里面开辟好的信道,来发送消息

Consumer:消费者,从队列获取消息的客户端

Virtual Host:虚拟主机,vHost本质是一个mini的rabbitmq服务器,必须在连接时指定,默认是/

Broker:消息队列服务器实体

关系图

解释为:生成者发出消息,由交换器接收,交换器根据绑定规则把消息放入队列中,交换器与队列都处于服务器中,Broker是服务器实体,Vhost是虚拟体,接着消费者通过一条连接拿到队列中的消息,一个连接里面分了多个信道

交换器类型

  • direct:直连式,作用是,发送消息时所带的路由键key与绑定中的队列名字一致,就会发送消息到对应的队列,点对点
  • Fanout:不管什么信息,只要发送给一个队列,就会给所有绑定了的队列发送一份,参考发布订阅
  • Topic:自定义消息与队列对应的key

可以说,direct是一对一,fanout是一对多,topic是多对多(路由键与队列名)

Rabbit安装

我们在docker中直接使用docker pull rabbitmq:3-management 指令下载rabbitmq的镜像

并且运行,开放15672与5672端口。之后我们就能通过服务器地址访问15672端口查看rabbitmq的图形化界面了

注意默认账号密码是,guest

然后我们可以手动生成交换器,绑定规则,队列,包括发送消息时带上路由键

Rabbit的使用

1,导入依赖

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
		</dependency>

2,配置类

package com.lcx.config;

import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMqConfig {

	@Bean//可以使数据以json格式来回
	public MessageConverter messcon() {
		
		return new Jackson2JsonMessageConverter();
	}
}

3,使用

	@Autowired
	RabbitTemplate rt; //使用此对象发送接收数据
	@Autowired
	AmqpAdmin ad;  //使用此对象创建或删除交换机,队列,或绑定


rt.convertAndSend("exchange.direct","news",map);
		//指明交换器,路由键,消息内容,即可发送

Object object = rt.receiveAndConvert("news");//指明队列名即可获取队列里的数据

           //  创建的操作在图形化界面直接创建或者使用ad创建

4,监听

//在service层写一个监听方法,标上注解,指明监听哪个队列
@RabbitListener(queues = "news")//这个方法监听这个队列,只要有消息进入,马上输出
	public void recive(Message msg) {
		System.out.println(msg.getBody());
	}

//还需要在启动类,开启此功能
@EnableRabbit//开启注解的rabbit
posted @ 2020-09-07 15:21  不如吃茶_去  阅读(318)  评论(0)    收藏  举报