在浏览器发送一个Q请求,请求中原包含请求头headers信息,controller某个A方法接收到Q请求并调用某个B方法。B方法中有Feign远程调用,在执行Feign远程调用其他服务时,会丢失掉原来请求中的请求头信息。
Feign远程调用底层是发送Http请求,而发送请求时会经过Feign的拦截器。Request request = targetRequest(template);template包含请求地址请求头但是请求头没有数据,targetRequest (template)方法会经过Feign的拦截器 返回一个Request对象,然后再执行http请求获取数据。
详细:在B方法Feign远程调用时,会触发ReflectiveFeign类下 Object invoke(Object proxy, Method method, Object[] args)方法,该方法的参数包含服务名称,请求方式(GET)等等,但是请求头信息为空。此方法会调用 dispatch.get(method).invoke(args)方法;来到SynchronousMethodHandler类下的 Object invoke(Object[] argv)方法;Object invoke(Object[] argv)方法会再调用executeAndDecode(template, options)方法;