When micro feign service by calling, call transfer header across the room service

First, the need to achieve a blocker encapsulation:

@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();
	    }
	}

}

Then implement a global RequestInterceptor in feign registration configuration

@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);
	          }
	        }
	    };
	}
    
	
    @Bean
    public feign.Logger.Level multipartLoggerLevel() {
        return feign.Logger.Level.FULL;
    }

}
Published 46 original articles · won praise 13 · views 60000 +

Guess you like

Origin blog.csdn.net/luliuliu1234/article/details/96472893