QNJR-GROUP / EasyTransaction

A distribute transaction solution(分布式事务) unified the usage of TCC , SAGA ,FMT (seata/fescar AutoCompensation), reliable message, compensate and so on;
Apache License 2.0
2.36k stars 809 forks source link

rpc-rest-ribbon用户token header如何传递 #121

Open LemonCoo1 opened 5 years ago

LemonCoo1 commented 5 years ago

使用rpc-rest-ribbon方式需要在事务发起方获取到用户token,然后在内部服务间传递,目前添加的RestTemplate 拦截器只能实现自定义header传递,想在拦截器里面获取当前request 也不行,不是一个线程,想问下有什么方法可以解决吗

skyesx commented 5 years ago
LemonCoo1 commented 5 years ago
  • 从Spring中获取RestRibbonEasyTransRpcConsumerImpl 实例
  • 调用方法 getLoadBalancedRestTemplate()获得ET内部使用的RestTemplate
  • 在该RestTemplate设置你需要的Filter

自定义header已经实现了,我是想获取HttpServletRequest 用户请求过来的token header头,但不是一个线程,RequestContextHolder.getRequestAttributes() 获取不到用户的请求

skyesx commented 5 years ago

不太理解场景,你是指同步方法如(Try)的token已经成功传输过去给 被调用者了,但是异步方法(cancel,confirm)等由于是新建线程处理的,获取不到RequestContextHolder.getRequestAttributes() ?

如果可以的话,可以贴一下接收方收到的http header信息?

LemonCoo1 commented 5 years ago

是这样的,使用oatuth2+jwt 所有的接口都接收token鉴权,一次用户请求涉及多个服务需要把token 在服务间传递下去

LemonCoo1 commented 5 years ago

框架本身的TCC也需要token鉴权,我想把用户请求的token 在TCC远程调用的时候也传递过去,使用RestRibbonEasyRpcConsumer 里面的RestTemplate 添加拦截器操作token可以,但在拦截器里面是新建线程所以是拿不到用户实际请求信息

skyesx commented 5 years ago

还是没懂场景,加一下我微信,微信上聊?skyesx

LemonCoo1 commented 5 years ago

好的 加你了

skyesx commented 5 years ago

在1.3.1版本及之后通过RemoteServiceCaller.getCurrentLogProcessContext()可以在RPC Consumer execute 或者 Queue Publish 的时候获得当前 ET的上下文 LogProcessContext,以此解决从事务主线程传递信息到异步执行的try,confirm,cancel等方法。但注意,在crash recover 的时候,目前并不会恢复对应设置的额外元信息

通过LogProcessContext的getExtendResourceMap,可以传递token等业务元信息到try,confirm,cancel等异步处理线程

skyesx commented 5 years ago
skyesx commented 5 years ago

建议补偿方法不要校验token,因为crashRecovery的时候:

从而导致补偿失败