Feign 调用与令牌传递
一、携带 Token 的服务调用
⚠Token调用注意事项
使用 token 调用时,无需添加 @Inner、FROM_IN 或 @NoToken 等注解!
- 客户端携带 token 访问服务 A
- 服务 A 通过 FeignClient 调用服务 B 获取数据
- Token 会在整个调用链路中自动传递(A→B→C→D)
- 用户需要拥有调用链路上所有接口的访问权限
flowchart LR
Client[客户端携带token] --> ServiceA[A服务]
ServiceA -->|自动传递token| ServiceB[B服务]
二、无 Token 的服务调用
在以下场景中,通常无法携带用户 token:
- 异步任务调用
- 定时任务调用
- 消息队列(MQ)调用
- 未登录状态的接口调用
flowchart LR
Caller[定时任务/MQ/异步调用] --> ServiceA[A服务]
ServiceA --> ServiceB[B服务]
实现方式
1. 调用方配置
在 FeignClient 接口中,需要通过以下方式之一声明无 token 调用:
方式一:使用 FROM_IN 参数(通用方式)
R<Boolean> saveLog(@RequestHeader(SecurityConstants.FROM) String from);
方式二:使用 @NoToken 注解(v5.6+ 版本支持)
2. 服务提供方配置
使用 @Inner 注解标记接口,实现内部调用控制:
@Inner
@PostMapping
public R save(@Valid @RequestBody SysLog sysLog) {
return new R<>(sysLogService.save(sysLog));
}
💡@Inner注解作用
@Inner 注解确保接口只能被内部服务调用,防止接口被外部直接访问,提升系统安全性。