SpringCloud OpenFeign 服务调用传递 token
发布网友
发布时间:2024-08-20 01:22
我来回答
共1个回答
热心网友
时间:2024-08-29 02:46
在SpringCloud OpenFeign中,微服务间服务调用通常涉及用户认证信息的传递,尤其是在从A服务到B服务的内部调用场景中,header信息的传递至关重要。OpenFeign提供了RequestInterceptor作为解决方案,允许我们在接口调用前后添加或修改header。
在单线程中,RequestInterceptor能有效地将header添加到请求中,通过RequestContextHolder获取当前线程的请求对象。然而,当在主线程中开启子线程进行Feign调用时,由于RequestContextHolder基于ThreadLocal,子线程可能无法获取到主线程的header,因为线程切换导致ThreadLocal值的变化。
为解决这个问题,我们观察到RequestContextHolder的实现允许从继承的InheritableThreadLocal中获取属性。通过在子线程创建时继承父线程的requestAttributes,我们可以在子线程中正确获取header。但这在web场景下并不总是有效,因为请求结束后,Tomcat会重置request对象,移除header,导致子线程获取不到。
为确保子线程始终能获取到header,可以采取控制主线程在子线程结束后再结束的策略,或者在子线程中重新保存header信息,使用自定义的ThreadLocal结构。通过定义拦截器在请求开始时保存header,然后在子线程中通过这个拦截器获取。
总结来说,OpenFeign在多线程环境下传递header时需要注意线程切换和request对象状态的变化。理解ThreadLocal和InheritableThreadLocal的原理有助于更好地解决此类问题。如有对这些概念不清楚的同学,后续文章将深入讲解。