RabbitMQ在实际项目中的应用

这篇具有很好参考价值的文章主要介绍了RabbitMQ在实际项目中的应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RabbitMQ简介

以商品订单场景为例,

如果商品服务和订单服务是两个不同的微服务,在下单的过程中订单服务需要调用商品服务进行扣库存操作。按照传统的方式,下单过程要等到调用完毕之后才能返回下单成功,如果网络产生波动等原因使得商品服务扣库存延迟或者失败,会带来较差的用户体验,如果在高并发的场景下,这样的处理显然是不合适的,那怎么进行优化呢?这就需要消息队列登场了。

消息队列提供一个异步通信机制,消息的发送者不必一直等待到消息被成功处理才返回,而是立即返回。消息中间件负责处理网络通信,如果网络连接不可用,消息被暂存于队列当中,当网络畅通的时候在将消息转发给相应的应用程序或者服务,当然前提是这些服务订阅了该队列。如果在商品服务和订单服务之间使用消息中间件,既可以提高并发量,又降低服务之间的耦合度。

RabbitMQ就是这样一款消息队列。RabbitMQ是一个开源的消息代理的队列服务器,用来通过普通协议在完全不同的应用之间共享数据。

(2)典型应用场景:

异步处理。把消息放入消息中间件中,等到需要的时候再去处理。

流量削峰。例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。

日志处理

应用解耦

在docker中安装RabbitMQ

docker pull rabbitmq:management
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management

管理后台:http://IP:15672

RabbitMQ在实际项目中的应用

RabbitMQ在实际项目中的应用

 第一步建立rabbit-util模块封装

由于后续可能多个模块都会使用mq,所以我们把它封装成一个模块,需要的地方直接引用即可

第二步修改pom.xml

<dependencies>
    <!--rabbitmq消息队列-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
    </dependency>
</dependencies>

第三步封装service方法

@Service
public class RabbitService {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    /**
     *  发送消息
     * @param exchange 交换机
     * @param routingKey 路由键
     * @param message 消息
     */
    public boolean sendMessage(String exchange, String routingKey, Object message) {
        rabbitTemplate.convertAndSend(exchange, routingKey, message);
        return true;
    }
}

第四步配置mq消息转换器

@Configuration
public class MQConfig {
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

 在短信模块如果使用mq(假如是下单成功短信通知)

 在短信模块引入依赖

<dependency>
    <groupId>com.atguigu</groupId>
    <artifactId>rabbit_util</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

 在短信模块添加配置

#rabbitmq地址
spring.rabbitmq.host=192.168.44.165
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

添加常量配置

在rabbit-util模块com.atguigu.yygh.common.constant.MqConst类添加

public class MqConst {
    /**
     * 预约下单
     */
    public static final String EXCHANGE_DIRECT_ORDER 
= "exchange.direct.order";
    public static final String ROUTING_ORDER = "order";
    //队列
    public static final String QUEUE_ORDER  = "queue.order";
    /**
     * 短信
     */
    public static final String EXCHANGE_DIRECT_MSM = "exchange.direct.msm";
    public static final String ROUTING_MSM_ITEM = "msm.item";
    //队列
    public static final String QUEUE_MSM_ITEM  = "queue.msm.item";
}

在model模块封装短信实体

@Data
@ApiModel(description = "短信实体")
public class MsmVo {
    @ApiModelProperty(value = "phone")
    private String phone;
    @ApiModelProperty(value = "短信模板code")
    private String templateCode;
    @ApiModelProperty(value = "短信模板参数")
    private Map<String,Object> param;
}

在MsmService类添加接口

boolean send(MsmVo msmVo);

在MsmServiceImpl类添加接口实现

@Override
public boolean send(MsmVo msmVo) {
    if(!StringUtils.isEmpty(msmVo.getPhone())) {
        String code = (String)msmVo.getParam().get("code");
        return this.send(msmVo.getPhone(),code);
    }
    return false;
}

封装mq短信消息监听器

@Component
public class SmsReceiver {
    @Autowired
    private MsmService msmService;
    //接收mq的消息是否调用send方法
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = MqConst.QUEUE_MSM_ITEM, durable = "true"),
            exchange = @Exchange(value = MqConst.EXCHANGE_DIRECT_MSM),
            key = {MqConst.ROUTING_MSM_ITEM}
    ))
    //只要Rabbitservice(参数)只要参数有MqConst.QUEUE_MSM_ITEM,MqConst.EXCHANGE_DIRECT_MSM,MqConst.ROUTING_MSM_ITEM这个方法就会执行
    public void send(MsmVo msmVo, Message message, Channel channel) {
        msmService.send(msmVo);
    }
}

