Rabbitmq
属于一个流行的开源消息队列系统。属于AMQP( 高级消息队列协议 ) 标准的一个实现。是应用层协议的一个开放标准,为面向消息的中间件设计。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布 / 订阅)、可靠性、安全RabbitMQ特点
使用Erlang编写
支持持久化
支持HA
提供C# , erlang,java,perl,python,ruby等的client开发端
Rabbitmq中概念名词
Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字, exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个
channel代表一个会话任务。
下面开始简单的Hello RabbitMq
首先,我们要搭建一个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代码实现一个简单的发消息和接收消息的案例
1. 创建一个spring boot 项目,选择初始导入包的时候选择 Spring Web 和 Spring for RabbitMQ
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
- 创建 RabbitConfig 配置类
// 该注解表示当前类是一个配置对象
@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");
}
}
- 创建一个Controller类
@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
6.创建另外一个springboot项目,初始化导包的时候选择Spring Web 和 Spring for RabbitMQ
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
- 创建RabbitConfig配置类
@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 就说明成功了