yonge 5 年之前
父節點
當前提交
3aced30bb1

+ 1 - 1
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/SysUserFeignService.java

@@ -10,7 +10,7 @@ import com.ym.mec.auth.api.dto.SysUserInfo;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.common.config.FeignConfiguration;
 
-@FeignClient(name = "auth-server", configuration = FeignConfiguration.class, fallback = SysUserFeignServiceFallback.class)
+@FeignClient(name = "auth-server", configuration = { FeignConfiguration.class }, fallback = SysUserFeignServiceFallback.class)
 public interface SysUserFeignService {
 
 	@GetMapping(value = "query/{username}")

+ 2 - 2
mec-client-api/src/main/java/com/ym/im/ImFeignService.java

@@ -1,13 +1,13 @@
 package com.ym.im;
 
 import com.ym.im.fallback.ImFeignServiceFallback;
-import com.ym.mec.common.config.FeignConfiguration;
+import com.ym.mec.common.config.RequestHeaderConfiguration;
 import com.ym.mec.common.entity.ImUserModel;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 
-@FeignClient(name = "im-server", configuration = FeignConfiguration.class, fallback = ImFeignServiceFallback.class)
+@FeignClient(name = "im-server", configuration = RequestHeaderConfiguration.class, fallback = ImFeignServiceFallback.class)
 public interface ImFeignService {
 
     @PostMapping(value = "user/register")

+ 12 - 25
mec-common/common-core/src/main/java/com/ym/mec/common/config/FeignConfiguration.java

@@ -1,35 +1,22 @@
 package com.ym.mec.common.config;
 
-import java.util.Enumeration;
-
-import javax.servlet.http.HttpServletRequest;
-
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
 
+import feign.Logger;
 import feign.RequestInterceptor;
-import feign.RequestTemplate;
 
 @Configuration
-public class FeignConfiguration implements RequestInterceptor {
-
-	@Override
-	public void apply(RequestTemplate template) {
-		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-		if (attributes == null) {
-			return;
-		}
-		HttpServletRequest request = attributes.getRequest();
-		Enumeration<String> headerNames = request.getHeaderNames();
-		if (headerNames != null) {
-			while (headerNames.hasMoreElements()) {
-				String name = headerNames.nextElement();
-				String values = request.getHeader(name);
-				template.header(name, values);
+public class FeignConfiguration {
 
-			}
-		}
+	@Bean
+	Logger.Level feignLoggerLevel() {
+		// 这里记录所有,根据实际情况选择合适的日志level
+		return Logger.Level.FULL;
+	}
+	
+	@Bean
+	public RequestInterceptor requestInterceptor(){
+		return new RequestHeaderConfiguration();
 	}
-
 }

+ 128 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/config/RequestAttributeHystrixConcurrencyStrategy.java

@@ -0,0 +1,128 @@
+package com.ym.mec.common.config;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+
+import com.netflix.hystrix.HystrixThreadPoolKey;
+import com.netflix.hystrix.HystrixThreadPoolProperties;
+import com.netflix.hystrix.strategy.HystrixPlugins;
+import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy;
+import com.netflix.hystrix.strategy.concurrency.HystrixRequestVariable;
+import com.netflix.hystrix.strategy.concurrency.HystrixRequestVariableLifecycle;
+import com.netflix.hystrix.strategy.eventnotifier.HystrixEventNotifier;
+import com.netflix.hystrix.strategy.executionhook.HystrixCommandExecutionHook;
+import com.netflix.hystrix.strategy.metrics.HystrixMetricsPublisher;
+import com.netflix.hystrix.strategy.properties.HystrixPropertiesStrategy;
+import com.netflix.hystrix.strategy.properties.HystrixProperty;
+
+@Component
+public class RequestAttributeHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {
+	private static final Logger log = LoggerFactory.getLogger(RequestAttributeHystrixConcurrencyStrategy.class);
+
+	private HystrixConcurrencyStrategy delegate;
+
+	public RequestAttributeHystrixConcurrencyStrategy() {
+		try {
+			this.delegate = HystrixPlugins.getInstance().getConcurrencyStrategy();
+			if (this.delegate instanceof RequestAttributeHystrixConcurrencyStrategy) {
+				// Welcome to singleton hell...
+				return;
+			}
+			HystrixCommandExecutionHook commandExecutionHook = HystrixPlugins
+					.getInstance().getCommandExecutionHook();
+			HystrixEventNotifier eventNotifier = HystrixPlugins.getInstance()
+					.getEventNotifier();
+			HystrixMetricsPublisher metricsPublisher = HystrixPlugins.getInstance()
+					.getMetricsPublisher();
+			HystrixPropertiesStrategy propertiesStrategy = HystrixPlugins.getInstance()
+					.getPropertiesStrategy();
+			this.logCurrentStateOfHystrixPlugins(eventNotifier, metricsPublisher,
+					propertiesStrategy);
+			HystrixPlugins.reset();
+			HystrixPlugins.getInstance().registerConcurrencyStrategy(this);
+			HystrixPlugins.getInstance()
+					.registerCommandExecutionHook(commandExecutionHook);
+			HystrixPlugins.getInstance().registerEventNotifier(eventNotifier);
+			HystrixPlugins.getInstance().registerMetricsPublisher(metricsPublisher);
+			HystrixPlugins.getInstance().registerPropertiesStrategy(propertiesStrategy);
+		}
+		catch (Exception e) {
+			log.error("Failed to register Sleuth Hystrix Concurrency Strategy", e);
+		}
+	}
+
+	private void logCurrentStateOfHystrixPlugins(HystrixEventNotifier eventNotifier,
+			HystrixMetricsPublisher metricsPublisher,
+			HystrixPropertiesStrategy propertiesStrategy) {
+		if (log.isDebugEnabled()) {
+			log.debug("Current Hystrix plugins configuration is ["
+					+ "concurrencyStrategy [" + this.delegate + "]," + "eventNotifier ["
+					+ eventNotifier + "]," + "metricPublisher [" + metricsPublisher + "],"
+					+ "propertiesStrategy [" + propertiesStrategy + "]," + "]");
+			log.debug("Registering Sleuth Hystrix Concurrency Strategy.");
+		}
+	}
+
+	@Override
+	public <T> Callable<T> wrapCallable(Callable<T> callable) {
+		RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
+		return new WrappedCallable<>(callable, requestAttributes);
+	}
+
+	@Override
+	public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey,
+			HystrixProperty<Integer> corePoolSize,
+			HystrixProperty<Integer> maximumPoolSize,
+			HystrixProperty<Integer> keepAliveTime, TimeUnit unit,
+			BlockingQueue<Runnable> workQueue) {
+		return this.delegate.getThreadPool(threadPoolKey, corePoolSize, maximumPoolSize,
+				keepAliveTime, unit, workQueue);
+	}
+
+	@Override
+	public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey,
+			HystrixThreadPoolProperties threadPoolProperties) {
+		return this.delegate.getThreadPool(threadPoolKey, threadPoolProperties);
+	}
+
+	@Override
+	public BlockingQueue<Runnable> getBlockingQueue(int maxQueueSize) {
+		return this.delegate.getBlockingQueue(maxQueueSize);
+	}
+
+	@Override
+	public <T> HystrixRequestVariable<T> getRequestVariable(
+			HystrixRequestVariableLifecycle<T> rv) {
+		return this.delegate.getRequestVariable(rv);
+	}
+
+	static class WrappedCallable<T> implements Callable<T> {
+
+		private final Callable<T> target;
+		private final RequestAttributes requestAttributes;
+
+		public WrappedCallable(Callable<T> target, RequestAttributes requestAttributes) {
+			this.target = target;
+			this.requestAttributes = requestAttributes;
+		}
+
+		@Override
+		public T call() throws Exception {
+			try {
+				RequestContextHolder.setRequestAttributes(requestAttributes);
+				return target.call();
+			}
+			finally {
+				RequestContextHolder.resetRequestAttributes();
+			}
+		}
+	}
+}

+ 33 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/config/RequestHeaderConfiguration.java

@@ -0,0 +1,33 @@
+package com.ym.mec.common.config;
+
+import java.util.Enumeration;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+
+public class RequestHeaderConfiguration implements RequestInterceptor {
+
+	@Override
+	public void apply(RequestTemplate template) {
+		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+		if (attributes == null) {
+			return;
+		}
+		HttpServletRequest request = attributes.getRequest();
+		Enumeration<String> headerNames = request.getHeaderNames();
+		if (headerNames != null) {
+			while (headerNames.hasMoreElements()) {
+				String name = headerNames.nextElement();
+				String values = request.getHeader(name);
+				template.header(name, values);
+
+			}
+		}
+	}
+
+}

+ 5 - 1
mec-student/src/main/resources/application.yml

@@ -76,4 +76,8 @@ management:
   
 feign:
   hystrix:
-    enabled: true
+    enabled: true
+
+logging:
+  level:
+    com.ym.mec.auth.api.client.SysUserFeignService: DEBUG

+ 6 - 0
pom.xml

@@ -67,6 +67,12 @@
 
 			<dependency>
 				<groupId>com.ym</groupId>
+				<artifactId>mec-client-api</artifactId>
+					<version>1.0</version>
+			</dependency>
+
+			<dependency>
+				<groupId>com.ym</groupId>
 				<artifactId>mec-biz</artifactId>
 				<version>1.0</version>
 			</dependency>