springboot对rabbitMQ的接口做了封装,要实现 request/reponse 模式的调用,只需要调用 rabbitTemplate.convertSendAndReceive 方法即可,队列和交换器的设置使用topic模式即可。
Object res = rabbitTemplate.convertSendAndReceive(exchangeName, routingKey, reqJson,message -> {
MessageProperties messageProperties = message.getMessageProperties();
messageProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT);// 持久化消息
// messageProperties.setContentType("application/json");
String correlationId = UUID.randomUUID().toString().replaceAll("-", "");
messageProperties.setCorrelationId(correlationId);
return message;
}, null);
下面通过spring aop、反射、rabbitmq实现一个类似dubbo的rpc调用系统:
-
rabbitmq 使用topic工作模式
-
springboot 创建client和server两个应用
-
通过注解
@Service声明远程调用 -
客户端通过
RPCAspect切面拦截本地服务调用,然后通过rabbitMQ发起远程调用,调用服务端的service并返回结果
这样就实现了一个简单的rpc过程,这里因为使用反射,并且序列化直接使用json,所以性能上可能弱鸡,后面有时间再跟dubbo的方式做个压测对比看看。
1 项目结构
项目结构图如下:

2 pom依赖
这里把项目用到的依赖全部直接贴出来
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>compile</scope>
</dependency>
3 common模块
主要定义了接口和接口实现,以及自定义注解,很简单,直接贴代码
1 IService接口
package com.fmi110.rabbitmq.service;
public interface IService {
public Object sayHello(String reqObjStr);
}
2 IService实现类
这里需要注意 @Service 是自定义的注解类 com.fmi110.rpc.Service !!!
package com.fmi110.rabbitmq.service;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.UUID;
import com.fmi110.rpc.Service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author fmi110
* @description 远程服务实现类
* @date 2021/7/3 20:51
*/
@Slf4j
@Component
@Service // 这个是自定义的注解类 com.fmi110.rpc.Service!!!
public class ServiceImpl implements IService {
@Override
public Object sayHello(String reqObjStr) {
// 模拟耗时 50 ms
t

本文介绍了如何使用SpringBoot封装RabbitMQ接口,实现request/response模式的RPC调用。通过自定义注解和AOP,结合topic模式,构建了一个类似Dubbo的RPC系统,适用于内外网通信受限的场景。
最低0.47元/天 解锁文章
2154

被折叠的 条评论
为什么被折叠?



