Feign远程调用遇到的坑
1、Feign远程调用丢失请求头问题
在订单服务向购物车服务发起远程调用时,在购物车服务中获取不到用户信息,原因是用户的信息是基于SpringSession保存在redis中,key存在于浏览器的cookie中,当在浏览器中发起请求时,由于请求会默认带上cookie,所以可以正常获取到数据信息,但在这个业务中是由Feign发起的远程调用走到购物车服务,Feign远程调用时会创建一个新的request,里面没有cookie数据,所以在购物车服务中获取不到用户数据。
解决办法,由于Feign在远程调用之前都会调用很多拦截器(默认没有拦截器),可以写一个Feign的请求拦截器扩展Feign的功能,在新的request中加入cookie
1 |
|
2、Feign异步情况丢失上下文问题
在上一个问题中,对于Feign的远程调用请求头丢失问题,引入了RequestInterceptor来解决,但这种办法只能针对同步问题,当使用异步编排发起Feign远程调用时,ServletRequestAttributes中就回去不到原来线程的request数据,就会报空指针异常。
如上图所示,RequestContextHolder是利用ThreadLocal共享数据,所以会发生这种问题。
解决办法是在异步编排之前,先获取主线程的上下文,在进入新线程后再把主线程的上下文放到新线程里面。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hurried1y!
评论