消息中间件RabbitMQ
消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量,削峰等问题实现高性能,高可用,可伸缩和中一致性[架构] 使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
主要概念:
RabbitMQ server:
也叫borker server,它是一种传输服务. 它的角色就是维护一条从Producer到Consumer的路线.保证数据能够按照指定的方式进行传输
1. Producer:消息生产者,如图A,B,C数据的发送方法,消息消费者订阅队列,Rabbit MQ 服务器,然后将消息投递到Exchange
2. Consumer:消息消费者:如图1,2,3数据的接收方法,消息消费者订阅队列,RabbitMQ将Queue中的消息发送到消息消费者.
3. Exchange:生产者将消息发送到Exchange(交换器),由Exchange将消息路由到一个或多个Queue中(或者丢弃). Exchange并不存储消息.RabbitMQ中的Exchange有dicect.fanout,topic,headers四种类型,每种类型对应不同的路由规则
4.Queue(队列):Queue是RabbitMQ的内部对象,用于存储信息,消息消费者就是通过订阅队列来获取信息的,RabbitMQ中的信息都只能存储在Queue中,生产者生产者消息并终投递到Queue中,消息可以从Queue中获取消息并消费,多个消费者可以订阅同一个Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理
5.RoutingKey:生产者在将消息发送给Exchange的时候,一般会指定一个RoutingKey,来指定这个消息的路由规则,而这个RoutingKey需要与Exchange Type及Binding Key联合使用才能终生效.在Exchange Type与Binding Key固定的情况下(在正常使用是一般这些内容都是固定配置好的,)我们的生产者就可以在发送消息给Exchange时,通过指定Routing key来决定消息流向哪里,RabbitMQ为Routing key设定的长度限制为225 bytes
6. Connection(连接):Producer和Consumer都是通过TCP连接到RabbitMQ Server的.以后我们可以看到,程序的起始处就是建立这个TCP连接
7. Channels:(信道):他建立在上述的TCP连接中.数据流动都是在Channel中进行的.也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel
8. VirtualHost:权限控制的基本单位,一个VirtualHost里面有若干个Exchange个MessageQueue,以及指定被哪些user使用
RabbitMQ安装(必须在docker环境下安装)
安装命令:
docker run -di --name=rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:25672 rabbitmq:management
安装完成后查看容器:
docker ps
浏览器访问:
http://192.168.195.136:15672/#/ (此处的IP地址是虚拟机IP)
直接模式(Direct):
我们需要将消息发给唯一一个节点时使用这种模式,这是简单的一种形式任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
1.一般情况可以使用rabbitMQ自带的Exchange:”"(该Exchange的名字为空字符串,下 文称其为default Exchange)。
2.这种模式下不需要将Exchange进行任何绑定(binding)操作
3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。
4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。
引入amqp起步依赖 ,pom.xml如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
# application.yml配置文件中添加
rabbitmq:
host: 安装rabbitmq的虚拟机IP