Java - 如何将标头传播到 Spring OpenFeign

Posted

技术标签:

【中文标题】Java - 如何将标头传播到 Spring OpenFeign【英文标题】:Java - How to propagate the Headers to Spring OpenFeign 【发布时间】:2022-01-01 08:35:15 【问题描述】:

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

有办法做到这一点吗?我在网上找不到。

我拥有的标头传播示例:

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

【问题讨论】:

你可以实现feign.RequestInterceptor @geobreze 如何将原始请求的标头设置为下一个请求? 可以放到线程本地上下文中。或者您可以避免使用 AnnotatedParameterProcessor 实现拦截器 你有样品吗? 【参考方案1】:

这是一个使用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,我找到了一种只从请求中添加一个标头的方法,但我认为这对你不起作用。

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

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

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

【讨论】:

以上是关于Java - 如何将标头传播到 Spring OpenFeign的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET Core 中使用 HTTP 标头传播

在 ASP.NET Core 中使用 HTTP 标头传播

当我使用 Spring Cloud 构建我的微服务时,如何将内容长度添加到响应标头

只有搞Java开发的才知道!Spring事务是如何传播的

如何使用 Spring Boot RestTemplate 将 Microsoft Office Mime 类型作为 Content-Type 标头发送

如何在所有请求标头中传递授权令牌 - Spring Boot java