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项目编写成功

__EOF__

本文作者一只小狐疑
本文链接https://www.cnblogs.com/Huyi-1208/p/16400646.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   一只小狐疑  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2021-06-22 random、Math.random、转换、三元运算、if else
点击右上角即可分享
微信分享提示