欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Cloud Alibaba入门实践-引入RocketMQ

程序员文章站 2022-04-16 09:16:58
为什么要引入RocketMQ?使用消息中间件,最主要的几大作用是异步,削峰填谷,解耦。项目中有个业务逻辑是这样的,用户下单完成后,系统需要发下单成功的短信给用户,而下单成功的操作和发短信的操作并不是强耦合的,或者说作为开发,我要求发短信的耗时不能延长下单的响应时间,影响用户体验,所以我要把下单操作和发短信操作解耦,如果用的是还是原来的fegin框架实现远程通信,是做不到业务解耦的,所以这里需要引入消息中间件,完成业务异步和解耦的设计。而消息中间件也是多种多样,有Kafka,RabbitMQ,Rocke....

为什么要引入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的相关配置,如下:
Spring Cloud Alibaba入门实践-引入RocketMQ
修改mall-user的application.yml文件,加上RocketMQ的相关配置,如下:
Spring Cloud Alibaba入门实践-引入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,启动各个项目,通过网关发起下单操作,如下:
Spring Cloud Alibaba入门实践-引入RocketMQ
然后可以在mall-user服务中发现消息被消费的输出,如下:
Spring Cloud Alibaba入门实践-引入RocketMQ
以上简单的把RocketMQ引入了项目中,实现了下单操作和发消息操作的解耦,接下来就是引入短信服务了。

本文地址:https://blog.csdn.net/weixin_38106322/article/details/109584731