RuoYi-Cloud 新建微服务并实现服务间调用(OpenFeign 实战)

1. 新建微服务模块 test1

在 ruoyi-modules 目录下新建一个名为 test1 的 Maven 模块,参考现有模块(如 ruoyi-system)的目录结构和配置方式,完成基础搭建。

新建模块后,需要在 ruoyi-modules/pom.xml 中注册该子模块,并在 test1 的 pom.xml 中引入所需依赖,包括 ruoyi-common-security、ruoyi-common-log、ruoyi-common-swagger 等公共模块,以及 OpenFeign 相关依赖。

同时需要创建 test1 模块的启动类、配置文件(bootstrap.yml),并在 Nacos 中注册服务,确保服务能够正常启动并注册到注册中心。

2. OpenFeign 接口调用

2.1 修改 HeaderInterceptor 传递 Token

在 HeaderInterceptor 的 preHandler() 方法中增加 Token 传递逻辑,确保 Token 在服务调用期间不断传递:

java 复制代码
// feign接口测试,增加token。可以让token在服务调用期间不断传
SecurityContextHolder.setToken(ServletUtils.getHeader(request, SecurityConstants.TOKEN));

其中 SecurityContextHolder 中的相关方法如下:

java 复制代码
public static void setToken(String token) {
    set(SecurityConstants.TOKEN, token);
}
public static String getToken() {
return get(SecurityConstants.TOKEN);
}

对应的常量定义:

java 复制代码
/**
 * TOKEN
 */
public static final String TOKEN = "Authorization";

2.2 新增 API 接口

在 RemoteUserService 中新增接口方法:

java 复制代码
@GetMapping("/user/list")
public TableDataInfo getUserList(
    @RequestHeader(SecurityConstants.DETAILS_USER_ID) Long userId,
    @RequestHeader(SecurityConstants.DETAILS_USERNAME) String userName,
    @RequestHeader(SecurityConstants.USER_KEY) String userKey,
    @RequestHeader(SecurityConstants.TOKEN) String token
);

在 RemoteUserFallbackFactory 中新增对应的降级实现:

java 复制代码
@Override
public TableDataInfo getUserList(Long userId, String userName, String userKey, String token) {
    TableDataInfo tableDataInfo = new TableDataInfo();
    tableDataInfo.setMsg("获取用户列表失败:" + throwable.getMessage());
    return tableDataInfo;
}

注意:参数中的 TOKEN 用于鉴权中获取用户逻辑,其他三个参数仅用于演示。

2.3 test1 下新增测试 Controller

在 test1 模块中新增测试 Controller:

java 复制代码
@RestController
@RequestMapping("/test")
public class SysTestController extends BaseController {
@Autowired
private RemoteUserService remoteUserService;
/**
获取当前用户信息
*/
@GetMapping("/getUserList")
public void info() {
TableDataInfo userList = remoteUserService
.getUserList(SecurityContextHolder.getUserId(),
SecurityContextHolder.getUserName(),
SecurityContextHolder.getUserKey(),
SecurityContextHolder.getToken());
System.out.println(JSON.toJSONString(userList));
}
}

3. 设置网关路由

进入 Nacos 中的 ruoyi-gateway-dev.yml 文件,新增如下路由配置:

yaml 复制代码
# test1模块
- id: ruoyi-test1
  uri: lb://ruoyi-test1
  predicates:
    - Path=/test/**
  filters:
    - StripPrefix=1

4. 测试验证

使用 Postman 新建 GET 请求:

复制代码
localhost:8080/test/test/getUserList

报文头设置:

复制代码
authorization=Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6Ijk3ZDczNjZlLTQ5MDgtNGNjZS1hZGZiLWI0YjI5N2RlZWQ3MiIsInVzZXJuYW1lIjoiYWRtaW4ifQ.GSfaRh77PR0wA0RbmGtqycRqRNr8IoX_JCkgqmpE-qwb3DrO2naKMK13Cyp8KoY7Cg-xvUYAH9AakgC7j0l3tw

其中 Token 值取自 admin 登录后的 Token。请求成功即表示服务间调用链路已打通。

相关推荐
学长毕设1 分钟前
基于SpringBoot的野生动物公益保护平台设计与实现-附源码
java·spring boot·后端
SL_staff34 分钟前
离散制造排程破局:JVS-APS 四步闭环落地实践(开发者视角)
java·产品·全栈
这个昵称不容易44 分钟前
SpringBoot 美容院管理系统:232个Java文件315个接口,5套角色从预约到发货一整条链路
java·springboot·毕设
装不满的克莱因瓶2 小时前
【SpringAI Alibaba】ReactAgent记忆管理MessageTrimmingHook与MessageDeletionHook
java·人工智能·ai·ai编程·springai·springaialibaba
文丑颜不良啊2 小时前
LeetCode2241~2260题目解析
java·leetcode
文丑颜不良啊2 小时前
LeetCode2321~2340题目解析
java·leetcode
驭渊的小故事2 小时前
Spring AOP 核心概念与通知类型详解
java·后端·spring
vipxieliang2 小时前
ValidX vs 手写验证代码:开发效率对比实测
java·spring boot·后端
vipxieliang3 小时前
虚拟线程与 GraalVM:Spring Boot 3.x 云原生性能跃迁
java·spring boot·后端
Rain的Java大神之路3 小时前
面试官最烦的答案:“我用 Redis + Token”!接口幂等 8 种方案 + 四层防御,把重复扣款工单干到 0
java·后端·面试