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的主要内容,如果未能解决你的问题,请参考以下文章
当我使用 Spring Cloud 构建我的微服务时,如何将内容长度添加到响应标头
如何使用 Spring Boot RestTemplate 将 Microsoft Office Mime 类型作为 Content-Type 标头发送