Spring Cloud Alibaba入门实践(三十三)-引入RocketMQ

为什么要引入RocketMQ?

使用消息中间件,最主要的几大作用是异步,削峰填谷,解耦。项目中有个业务逻辑是这样的,用户下单完成后,系统需要发下单成功的短信给用户,而下单成功的操作和发短信的操作并不是强耦合的,或者说作为开发,我要求发短信的耗时不能延长下单的响应时间,影响用户体验,所以我要把下单操作和发短信操作解耦,如果用的是还是原来的fegin框架实现远程通信,是做不到业务解耦的,所以这里需要引入消息中间件,完成业务异步和解耦的设计。而消息中间件也是多种多样,有Kafka,RabbitMQ,RocketMQ等,这里选择RocketMQ,是因为它是用java语言开发的,这样碰到问题,排查起来会快些,甚至厉害的工程师还能够做到二次开发,不过我个人选择学习RocketMQ的原因是,首先做不到每个中间件都学,不实际,但是势必要会一样,这是高级工程师的必备技能之一,那么选择和Spring Cloud Alibaba生态更加契合的RocketMQ,无疑会是更好的一个切入点。

在mall-order和mall-order两个项目的pom.xml文件中都引入如下依赖:

<!--rocketmq-->
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.0.2</version>
</dependency>
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.7.1</version>
</dependency>

上述依赖中,rocketmq-client的版本最好和下载的RocketMQ版本一致,避免引发一些未知问题。

修改mall-order的application.yml文件,加上RocketMQ的相关配置,如下:
在这里插入图片描述
修改mall-user的application.yml文件,加上RocketMQ的相关配置,如下:
在这里插入图片描述
修改OrderController文件,完善mall-order的下单逻辑,如下:

package com.example.mallorder.controller;

import com.example.mallcommon.domain.Order;
import com.example.mallcommon.domain.Product;
import com.example.mallorder.fegin.ProductService;
import com.example.mallorder.service.OrderService;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class OrderController {
    @Autowired
    private OrderService orderService;
    @Autowired
    private ProductService productService;
    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    //下单
    @RequestMapping("/order/prod/{pid}")
    public Order createOrder(@PathVariable("pid") Integer pid) {

        //调用商品微服务,查询商品信息
        Product product = productService.findById(pid);
        if (product.getPid() == -1) {
            Order order = new Order();
            order.setPname("下单失败");
            return order;
        }
        //下单(创建订单)
        Order order = new Order();
        order.setUid(1);
        order.setUsername("测试用户");
        order.setPid(pid);
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());
        order.setNumber(1);
        orderService.createOrder(order);
        //下单成功之后,将消息放到mq中
        rocketMQTemplate.convertAndSend("order-topic", order);
        return order;
    }
}

作为消息消费者,在mall-user项目中新增OrderSmsService类,在该类中实现消费者的处理逻辑,如下:

package com.example.malluser.service.impl;

import com.alibaba.fastjson.JSON;
import com.example.mallcommon.domain.Order;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;

@Service
@RocketMQMessageListener(consumerGroup = "mall-order", topic = "order-topic")
public class OrderSmsService implements RocketMQListener<Order> {

    @Override
    public void onMessage(Order order) {
        //下单后,发送短信给用户
        System.out.println("下单成功,发送短信给用户" + JSON.toJSONString(order));
    }
}

@RocketMQMessageListener注解中的consumerGroup对应的就是mall-order的application.yml文件中新增的producer.group的属性值,topic就是发送消息的代码中指定的主题order-topic,这样消费者mall-user才能知道去哪里拿消息消费。

启动RocketMQ的Name Server和Broker,启动各个项目,通过网关发起下单操作,如下:
在这里插入图片描述
然后可以在mall-user服务中发现消息被消费的输出,如下:
在这里插入图片描述
以上简单的把RocketMQ引入了项目中,实现了下单操作和发消息操作的解耦,接下来就是引入短信服务了。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值