封装mq更新订单数量监听器schedule模块

在订单模块引入依赖

<!--rabbitmq消息队列-->
<dependency>
    <groupId>com.atguigu.yygh</groupId>
    <artifactId>rabbit-util</artifactId>
    <version>1.0</version>
</dependency>
#rabbitmq地址
spring.rabbitmq.host=192.168.44.165
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

在rabbit-util模块com.atguigu.yygh.common.constant.MqConst类添加

/**
 * 预约下单
 */
public static final String EXCHANGE_DIRECT_ORDER = "exchange.direct.order";
public static final String ROUTING_ORDER = "order";
//队列
public static final String QUEUE_ORDER  = "queue.order";

 定单实体

@Data
@ApiModel(description = "OrderMqVo")
public class OrderMqVo {
   @ApiModelProperty(value = "可预约数")
   private Integer reservedNumber;

   @ApiModelProperty(value = "剩余预约数")
   private Integer availableNumber;

   @ApiModelProperty(value = "排班id")
   private String scheduleId;

   @ApiModelProperty(value = "短信实体")
   private MsmVo msmVo;
}

封装mq监听器

@Component
public class HospitalReceiver {

    @Autowired
    private ScheduleService scheduleService;

    @Autowired
    private RabbitService rabbitService;
    //只要rabbitService.sendMessage(参数)参数含有 MqConst.QUEUE_ORDER,MqConst.EXCHANGE_DIRECT_ORDER,MqConst.ROUTING_ORDER,这个receiver()方法就会执行
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = MqConst.QUEUE_ORDER, durable = "true"),
            exchange = @Exchange(value = MqConst.EXCHANGE_DIRECT_ORDER),
            key = {MqConst.ROUTING_ORDER}
    ))
    public void receiver(OrderMqVo orderMqVo, Message message, Channel channel) throws IOException {
        //下单成功更新预约数
        Schedule schedule = scheduleService.getScheduleId(orderMqVo.getScheduleId());
        schedule.setReservedNumber(orderMqVo.getReservedNumber());
        schedule.setAvailableNumber(orderMqVo.getAvailableNumber());
        scheduleService.update(schedule);
        //发送短信
        MsmVo msmVo = orderMqVo.getMsmVo();
        if(null != msmVo) {
            //给mq发消息发送完后,监听到发送短信的消息调用发送消息的接口
            rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_MSM, MqConst.ROUTING_MSM_ITEM, msmVo);
        }
    }
}

说明:已统一引入,该对象放一个短信实体,预约下单成功后,我们发送一条消息,让mq来保证两个消息都发送成功

在order模块中引入依赖

<dependency>
    <groupId>com.atguigu</groupId>
    <artifactId>rabbit_util</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

在resources/application.properties添加

#rabbitmq地址
spring.rabbitmq.host=192.168.44.165
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

1,发送订单mq修改OrderServiceImpl类下单方法

//给mq发送消息,监听到后调用订单修改
 rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_ORDER,
 MqConst.ROUTING_ORDER, orderMqVo);

2,只要执行这个方法,schedule模块中的监听器 receiver()方法就会被调用,更新订单

更新完后执行这个

 //给mq发消息发送完后,监听到发送短信的消息调用发送消息的接口
rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_MSM,
 MqConst.ROUTING_MSM_ITEM, msmVo);

