1.什么是RabbitMQ
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
2.RabbitMQ的应用场景
1.订单业务:在订外卖中,用户下单后30分钟后未付款则取消订单。
2.短信通知:用户下单并付款后,1分钟后发短信给用户。
3.RabbitMQ的主要组成部分
a. Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输,
b. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
c. Queue:消息的载体,每个消息都会被投到一个或多个队列。
d. Binding:绑定它的作用就是把exchange和queue按照路由规则绑定起来.
e. Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
f. vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限离。
g. Producer:消息生产者,就是投递消息的程序.
h. Consumer:消息消费者,就是接受消息的程序.
i. Channel:消息通道,在客户端的每个连接里,可建立多个channel.
4.RabbitMQ+springboot怎样整合
一,向pom.xml加入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
二:向application.yml加入配置
spring:
rabbitmq:
host: localhost #主机ip
username: guest # 用户名
password: guest # 密码
port: 5672 #端口号
三,在config包下编写
@Configuration
@Slf4j
public class DelayRabbitConfig {
/**
* 延迟队列 TTL 名称
*/
private static final String ORDER_DELAY_QUEUE = “user.order.delay.queue”;
public static final String ORDER_DELAY_EXCHANGE = “user.order.delay.exchange”;
public static final String ORDER_DELAY_ROUTING_KEY = “order_delay”;
public static final String ORDER_QUEUE_NAME = “user.order.queue”;
public static final String ORDER_EXCHANGE_NAME = “user.order.exchange”;
public static final String ORDER_ROUTING_KEY = “order”;
@Bean
public Queue delayOrderQueue() {
Map<String, Object> params = new HashMap<>();
// x-dead-letter-exchange 声明了队列里的过期的消息转发到的DLX名称,
params.put("x-dead-letter-exchange", ORDER_EXCHANGE_NAME);
// x-dead-letter-routing-key 声明了这些过期的消息在转发时携带的 routing-key 名称。
params.put("x-dead-letter-routing-key", ORDER_ROUTING_KEY);
return new Queue(ORDER_DELAY_QUEUE, true, false, false, params);
}
@Bean
public DirectExchange orderDelayExchange() {
return new DirectExchange(ORDER_DELAY_EXCHANGE);
}
@Bean
public Binding dlxBinding() {
return BindingBuilder.bind(delayOrderQueue()).to(orderDelayExchange()).with(ORDER_DELAY_ROUTING_KEY);
}
@Bean
public Queue orderQueue() {
return new Queue(ORDER_QUEUE_NAME, true);
}
@Bean
public TopicExchange orderTopicExchange() {
return new TopicExchange(ORDER_EXCHANGE_NAME);
}
// routingKey 和 交换机的绑定
@Bean
public Binding orderBinding() {
return BindingBuilder.bind(orderQueue()).to(orderTopicExchange()).with(ORDER_ROUTING_KEY);
2.发送消息(Producer:消息生产者)
@Autowired
private AmqpTemplate amqpTemplate;
public void sendDelay(Order order) {
log.info("订单生成时间" + new Date().toString() +"1分钟后检查订单是否已经支付" );
} this.amqpTemplate.convertAndSend(DelayRabbitConfig.ORDER_DELAY_EXCHANGE, DelayRabbitConfig.ORDER_DELAY_ROUTING_KEY, order, message -> {
//声明 Queue 的延迟时间 (1分钟)
message.getMessageProperties().setExpiration(1 * 1000 * 60 + "");
return message;)}
3.接收消息(Consumer:消息消费者)
@RabbitListener(queues = {DelayRabbitConfig.ORDER_QUEUE_NAME})
public void orderDelayQueue(Order order, Message message, Channel channel) {
log.info("orderDelayQueue 监听的消息 “+new Date())
if(order.getOrderStatus() == 0) {
order.setOrderStatus(2);
log.info("该订单未支付,取消订单");
} else if(order.getOrderStatus() == 1) {
log.info("该订单已完成支付");
} else if(order.getOrderStatus() == 2) {
log.info("取消订单");
}
4.同过在控制层调用senDelay()并提供路由器在浏览器访问便可
四,RabbitMQ的好处
1.有商业化的运营,不会轻易死掉;
2.遵循AMQP协议,不会被绑架;
3.强大的社区支持,为技术进步提供动力;
4.大量成功的应用案例,例如阿里、网易等互联网巨头都有使用
注:在kafka和zero面前性能有点差哦