各位 30cm, 问一下 所谓的 service 层中怎么优雅获取当前用户

2021-04-09 14:42:02 +08:00
 dengji85

以前一直习惯用 ThreadLocal,但在异步下就不知道怎么搞了,InheritableThreadLocal 的话,没有找到清除用户的入口,filter 肯定不行了,请求结束子线程还没完成不可能去把数据清理掉,求各位大佬指点。 现在的问题是很多代码当初只考虑的是单线程,直接 service 层获取登陆用户,现在要异步的话代码全报错了,当初这种写法是不是不能用

4292 次点击
所在节点    Java
29 条回复
buzaiyouyu123
2021-04-09 14:57:58 +08:00
1.异步线程可以设置上下文,通过上下文传递
2.想办法在子线程前后织入登录用户相关的信息,即 Context
3.阿里的 TTL ( transmittable-thread-local )可以参考
buzaiyouyu123
2021-04-09 14:59:11 +08:00
或者自己来实现一个线程池的 wrapper
HariopaNic
2021-04-09 14:59:45 +08:00
自愧不如没有 30,只有 18
lance7in
2021-04-09 15:02:13 +08:00
不敢当不敢当
18cm 来观赏各位巨巨的优雅
Aruforce
2021-04-09 15:03:02 +08:00
无参过去应该不行…
Aruforce
2021-04-09 15:03:23 +08:00
@Aruforce 无参获取
sutra
2021-04-09 15:05:36 +08:00
dengji85
2021-04-09 15:08:04 +08:00
@lance7in 谦虚了
dengji85
2021-04-09 15:10:27 +08:00
@sutra 项目是自己写的 filter,就是想实现他这个效果
dqzcwxb
2021-04-09 15:14:09 +08:00
当成参数传递给异步线程,你用其他的方式也不过是 ThreadLocal 的变种
dengji85
2021-04-09 15:33:26 +08:00
@dqzcwxb 这样每个方法都得改参数
securityCoding
2021-04-09 15:33:35 +08:00
我这边的方案是获取登录态信息只在 controller 层处理,往下层走的时候以方法参数的形式传过去。
具体的流程是:
1. 网关获取请求头中的 token,登录态 filter 解析 token ( isLogin,uid,uname,merchantId )设置到请求头。
2. 网关带着登录态请求头转发请求。
3. 底层服务从来不需要关注登录态,直接获取请求头即可。
securityCoding
2021-04-09 15:33:59 +08:00
@dengji85 本身属于确定性的参数,就应该显示传
tsanie
2021-04-09 15:42:23 +08:00
30 怕不是从肛门开始量(
hzz2
2021-04-09 15:46:47 +08:00
现在问个问题都这么骚了吗
timethinker
2021-04-09 15:53:59 +08:00
在同步编程模型下直接通过本地线程变量获取绑定的信息,相当于在这个线程上下文中设定了全局变量。

使用同步编程模型,如果在 service 里面获取当前的信息,就跟使用 service 的环境耦合了(本地线程变量),service 不是无状态的。

当然如果一直使用这种同步编程模型是没什么问题的,但如果想要在异步环境下不改变代码也可以使用 service 的话,就必须要在执行阶段先进行类似环境绑定的操作。

比如在执行前,将之前的全局变量绑定到当前的线程,执行完以后再清除避免下一个执行任务获取到错误的信息。
CatKiller
2021-04-09 15:55:49 +08:00
无 图 言 弔
dengji85
2021-04-09 16:24:24 +08:00
@hzz2 本想加个 D cup,但好像论坛没什么女大神把
bz5314520
2021-04-09 16:28:36 +08:00
请求来的时候,自己包装个上下文呗。
liuqitoday
2021-04-09 17:10:20 +08:00
与 12 楼一样,获取登录态信息只在 controller 层处理,往下层走的时候以方法参数的形式传过去

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/769430

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX