RocketMQ在SpringCloud/SpringBoot中的使用
一、微服务之间的调用方式
调用方式有两种:
RPC方式:紧耦合,常用的有Feign、ribbon。
事务驱动方式(消息发送方式包含事件通知、事件溯源):松耦合,常用的有ActiveMQ,RabbitMQ,RocketMQ/Kafka。
二、项目依赖
<!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-client --> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.9.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-spring-boot-starter --> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency>
三、application.yml配置
消息生产方-发消息:添加如下红色信息
server: port: 7000 #nacos注册中心相关配置 spring: application: name: @project.artifactId@ cloud: nacos: discovery: server-addr: 192.168.30.160:8849 #rocketmq相关配置 rocketmq: name-server: 192.168.30.160:9876 producer: group: myProductGroup-02
消费方-接收消息:添加如下红色信息
server: port: 9080 #nacos注册中心相关配置 spring: application: name: @project.artifactId@ cloud: nacos: discovery: server-addr: 192.168.30.160:8849 #rocketmq相关配置 rocketmq: name-server: 192.168.30.160:9876
四,消息生产方发送消息
请求的发送,分为同步/异步/单向oneway
|
发送方式 |
发送TPS |
发送结果反馈 |
可靠性 |
|
同步发送 |
快 |
有 |
不丢失 |
|
异步发送 |
快 |
有 |
不丢失 |
|
单向发送 |
最快 |
无 |
可能丢失 |
@RequestMapping("/send")
public String fun(){
rocketMQTemplate.convertAndSend("MyTopic","要发送的消息");
return "发送成功";
}
@RequestMapping("/send1")
public String fun1(){
Object myTopic = rocketMQTemplate.sendAndReceive("MyTopic2", "123abc可以接受应答", String.class);
return "发送成功:"+myTopic;
}
@RequestMapping("/send2")
public String fun2(){
SendResult sendResult = rocketMQTemplate.syncSend("MyTopic", "123abc梵蒂冈大");
SendStatus sendStatus = sendResult.getSendStatus();
return "发送成功:"+sendStatus;
}
@RequestMapping("/send3")
public String fun3(){
rocketMQTemplate.sendOneWay("MyTopic", "123abc冬瓜豆腐");
return "发送成功";
}
@RequestMapping("/send4")
public String fun4(){
rocketMQTemplate.asyncSend("MyTopic", "123abc看见了是个分公司",new SendCallback(){
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("发送成功了");
}
@Override
public void onException(Throwable throwable) {
System.out.println("发送失败了");
}
});
return "发送成功";
}
五,接收消息
@Service @RocketMQMessageListener(consumerGroup = "myProductGroup-03",topic = "MyTopic") public class ConsumerLister2 implements RocketMQListener { @Value("${server.port}") private int port; @Override public void onMessage(Object message) { System.out.println(port+":"+message); } }
六,测试可以看到控制台已经接收到了消息

七、前面消息发出后我们所看到的只是发送结果,即有没有发送成功,当我们查询数据需要返回查找的结果的时候怎么办呢?
发送端发送消息接收结果:
@RequestMapping("/send1")
public String fun1(){
Object myTopic = rocketMQTemplate.sendAndReceive("MyTopic2", "123abc可以接受应答", String.class);
return "发送成功:"+myTopic;
}
接收端接收消息并返回结果给发送端:
@Service @RocketMQMessageListener(consumerGroup = "myProductGroup-01",topic = "MyTopic2") public class ConsumerListener implements RocketMQReplyListener { @Value("${server.port}") private int port; @Override public Object onMessage(Object s) { //数据处理、数据库等操作 System.out.println(s); //消息应答 return port+":"+"辣椒石头酸菜1234567777!"; } }
测试接口可以看发送端接收到了消息消费端返回的消息:


浙公网安备 33010602011771号