执行完上面的,sms模块中的短信监听器就会执行SmsReceiver类中的send就会被执行,发送短信文章来源地址https://www.toymoban.com/news/detail-442390.html

到了这里,关于RabbitMQ在实际项目中的应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring AOP:面向切面编程在实际项目中的应用

    🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页 ——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础

    2024年02月09日
    浏览(29)
  • mybatis 在当前项目中的实际应用及自定义分页的实现

    实现目标 实现目标,使用spring 提供的分页相关的类,避免代码中直接使用PageHelper 具体实现 创建自定义PageHelper,并使用spring-data-common提供的具体实现类操作分页 maven 中引入相关依赖 这样我们在项目中就不直接与pageHelper 打交道了,将代码控制在自定义的 PageHelper 中了。 具

    2024年02月07日
    浏览(47)
  • 计算机视觉的实际应用:计算机视觉在实际应用中的成功案例

    计算机视觉(Computer Vision)是一种利用计算机解析、理解并从图像中抽取信息的技术。它是一种跨学科的研究领域,涉及到计算机科学、数学、物理、生物学、心理学等多个领域的知识和技术。计算机视觉的应用范围广泛,包括图像处理、图像识别、机器人视觉、自动驾驶等

    2024年01月23日
    浏览(39)
  • 模糊综合评价在实际问题中的应用(案例)

    目录 一、概述 二、一级模糊综合评价模型 三、多级模糊综合评价模型         模糊综合评价问题 是要 把论域中的对象对应评语集中一个指定的评语 或者 将方案作为评语集并选择一个最优的方案 。(两个角度)         在模糊综合评价中,引入了三个集合:      

    2024年02月06日
    浏览(67)
  • AiGC在婚纱摄影中的实际应用

    AiGC是一种基于人工智能技术的全自动图像处理算法,可以在不需要人工干预的情况下,对婚纱摄影图像进行智能优化和处理。在婚纱摄影中,AiGC可以应用于以下几个方面: 图像色彩处理:使用AiGC可以自动调整图像的亮度、对比度、色彩饱和度等,使图像色彩更加鲜艳、清晰

    2024年02月10日
    浏览(30)
  • 工作量证明在验证码中的实际应用

    工作量证明(Proof-of-Work,以下简称“PoW”)在维基百科的介绍中指一般要求用户进行一些耗时适当的复杂运算,并且答案能被服务方快速验算,以此耗用的时间、设备与能源做为担保成本,以确保服务与资源是被真正的需求所使用。 在实际生活中可以例举为:学生进行考试

    2024年01月15日
    浏览(50)
  • 布隆过滤器及其在Java中的实际应用

    布隆过滤器一直是面试中的重点,本篇文章将深入探讨Java中的布隆过滤器的底层思想,包括它的工作原理、优缺点等。同时,我们将结合一个小实际案例,来给大家展示布隆过滤器在解决实际问题中的应用。 在数据处理领域,我们经常需要判断一个元素是否在一个集合中。

    2024年02月05日
    浏览(36)
  • Flutter系列文章-Flutter在实际业务中的应用

    1. 跨平台开发: 在移动应用开发中,面对不同的平台(iOS和Android),我们通常需要编写两套不同的代码。而Flutter通过一套代码可以构建适用于多个平台的应用,大大提高了开发效率,降低了维护成本。 2. 混合开发: 在一些已有的原生应用中,引入Flutter可以用于开发某些特

    2024年02月11日
    浏览(30)
  • mybatis-plus在实际开发中的应用

    最近的项目是使用mybatis-plus作为持久层框架,前面也记录过mybatis-plus的基本使用,此次记录一下本次项目中的一些使用要点 基本的导入依赖和代码自动生成器,可以去看以前的文章,本次不再赘述。 以项目中的一个实体类为例 实体类上mybatis-plus的注解有两个, @TableName(“

    2024年02月09日
    浏览(46)
  • 深度学习实战应用:分享一些深度学习在实际问题中的应用案例和经验

    目录 一、引言 二、案例一:计算机视觉——图像分类

    2024年02月02日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包