关于微服务之间用户信息传递出现问题
Contents
最近需要搭建一个货运相关的微服务架构,基本上都挺顺利,但是遇到了一个请求头传递信息的问题:
业务场景:某些模块是通过请求头传递用户 ID,以供Web子服务调用(feign)
问题:Web 子模块无法获取请求头信息,导致无法完成业务流程
解决方案:添加一个拦截器,统一拦截系统的request请求,再设置 request 信息即可
@Component
public class FeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
// 微服务远程通过feign互相调用时,获取相关信息
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 再设置 header 数据
requestTemplate.header("userTempId", request.getHeader("userTempId"));
requestTemplate.header("userId", request.getHeader("userId"));
}
}若发现不生效,可能是启动类没扫描到拦截器,添加扫描即可,比如:
@SpringBootApplication
@EnableFeignClients("com.xxx.yyy.zzz")
@ComponentScan("com.xxx.yyy.zzz")
public class WebSysApplication {
public static void main(String[] args) {
SpringApplication.run(WebAllApplication.class, args);
}
}