解决远程调用微服务之后无法通过上下文获取用户id问题
明明通过线程获取了用户id,但是运行查询的表语句里id居然是为空的,加了一下日志输出,发现真的是空的,如下图:

然后找到了对应的代码部分,看用户传递是否有问题,然后就发现,我的代码里的用户id没有使用远程调用传递过来的参数对象里的id,所以导致传递过来之前是可以获取到的,但是传递过来就丢失了


然后我就注释掉了,获取原本传递对象里的用户id

核心原因:两个接口的线程不是同一个,远程调用的时候用的是新的线程!!!
AuthContextHolder 通常是为同服务内的请求上下文设计的(比如前端请求到达后端服务,通过拦截器解析 token 后将用户 ID 存入 ThreadLocal)。但在服务间远程调用场景下,会在新的线程里处理请求,原来线程的上下文没带过来,ThreadLocal 无法跨服务、跨线程传递,此时依赖它获取用户 ID 就会失效,因为此时就算是同一个用户,新线程也 “不知道” 这个用户的 ID,所以 AuthContextHolder.getUserId() 会返回 null
解决这类问题的核心思路是:
- 若为同服务内请求,用
ThreadLocal上下文(比如AuthContextHolder)传递用户 ID; - 若为跨服务 / 跨线程调用,用 显式参数(比如使用对象
AccountLockVo)传递用户 ID,避免依赖线程上下文。
