SpringBoot+RabbitMQ

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面前性能有点差哦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值