属于一个流行的开源消息队列系统。属于AMQP( 高级消息队列协议 ) 标准的一个实现。是应用层协议的一个开放标准,为面向消息的中间件设计。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布 / 订阅)、可靠性、安全RabbitMQ特点
使用Erlang编写
支持持久化
支持HA
提供C# , erlang,java,perl,python,ruby等的client开发端
Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字, exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个
channel代表一个会话任务。
首先,我们要搭建一个rabbitMq服务器,这里我为了方便,使用Docker进行部署
# 拉取rabbitmq的management版本的镜像
docker pull rabbitmq:3-management
# 运行rabbitmq容器
docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq a28dlc29a835 # 这是镜像id
运行容器后,直接访问 localhost:15672 进入到以下页面就说明安装成功了
安装好服务器后,开始用java代码实现一个简单的发消息和接收消息的案例
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-amqpartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
<exclusions>
<exclusion>
<groupId>org.junit.vintagegroupId>
<artifactId>junit-vintage-engineartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.springframework.amqpgroupId>
<artifactId>spring-rabbit-testartifactId>
<scope>testscope>
dependency>
// 该注解表示当前类是一个配置对象
@Configuration
public class RabbitConfig {
@Bean
Queue testQueue(){
// 队列名称
return new Queue("testQueue");
}
/**
* 交换机
* @return
*/
@Bean
DirectExchange testExchange(){
return new DirectExchange("testExchange");
}
/**
* 将交换机与队列进行绑定
*/
@Bean
Binding testBinding(){
return BindingBuilder
.bind(testQueue())
.to(testExchange())
.with("testKey");
}
}
@RestController
public class SendMsgController {
@Autowired
private RabbitTemplate rabbitTempate;
// 这个接口用于发送消息
@GetMapping("/send")
public String sendMsg(String msg) {
rabbitTempate.convertAndSend("testExchange","testKey",msg);
return "OK";
}
}
入口类不做任何修改
配置文件
server.port=8081
spring.application.name=mq
spring.rabbitmq.host=121.40.176.56
# 下面为默认值,在没有修改的情况下可写可不写
#spring.rabbitmq.username=guest
#spring.rabbitmq.password=guest
#spring.rabbitmq.port=5672
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-amqpartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
<exclusions>
<exclusion>
<groupId>org.junit.vintagegroupId>
<artifactId>junit-vintage-engineartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.springframework.amqpgroupId>
<artifactId>spring-rabbit-testartifactId>
<scope>testscope>
dependency>
@Configuration
public class RabbitConfig {
@Bean
Queue testQueue(){
// 队列名称
return new Queue("testQueue");
}
/**
* 交换机
* @return
*/
@Bean
DirectExchange testExchange(){
return new DirectExchange("testExchange");
}
/**
* 将交换机与队列进行绑定
*/
@Bean
Binding testBinding(){
return BindingBuilder.
// 绑定消息队列到交换机
bind(testQueue()).
to(testExchange()).
// routingKey 为 testKey
with("testKey");
}
}
@Component
public class MyRabbitListener {
// 监听testQueue这个队列
@RabbitListener(queues = "testQueue")
public void test(String msg){
// 打印接收到的消息
System.out.println(msg);
}
}
入口类不做任何改变
配置文件
server.port=8080
spring.application.name=mq
spring.rabbitmq.host=121.40.176.56
#spring.rabbitmq.username=guest
#spring.rabbitmq.password=guest
#spring.rabbitmq.port=5672
两个项目运行后,在浏览器地址栏里面访问localhost:8081/send?msg=helloWorld
在第二个项目的控制台里面如果有打印出来 helloWorld 就说明成功了