微服务通过feign调用时,跨服务间调用传递header

本文介绍了在微服务架构中,使用Feign进行跨服务调用时如何通过拦截器实现header的传递。重点讲解了如何创建拦截器以封装header,并在Feign的注册配置中设置全局RequestInterceptor。

首先需要实现一个拦截器进行封装:

@Component
public class HystrixRequestWrapInterceptor implements HandlerInterceptor {
	
	public static final HystrixRequestVariableDefault<HttpServletRequest> REQUEST = new HystrixRequestVariableDefault<>();
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// 在当前线程初始化HystrixRequestContext, 并设置请求头
		if (!HystrixRequestContext.isCurrentThreadInitialized()) {
		    HystrixRequestContext.initializeContext();
		}
		REQUEST.set(request);
		
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// do nothing
	}

// 销毁当前线程
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	    if (HystrixRequestContext.isCurrentThreadInitialized()) {
	        HystrixRequestContext.getContextForCurrentThread().shutdown();
	    }
	}

}

而后在feign注册配置中实现一个全局的RequestInterceptor

@Configuration
public class FeginConfig {
	
	@Bean
	public RequestInterceptor requestInterceptor(){
	    return template -> {
	    	
	    	
	    	if (!HystrixRequestContext.isCurrentThreadInitialized()) {
	    	    HystrixRequestContext.initializeContext();
	    	}
	    	HttpServletRequest request = HystrixRequestWrapInterceptor.REQUEST.get();
			
			
			if(null == request) {
				return;
			}
			
			// 获取RequestTemplate中已包含的请求头
			Map<String, Collection<String>> curHeaders = template.headers();
			Set<String> curHeaderNames = null==curHeaders?new HashSet<>():curHeaders.keySet()
					.stream().map(String::toLowerCase).collect(Collectors.toSet());
	    	
	        Enumeration<String> headerNames = request.getHeaderNames();
	        if (headerNames != null) {
	          while (headerNames.hasMoreElements()) {
	            String name = headerNames.nextElement();
	            // 如果RequestTemplate头信息中已经包含了该请求头, 跳过
	            if(curHeaderNames.contains(name)) continue;
	            
	            String values = request.getHeader(name);
	            template.header(name, values);
	          }
	        }
	    };
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值