什么是 RabbitMQ
简介(长处)
- 基于
ErLang
语言开发有高可用高并发的长处,适宜集群。 - 开源、稳固、易用、跨平台、反对多种语言、文档齐全。
- 有音讯确认机制和长久化机制,可靠性高。
概念
生产者和消费者
Producer
:音讯的生产者Consumer
:音讯的消费者
Queue
- 音讯队列提供了
FIFO
的解决机制,具备缓存音讯的能力。在RabbitMQ
中,队列音讯能够设置为长久化,长期或者主动删除。 - 如果是长久化的队列,
Queue
中的音讯会在Server
本地硬盘存储一份,避免零碎Crash
数据失落。 - 如果是长期的队列,
Queue
中的数据在零碎重启之后就会失落。 - 如实是主动删除的队列,当不存在用户连贯到
Server
,队列中的数据会被主动删除。
ExChange
ExChange
相似于数据通信网络中的交换机,提供音讯路由策略。
在 RabbitMQ
中,生产者不是将音讯间接发送给 Queue
,而是先发送给 ExChange
,ExChange
依据生产者传递的 key
依照特定的路由算法将音讯给指定的 Queue
。一个 ExChange
能够绑定多个 Queue
。和 Queue
一样,ExChange
也能够设置为长久化、长期或者主动删除。
Binding
所谓绑定就是将一个特定的 ExChange
和一个特定的 Queue
绑定起来。ExChange
和 Queue
的绑定能够是多对多的关系。
Virtual Host
在 RabbitMQ Server
上能够创立多个虚构的 Message Broker
(又叫做 Virtual Hosts
)。每一个 vhost
实质上是一个迷你的 RabbitMQ Server
,别离治理各自的 ExChange
和 binding
。生产者和消费者连贯 RabbitMQ Server
须要指定一个 Virtual Host
。
应用过程
- 客户端连贯到音讯队列服务器,关上一个
Channel
。 - 客户端申明一个
ExChange
,并设置相干属性。 - 客户端申明一个
Queue
,并设置相干属性。 - 客户端应用
Routing Key
,在ExChange
和Queue
之间建设好绑定关系。 - 客户端投递音讯到
ExChange
。 ExChange
接管到音讯后,就依据音讯的key
和曾经设置的bingding
,进行音讯路由,将音讯投递到一个或多个队列里。
部署 RabbitMQ
应用 Docker Compose 部署
创立 docker-compose.yml
version: ‘3.1’
services:
rabbitmq:
restart: always
image: rabbitmq:management
container_name: rabbitmq
ports:
- 5672:5672
- 15672:15672
environment:
TZ: Asia/Shanghai
RABBITMQ_DEFAULT_USER: rabbit
RABBITMQ_DEFAULT_PASS: 123456
volumes:
- ./data:/var/lib/rabbitmq
RabbitMQ WebUI 界面
- 拜访地址:http://{ip}:15672
- 首页
Global counts
页.png)
- 交换机页
.png)
-
队列页
.png)
Name
:音讯队列的名称,这里是通过程序创立的Features
:音讯队列的类型,durable:true 为会长久化音讯Ready
:筹备好的音讯Unacked
:未确认的音讯-
Total
:全副音讯如果都为 0 则阐明全副音讯解决实现
应用 RabbitMQ
创立生产者
创立一个名为 spring-boot-amqp-provider
的生产者我的项目。
相干配置
- 创立 application.yml 文件
spring:
application:
name: spring-boot-amqp
rabbitmq:
host: 192.168.75.133
port: 5672
username: rabbit
password: 123456 - 创立队列
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 队列配置
*/
@Configuration
public class RabbitMQConfiguration {@Bean
public Queue queue() {
return new Queue(“helloRabbitMQ”);
}
} - 创立音讯提供者
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 音讯提供者
*/
@Component
public class RabbitMQProvider {@Autowired
private AmqpTemplate amqpTemplate;
public void send() {
String context = “hello” + new Date();
System.out.println(“Provider: ” + context);
amqpTemplate.convertAndSend(“helloRabbitMQ”, context);
}
}
发送音讯
创立测试用例
import com.lusifer.spring.boot.amqp.Application;
import com.lusifer.spring.boot.amqp.provider.HelloRabbitProvider;
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.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class AmqpTest {
@Autowired
private HelloRabbitProvider helloRabbitProvider;
@Test
public void testSender() {
for (int i = 0; i < 10; i++) {
RabbitMQProvider.send();
}
}
}
创立消费者
创立一个名为 spring-boot-amqp-consumer
的消费者我的项目。
相干配置
创立 application.yml
文件
spring:
application:
name: spring-boot-amqp-consumer
rabbitmq:
host: 192.168.75.133
port: 5672
username: rabbit
password: 123456
接管音讯
创立音讯的生产监听组件
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@RabbitListener(queues = “helloRabbitMQ”)
public class HelloRabbitConsumer {
@RabbitHandler
public void process(String message) {
System.out.println(“Consumer: ” + message);
}
}
- 文章作者:彭超
- 本文首发于集体博客:https://antoniopeng.com/2020/07/18/mq/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%20RabbitMQ/
- 版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自 彭超 | Blog!