1.消息队列的使用场景:
1.解耦
2.流量削峰
3.异步处理
4.日志处理
5.消息通讯
1.Message
消息:由消息头和消息体组成,消息体是不透明的;消息头则由一系列不可选属性组成,这些属性包括routing-key(路由键)、priority(优先级别)、delivery-mode(是否持久化属性)
2.Publisher
消息的生产者,也是一个向交换器发布消息的客户端应用程序。
3.Consumer
消息的消费者:消费由生产者发送到队列中的消息。
4.Exchange
交换器:用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
三种常用的交换器类型:direct(发布与订阅)、fanout(广播)、topic(主题,规则匹配)
5.Binding
绑定:用于消息队列和交换器之间的映射。绑定就是通过路由键将交换器和队列连接起来的路由规则。
6.Queue
消息队列:用来保存消息知道发送给消费者,是消息的容器,一个消息可以投入一个或多个队列中,等待消费者取走。
7.Routing-Key
路由键:rabbitmq决定消息该投递到那个队列的规则。消息发送到mq服务器时,消息将拥有一个路由键,即便时空,rabbitmq也会将其和绑定使用的路由键进行匹配。
如果相匹配,消息将会投递到该队列;如果不匹配,消息将进入黑洞(rabbitmq单独存放在Queue中)
8.Connection
连接:rabbit服务器和服务建立的tcp链接
9.Channel
信道:客户端和rabbitmq之间会创建AMQP信道,无论发布消息,接收消息,订阅队列,这些都需要通过信道完成,一个链接中可存在多个信道。
10.virtual host
虚拟主机:表示一批交换器,消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是一个mini版的rabbitmq服务器,拥有自己的队列,交换器,绑定和权限机制,vhost是AMQP概念的基础,必须在连接时指定,rabbitmq默认vhost是/
11.borker :消息队列服务器实体。
交换器和队列的关系:
交换器通过路由键和队列绑定到一起,如果消息拥有的路由键跟消息队列和交换器的路由键匹配,那么消息就会被路由到该绑定的队列中。
rabbitmq为什么需要信道,而不是直接使用tcp通信?
1.TCP的创建和销毁开销特别大,创建需要3次握手,销毁需要4次分手。
2.信道的原理是一条线程一条通道,多条线程多条通道同用一条TCP链接,一条TCP链接可以容纳无限的信道,即使每秒成千上万的请求也不会成为性能瓶颈。
创建rabbitmq的springboot项目需要的依赖
客户端
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sbh</groupId>
<artifactId>rabbitmq-server</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<build>
<finalName>rabbitmqServer</finalName>
</build>
</project>
配置application文件
#rabbitmq配置文件
spring.rabbitmq.host=192.168.106.130
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#队列名称
mq.rabbitmq.queue.info=log.queque.info
#交换器名称
mq.rabbitmq.exchange.info=log.exchange.info
#路由键
mq.rabbitmq.routingKey.info=log.info
server.port=8081
package com.sbh.rabbitmq.client;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
*
* @author CYH
*
*/
@Component
@RabbitListener(bindings=@QueueBinding(
exchange=@Exchange(value="${mq.rabbitmq.exchange.info}",type=ExchangeTypes.DIRECT),
value=@Queue(autoDelete="true",value="${mq.rabbitmq.queue.info}"),
key="${mq.rabbitmq.routingKey.info}"
))
public class Client {
@RabbitHandler
public void hand(String message){
System.out.println("消费者"+message);
}
}

生产者:
server.port=8080
#rabbitmq配置文件
spring.rabbitmq.host=192.168.106.130
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#队列名称
mq.rabbitmq.queue.info=log.queque.info
#交换器名称
mq.rabbitmq.exchange.info=log.exchange.info
#路由键
mq.rabbitmq.routingKey.info=log.info
package com.sbh.rabbitmq.server;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ServerService {
@Value("${mq.rabbitmq.exchange.info}")
private String exchange;
@Value("${mq.rabbitmq.routingKey.info}")
private String routingKey;
@Autowired
private AmqpTemplate amqpTemplate;
public void message() {
amqpTemplate.convertAndSend(exchange, routingKey, "你好");
}
}
测试代码:
package com.sbh.rabbitmq.server;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(value=SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=App.class)
public class ServerServiceTest {
@Autowired
private ServerService serverService;
@Test
public void testMessage() {
while (true) {
try {
serverService.message();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

rabbitmq服务器添加交换器

队列:

绑定交换器和队列

输出结果:



被折叠的 条评论
为什么被折叠?



