Java - 如何将 Headers 传播到 Spring OpenFeign

Java - How to propagate the Headers to Spring OpenFeign

我有一个微服务,它使用 FeignClient(spring 云)调用多个级联微服务。我想在此期间传播所有 header 值,而不在 feign 方法中为每个 header 值声明一个属性。

有办法吗?我无法在网上找到它。

我拥有的 header 的传播样本:

void doSomething(Long id, 
    @Header("Accept-Language") String language, 
    @Header("Accept") accept, 
    @Header("Authorization") authorization, 
    @Header("Connection") connection, ...)

这里有一个例子,说明如何使用 RequestInterceptor

@Component
class CurrentRequestHeadersInterceptor implements RequestInterceptor {
  @Override
  public void apply(RequestTemplate template) {
    RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
    if (requestAttributes instanceof ServletRequestAttributes) {
      HttpServletRequest webRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
      webRequest.getHeaderNames().asIterator()
          .forEachRemaining(h -> template.header(h, webRequest.getHeader(h)));
    }
  }
}

至于 AnnotatedParameterProcessor,我找到了一种从请求中仅添加一个 header 的方法,但我认为这对您不起作用。

如果您更喜欢显式 header 传递,您可以使用 @RequestHeader 注释将 header 作为 Map.

传递
@FeignClient(name = "test", url = "localhost:9090")
interface TestClient {
  @RequestMapping("/test")
  void test(@RequestHeader Map<String, List<String>> headers);
}

然后你可以添加 WebRequest 作为你的控制器的方法参数,将请求转换为 header 的 Map 然后传递给客户端。