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引入了项目中,实现了下单操作和发消息操作的解耦,接下来就是引入短信服务了。
本文地址:https://blog.csdn.net/weixin_38106322/article/details/109584731
上一篇: 【Lintcode】962. Condition String
下一篇: java封装与多态
推荐阅读
-
Spring Cloud Alibaba入门实践(四)-注册中心nacos
-
Nacos快速入门(三):Spring Cloud Alibaba Nacos实现服务注册与发现
-
Spring Cloud Alibaba Nacos 入门
-
Spring Cloud Alibaba入门实践-引入RocketMQ
-
Spring Cloud Alibaba#23.微服务为什么要引入网关
-
Spring Cloud Alibaba - 消息队列(一)(RocketMQ)(介绍(这篇不重要,下一篇很重要,主要是下一篇坑太多了))
-
Spring Cloud Alibaba入门实践(三十七)-分布式事务组件Seata
-
Spring Cloud Alibaba(五)RocketMQ 异步通信实现
-
Spring Cloud Alibaba微服务从入门到进阶
-
springcloud(二)——spring-cloud-alibaba集成sentinel入门