SpringBoot集成RabbitMQ-Direct模式

  • 前言

    需要在本地安装Rabbit的服务器

    安装教程

    使用场景

    刚开始进入公司的时候,我们公司的架构还比较单一,就采用一种单体结构,而单体结构的话它是把所以的业务都堆积在一个项目里面,但是随着公司业务不断发展和推进,我们公司的负责人就开始把项目进行分裂,变成了一个分布式的架构,就把系统进行了一个拆分,在拆分的过程中我们就要考虑到一个问题,比如在拆分过程中,我们把用户模块和下单模块做了一个拆分,但是它们之间的数据要进行一个交互,因为在下单的时候需要获取到用户的一些资料,所以我们公司采用了一个消息队列,在选择的时候就一直在思考用什么消息队列,这个时候就选择了RebbitMQ,而我自己使用RebbitMQ的一个核心的感受,就是它是一个异步的多线程,是一个分发的多线程机制,然后它可以让我们网站的一个效率做成倍的提升,因为它是异步的所以它可以让我们处理数据的能力更加的高效和稳健

    1.通过Spring官网快速创建一个RabbitMQ的生产者项目

    2.导入项目后在application.yml文件中配置

    # 服务端口
    server:
      port: 8081
      
    #配置rabbitmq服务 测试不用写,默认本机
    spring:
      rabbitmq:
          username: guest #默认账号
          password: guest #默认密码
          virtual-host: /
          host: localhost
          port: 5672
          #消息确认配置项
          #确认消息已发送到交换机: Exchange
          publisher-confirm-type: correlated
          #确认消息已发送到队列: Queue
          publisher-returns: true
    
    

    3.创建一个RabbitMqConfig配置类

package com.huyi.rabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DirectRabbitMqConfig {
    //1:声明注册direct模式的交换机,参数1:对应的service的directName,参数2:持久化(true,false),参数3:自动删除(false/true)
    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange("direct_order_exchang", true, false);
    }
    //2:声明队列,参数1:队列名字,参数2:持久化队列true
    //短信队列
    @Bean
    public Queue smsQueue() {
        System.err.println("执行了smsdirect");
        return new Queue("sms.direct.queue",true);
    }
    @Bean
    public Queue duanxinQueue() {
        System.err.println("执行了duanxindirect");
        return new Queue("duanxin.direct.queue",true);
    }
    //邮箱队列
    @Bean
    public Queue emailQueue() {
        System.err.println("执行了emaildirect");
        return new Queue("email.direct.queue",true);
    }
    //3:完成绑定关系(队列和交换机完成绑定关系)
    @Bean
    public Binding smsBinding() {
        //把smsQueue放到directExchange交换机上面,with是路由key
        return BindingBuilder.bind(smsQueue()).to(directExchange()).with("sms");
    }
    @Bean
    public Binding duanxinBinding() {
        //把duanxinQueue放到directExchange交换机上面,with是路由key
        return BindingBuilder.bind(duanxinQueue()).to(directExchange()).with("duanxin");
    }
    @Bean
    public Binding emailBinding() {
        //把emailQueue放到directExchange交换机上面,with是路由key
        return BindingBuilder.bind(emailQueue()).to(directExchange()).with("email");
    }


}

4.创建OrderService,OrderServiceImpl

  • OrderService
package com.exam.RebbitMQ.service;

public interface OrderService {
	 void makeOrderDirect(String userid, String productid, int num);
}
  • OrderServiceImpl
package com.huyi.rabbitmq.service.Impl;

import com.huyi.rabbitmq.service.OrderService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.UUID;

@Service
public class OrderServiceImpl implements OrderService {

  @Autowired
  private RabbitTemplate rabbitTemplate;

  /**
   * 模拟用户下单
   **/

  public void makeOrderDirect(String userid,String productid,int num) {
      //1.根据商品ID查询商品是否充足
      //2.保存订单
      String  orderId = UUID.randomUUID().toString();
      System.err.println("订单生成成功"+orderId);
      //3.通过MQ来完成消息的分发
      //参数1:交换机 参数二:路由key/queue队列名称  参数三:消息内容
      String  exchangName ="direct_order_exchang";
      //这里的routingKey是绑定的是congif文件中的with
      rabbitTemplate.convertAndSend(exchangName,"email",orderId);
      //这里的routingKey是绑定的是congif文件中的with
      rabbitTemplate.convertAndSend(exchangName,"duanxin",orderId);
      //这里的routingKey是绑定的是congif文件中的with
      rabbitTemplate.convertAndSend(exchangName,"sms",orderId);
  }
}

5.在项目的test中发送请求

package com.huyi.rabbitmq;

import com.huyi.rabbitmq.service.OrderService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class RabbitMqApplicationTests {

	@Autowired
	private OrderService orderService;

	@Test
	void contextLoads() {
		orderService.makeOrderDirect("1","1", 18);
	}

}

6.访问网址: http://localhost:15672/#/queues

  • 账号和密码都是:guest

  • 点击Exchanges查看是否创建成功

  • 点击Queues查看是否创建成功

6.再创建一个消费者项目

7.在消费者项目中把生产者项目中的yml配置复制过来,改一下端口

# 服务端口
server:
  port: 8082

#配置rabbitmq服务 测试不用写,默认本机
spring:
  rabbitmq:
    username: guest #默认账号
    password: guest #默认密码
    virtual-host: /
    host: localhost
    port: 5672
    #消息确认配置项
    #确认消息已发送到交换机: Exchange
    publisher-confirm-type: correlated
    #确认消息已发送到队列: Queue
    publisher-returns: true

8. 创建对应的service文件

  • SmsConsumerService、SmsConsumerServiceImpl
package com.huyi.rabbitmq_consumber.service;

public interface SmsConsumerDirectService {
  void reviceMessage(String message);
}
package com.huyi.rabbitmq_consumber.service.Impl;

import com.huyi.rabbitmq_consumber.service.SmsConsumerDirectService;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = {"sms.direct.queue"})
public class SmsConsumerDirectServiceImpl implements SmsConsumerDirectService{

  @RabbitHandler
  public void reviceMessage(String message) {
      System.err.println("sms_direct--接收到了订单信息");
  }
}

  • EmailConsumerService、EmailConsumerServiceImpl
package com.huyi.rabbitmq_consumber.service;

public interface EmailConsumerDirectService {
  void reviceMessage(String message);
}

package com.huyi.rabbitmq_consumber.service.Impl;

import com.huyi.rabbitmq_consumber.service.EmailConsumerDirectService;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = {"email.direct.queue"})
public class EmailConsumerDirectServiceImpl implements EmailConsumerDirectService {
  @RabbitHandler
  public void reviceMessage(String message) {
      System.err.println("Email_direct--接收到了订单信息"+message);
  }
}

  • DuanxinConsumerService、DuanxinConsumerServiceImpl
package com.huyi.rabbitmq_consumber.service;

public interface DuanxinConsumerDirectService {
  void reviceMessage(String message);
}

package com.huyi.rabbitmq_consumber.service.Impl;


import com.huyi.rabbitmq_consumber.service.DuanxinConsumerDirectService;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = {"duanxin.direct.queue"})
public class DuanxinConsumerDirectServiceImpl implements DuanxinConsumerDirectService{
  @RabbitHandler
  public void reviceMessage(String message) {
      System.err.println("Duanxin_direct--接收到了订单信息"+message);
  }

}

9.启动消费者项目

  • SpringBoot集成RabbitMQ-Direct项目编写成功
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小狐狸崽子OvO

你的鼓励将是我创造最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值