diff --git a/pom.xml b/pom.xml
index 440d0a6c..0089bc22 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,7 +12,7 @@
cn.springcloud.gray
spring-cloud-gray
pom
- 2.0.0
+ 2.1.0
https://github.com/SpringCloud/spring-cloud-gray
Spring Cloud中国社区
diff --git a/spring-cloud-gray-client-netflix/pom.xml b/spring-cloud-gray-client-netflix/pom.xml
index 97a17ae4..76b842d0 100644
--- a/spring-cloud-gray-client-netflix/pom.xml
+++ b/spring-cloud-gray-client-netflix/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray
cn.springcloud.gray
- 2.0.0
+ 2.1.0
4.0.0
diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java
index a39727c9..a274db50 100644
--- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java
+++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java
@@ -2,9 +2,8 @@
import cn.springcloud.gray.GrayManager;
import cn.springcloud.gray.client.netflix.hystrix.HystrixRequestLocalStorage;
-import cn.springcloud.gray.request.GrayHttpTrackInfo;
-import cn.springcloud.gray.request.GrayInfoTracker;
import cn.springcloud.gray.request.RequestLocalStorage;
+import cn.springcloud.gray.request.track.GrayTrackHolder;
import cn.springcloud.gray.web.GrayTrackFilter;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
@@ -18,9 +17,7 @@
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
-import java.util.List;
@Configuration
@ConditionalOnClass({HystrixCommand.class, HystrixFeign.class})
@@ -39,9 +36,9 @@ public RequestLocalStorage requestLocalStorage() {
@Bean
public GrayTrackFilter grayTrackFilter(
- RequestLocalStorage requestLocalStorage,
- List> trackors) {
- return new GrayTrackFilter(requestLocalStorage, trackors) {
+ GrayTrackHolder grayTrackHolder,
+ RequestLocalStorage requestLocalStorage) {
+ return new GrayTrackFilter(grayTrackHolder, requestLocalStorage) {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (!HystrixRequestContext.isCurrentThreadInitialized()) {
diff --git a/spring-cloud-gray-client/pom.xml b/spring-cloud-gray-client/pom.xml
index ad4f1fb1..36445e56 100644
--- a/spring-cloud-gray-client/pom.xml
+++ b/spring-cloud-gray-client/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray
cn.springcloud.gray
- 2.0.0
+ 2.1.0
4.0.0
@@ -56,7 +56,7 @@
cn.springcloud.gray
spring-cloud-gray-utils
- 2.0.0
+ 2.1.0
compile
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/AbstractCommunicableGrayManager.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/AbstractCommunicableGrayManager.java
index 15e63bd8..e96d59fb 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/AbstractCommunicableGrayManager.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/AbstractCommunicableGrayManager.java
@@ -1,8 +1,6 @@
package cn.springcloud.gray;
-import cn.springcloud.gray.communication.HttpInformationClient;
import cn.springcloud.gray.communication.InformationClient;
-import cn.springcloud.gray.communication.RetryableInformationClient;
import cn.springcloud.gray.decision.GrayDecisionFactoryKeeper;
import java.util.List;
@@ -12,9 +10,12 @@ public abstract class AbstractCommunicableGrayManager extends SimpleGrayManager
private GrayClientConfig grayClientConfig;
private InformationClient informationClient;
- public AbstractCommunicableGrayManager(GrayClientConfig grayClientConfig, GrayDecisionFactoryKeeper grayDecisionFactoryKeeper, List requestInterceptors) {
+ public AbstractCommunicableGrayManager(
+ GrayClientConfig grayClientConfig, GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
+ List requestInterceptors, InformationClient informationClient) {
super(grayDecisionFactoryKeeper, requestInterceptors);
this.grayClientConfig = grayClientConfig;
+ this.informationClient = informationClient;
createInformationClient();
}
@@ -29,13 +30,6 @@ public InformationClient getGrayInformationClient() {
protected void createInformationClient() {
- GrayClientConfig clientConfig = getGrayClientConfig();
- InformationClient httpClient = new HttpInformationClient(clientConfig.getServerUrl());
- if (clientConfig.isRetryable()) {
- informationClient = new RetryableInformationClient(Math.max(3, clientConfig.getRetryNumberOfRetries()), httpClient);
- } else {
- informationClient = httpClient;
- }
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/CommunicableGrayManager.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/CommunicableGrayManager.java
index ddab3697..a8d22b46 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/CommunicableGrayManager.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/CommunicableGrayManager.java
@@ -1,9 +1,7 @@
package cn.springcloud.gray;
-import cn.springcloud.gray.communication.InformationClient;
-public interface CommunicableGrayManager extends GrayManager {
+public interface CommunicableGrayManager extends GrayManager, GrayServerCommunicable {
- InformationClient getGrayInformationClient();
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/DefaultGrayManager.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/DefaultGrayManager.java
index 06ad5e1b..27667ef2 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/DefaultGrayManager.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/DefaultGrayManager.java
@@ -1,6 +1,7 @@
package cn.springcloud.gray;
-
+import cn.springcloud.gray.client.config.properties.GrayLoadProperties;
+import cn.springcloud.gray.communication.InformationClient;
import cn.springcloud.gray.decision.GrayDecisionFactoryKeeper;
import cn.springcloud.gray.model.GrayInstance;
import cn.springcloud.gray.model.GrayService;
@@ -16,32 +17,43 @@
public class DefaultGrayManager extends AbstractCommunicableGrayManager {
private Timer updateTimer = new Timer("Gray-Update-Timer", true);
-
- public DefaultGrayManager(GrayClientConfig grayClientConfig, GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
- List requestInterceptors) {
- super(grayClientConfig, grayDecisionFactoryKeeper, requestInterceptors);
+ private GrayLoadProperties grayLoadProperties;
+
+ public DefaultGrayManager(
+ GrayClientConfig grayClientConfig,
+ GrayLoadProperties grayLoadProperties,
+ GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
+ List requestInterceptors,
+ InformationClient informationClient) {
+ super(grayClientConfig, grayDecisionFactoryKeeper, requestInterceptors, informationClient);
+ this.grayLoadProperties = grayLoadProperties;
openForWork();
}
-
public void openForWork() {
log.info("拉取灰度列表");
- doUpdate();
- updateTimer.schedule(new UpdateTask(),
- getGrayClientConfig().getServiceUpdateIntervalTimerInMs(),
- getGrayClientConfig().getServiceUpdateIntervalTimerInMs());
- }
+ if (getGrayInformationClient() != null) {
+ doUpdate();
+ int timerMs = getGrayClientConfig().getServiceUpdateIntervalTimerInMs();
+ if (timerMs > 0) {
+ updateTimer.schedule(new UpdateTask(), timerMs, timerMs);
+ }
+ } else {
+ loadPropertiesGrays();
+ }
+ }
private void doUpdate() {
try {
log.debug("更新灰度服务列表...");
-
List grayInstances = getGrayInformationClient().allGrayInstances();
Map grayServices = new ConcurrentHashMap<>();
- grayInstances.forEach(instance -> {
- updateGrayInstance(grayServices, instance);
- });
+ grayInstances.forEach(
+ instance -> {
+ updateGrayInstance(grayServices, instance);
+ });
+ joinLoadedGrays(grayServices);
this.grayServices = grayServices;
} catch (Exception e) {
log.error("更新灰度服务列表失败", e);
@@ -49,6 +61,31 @@ private void doUpdate() {
}
+ private void loadPropertiesGrays() {
+ Map grayServices = new ConcurrentHashMap<>();
+ joinLoadedGrays(grayServices);
+ this.grayServices = grayServices;
+ }
+
+
+ /**
+ * 加入配置文件中的灰度实例,但不会覆盖列表中的信息
+ *
+ * @param grayServices 更新的灰度列表
+ */
+ private void joinLoadedGrays(Map grayServices) {
+ if (grayLoadProperties != null && grayLoadProperties.isEnabled()) {
+ grayLoadProperties.getGrayInstances().forEach(
+ instance -> {
+ if (grayServices.containsKey(instance.getServiceId())
+ || grayServices.get(instance.getServiceId())
+ .getGrayInstance(instance.getInstanceId()) != null) {
+ updateGrayInstance(grayServices, instance);
+ }
+ });
+ }
+ }
+
class UpdateTask extends TimerTask {
@Override
@@ -56,6 +93,4 @@ public void run() {
doUpdate();
}
}
-
-
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayClientConfig.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayClientConfig.java
index e11c942b..323a8caf 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayClientConfig.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayClientConfig.java
@@ -34,7 +34,7 @@ public interface GrayClientConfig {
/**
- * 更新灰度列表的时间间隔(ms)
+ * 更新灰度列表的时间间隔(ms),小于等于0将不会开启定时轮询
*
* @return 返回更新灰度列表的时间间隔(ms)
*/
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayServerCommunicable.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayServerCommunicable.java
new file mode 100644
index 00000000..9d2f1fab
--- /dev/null
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayServerCommunicable.java
@@ -0,0 +1,8 @@
+package cn.springcloud.gray;
+
+import cn.springcloud.gray.communication.InformationClient;
+
+public interface GrayServerCommunicable {
+
+ InformationClient getGrayInformationClient();
+}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/InstanceLocalInfoAware.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/InstanceLocalInfoAware.java
new file mode 100644
index 00000000..1696eed8
--- /dev/null
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/InstanceLocalInfoAware.java
@@ -0,0 +1,6 @@
+package cn.springcloud.gray;
+
+public interface InstanceLocalInfoAware {
+
+ void setInstanceLocalInfo(InstanceLocalInfo instanceLocalInfo);
+}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientAutoConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientAutoConfiguration.java
index df498074..699193f2 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientAutoConfiguration.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientAutoConfiguration.java
@@ -3,13 +3,18 @@
import cn.springcloud.gray.*;
import cn.springcloud.gray.client.GrayClientInitializingDestroyBean;
import cn.springcloud.gray.client.config.properties.GrayClientProperties;
+import cn.springcloud.gray.client.config.properties.GrayLoadProperties;
import cn.springcloud.gray.client.config.properties.GrayRequestProperties;
+import cn.springcloud.gray.communication.HttpInformationClient;
+import cn.springcloud.gray.communication.InformationClient;
+import cn.springcloud.gray.communication.RetryableInformationClient;
import cn.springcloud.gray.decision.GrayDecisionFactoryKeeper;
import cn.springcloud.gray.request.RequestLocalStorage;
import cn.springcloud.gray.request.ThreadLocalRequestStorage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -30,9 +35,27 @@ public class GrayClientAutoConfiguration {
@Bean
@ConditionalOnMissingBean
- public GrayManager grayManager(GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
- @Autowired(required = false) List requestInterceptors) {
- return new DefaultGrayManager(grayClientProperties, grayDecisionFactoryKeeper, requestInterceptors);
+ @ConditionalOnProperty(value = "gray.client.serverUrl")
+ public InformationClient informationClient() {
+ InformationClient httpClient = new HttpInformationClient(grayClientProperties.getServerUrl());
+ if (grayClientProperties.isRetryable()) {
+ return new RetryableInformationClient(Math.max(3, grayClientProperties.getRetryNumberOfRetries()), httpClient);
+ } else {
+ return httpClient;
+ }
+ }
+
+
+ @Bean
+ @ConditionalOnMissingBean
+ public GrayManager grayManager(
+ @Autowired(required = false) GrayLoadProperties grayLoadProperties,
+ GrayDecisionFactoryKeeper grayDecisionFactoryKeeper,
+ @Autowired(required = false) List requestInterceptors,
+ InformationClient informationClient) {
+ return new DefaultGrayManager(
+ grayClientProperties, grayLoadProperties, grayDecisionFactoryKeeper,
+ requestInterceptors, informationClient);
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientBeanPostProcessorConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientBeanPostProcessorConfiguration.java
new file mode 100644
index 00000000..8a643e54
--- /dev/null
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientBeanPostProcessorConfiguration.java
@@ -0,0 +1,35 @@
+package cn.springcloud.gray.client.config;
+
+import cn.springcloud.gray.InstanceLocalInfo;
+import cn.springcloud.gray.InstanceLocalInfoAware;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class GrayClientBeanPostProcessorConfiguration {
+
+
+ @Bean
+// @ConditionalOnBean(InstanceLocalInfo.class)
+ public BeanPostProcessor beanPostProcessor(InstanceLocalInfo instanceLocalInfo) {
+ return new BeanPostProcessor() {
+ @Override
+ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+ if (bean instanceof InstanceLocalInfoAware) {
+ ((InstanceLocalInfoAware) bean).setInstanceLocalInfo(instanceLocalInfo);
+ }
+ return bean;
+ }
+
+ @Override
+ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+
+
+ return bean;
+ }
+ };
+ }
+
+}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayEventAutoConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayEventAutoConfiguration.java
index b22a63cb..eb141c64 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayEventAutoConfiguration.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayEventAutoConfiguration.java
@@ -5,6 +5,7 @@
import cn.springcloud.gray.event.GrayEventListener;
import cn.springcloud.gray.event.stream.StreamInput;
import cn.springcloud.gray.event.stream.StreamMessageListener;
+import cn.springcloud.gray.request.track.CommunicableGrayTrackHolder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -18,8 +19,9 @@ public class GrayEventAutoConfiguration {
@Bean
@ConditionalOnMissingBean
- public GrayEventListener grayEventListener(CommunicableGrayManager grayManager) {
- return new DefaultGrayEventListener(grayManager);
+ public GrayEventListener grayEventListener(
+ CommunicableGrayTrackHolder grayTrackHolder, CommunicableGrayManager grayManager) {
+ return new DefaultGrayEventListener(grayTrackHolder, grayManager);
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayTrackConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayTrackConfiguration.java
index d2d86046..bd16c3d6 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayTrackConfiguration.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayTrackConfiguration.java
@@ -2,13 +2,16 @@
import cn.springcloud.gray.client.config.properties.GrayTrackProperties;
+import cn.springcloud.gray.communication.InformationClient;
import cn.springcloud.gray.request.GrayHttpTrackInfo;
import cn.springcloud.gray.request.GrayInfoTracker;
+import cn.springcloud.gray.request.GrayTrackInfo;
import cn.springcloud.gray.request.RequestLocalStorage;
+import cn.springcloud.gray.request.track.DefaultGrayTrackHolder;
+import cn.springcloud.gray.request.track.GrayTrackHolder;
import cn.springcloud.gray.web.GrayTrackFilter;
import cn.springcloud.gray.web.GrayTrackRequestInterceptor;
import cn.springcloud.gray.web.tracker.*;
-import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -16,8 +19,6 @@
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import javax.servlet.http.HttpServletRequest;
@@ -29,6 +30,16 @@
public class GrayTrackConfiguration {
+ @Bean(initMethod = "openForWork")
+ @ConditionalOnMissingBean
+ public GrayTrackHolder grayTrackHolder(
+ GrayTrackProperties grayTrackProperties,
+ @Autowired(required = false) InformationClient informationClient,
+ List> trackers) {
+ return new DefaultGrayTrackHolder(grayTrackProperties, informationClient, trackers);
+ }
+
+
@ConditionalOnProperty(value = "gray.client.runenv", havingValue = "web", matchIfMissing = true)
@Configuration
public static class GrayClientWebConfiguration extends WebMvcConfigurerAdapter {
@@ -42,29 +53,10 @@ public static class GrayClientWebConfiguration extends WebMvcConfigurerAdapter {
@Autowired
private RequestLocalStorage requestLocalStorage;
-// @Bean
-// @ConditionalOnMissingBean
-// public GrayTrackInterceptor grayTrackInterceptor() {
-// return new GrayTrackInterceptor(requestLocalStorage, trackors);
-// }
-
-// @Override
-// public void addInterceptors(InterceptorRegistry registry) {
-// InterceptorRegistration grayTrackRegistor = registry.addInterceptor(grayTrackInterceptor());
-// GrayTrackProperties.Web webProperties = grayTrackProperties.getWeb();
-//
-// for (String pattern : webProperties.getPathPatterns()) {
-// grayTrackRegistor.addPathPatterns(pattern);
-// }
-// for (String pattern : webProperties.getExcludePathPatterns()) {
-// grayTrackRegistor.excludePathPatterns(pattern);
-// }
-// }
-
@Bean
@ConditionalOnMissingBean
- public GrayTrackFilter grayTrackFilter() {
- return new GrayTrackFilter(requestLocalStorage, trackors);
+ public GrayTrackFilter grayTrackFilter(GrayTrackHolder grayTrackHolder) {
+ return new GrayTrackFilter(grayTrackHolder, requestLocalStorage);
}
@@ -87,48 +79,39 @@ public FilterRegistrationBean companyUrlFilterRegister(GrayTrackFilter filter) {
@Bean
- public HttpReceiveGrayTracker httpReceiveGrayTracker() {
- return new HttpReceiveGrayTracker();
+ public HttpReceiveGrayInfoTracker httpReceiveGrayTracker() {
+ return new HttpReceiveGrayInfoTracker();
}
@Bean
- @ConditionalOnProperty(value = "gray.request.track.web.need.headers")
- public HttpHeaderGrayTracker httpHeaderGrayTracker() {
- String header = grayTrackProperties.getWeb().getNeed().get(GrayTrackProperties.Web.NEED_HEADERS);
- String[] headers = StringUtils.isEmpty(header) ? new String[]{} : header.split(",");
- return new HttpHeaderGrayTracker(headers);
+ public HttpHeaderGrayInfoTracker httpHeaderGrayTracker() {
+ return new HttpHeaderGrayInfoTracker();
}
@Bean
- @ConditionalOnProperty(value = "gray.request.track.web.need.method", havingValue = "enable")
- public HttpMethodGrayTracker httpMethodGrayTracker() {
- return new HttpMethodGrayTracker();
+ public HttpMethodGrayInfoTracker httpMethodGrayTracker() {
+ return new HttpMethodGrayInfoTracker();
}
@Bean
- @ConditionalOnProperty(value = "gray.request.track.web.need.uri", havingValue = "enable")
- public HttpURIGrayTracker httpURIGrayTracker() {
- return new HttpURIGrayTracker();
+ public HttpURIGrayInfoTracker httpURIGrayTracker() {
+ return new HttpURIGrayInfoTracker();
}
@Bean
- @ConditionalOnProperty(value = "gray.request.track.web.need.ip", havingValue = "enable")
- public HttpIPGrayTracker httpIPGrayTracker() {
- return new HttpIPGrayTracker();
+ public HttpIPGrayInfoTracker httpIPGrayTracker() {
+ return new HttpIPGrayInfoTracker();
}
@Bean
- @ConditionalOnProperty(value = "gray.request.track.web.need.parameters", havingValue = "enable")
- public HttpParameterGrayTracker httpParameterGrayTracker() {
- String name = grayTrackProperties.getWeb().getNeed().get(GrayTrackProperties.Web.NEED_PARAMETERS);
- String[] names = StringUtils.isEmpty(name) ? new String[]{} : name.split(",");
- return new HttpParameterGrayTracker(names);
+ public HttpParameterGrayInfoTracker httpParameterGrayTracker() {
+ return new HttpParameterGrayInfoTracker();
}
@Bean
public GrayTrackRequestInterceptor grayTrackRequestInterceptor() {
- return new GrayTrackRequestInterceptor(grayTrackProperties);
+ return new GrayTrackRequestInterceptor();
}
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/properties/GrayClientProperties.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/properties/GrayClientProperties.java
index 18f1fc16..139835e7 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/properties/GrayClientProperties.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/properties/GrayClientProperties.java
@@ -13,7 +13,7 @@ public class GrayClientProperties implements GrayClientConfig {
private String informationClient = "http";
- private String serverUrl = "http://localhost:10202";
+ private String serverUrl = "";
private boolean retryable = true;
private int retryNumberOfRetries = RetryableInformationClient.DEFAULT_NUMBER_OF_RETRIES;
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/properties/GrayTrackProperties.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/properties/GrayTrackProperties.java
index cadad69b..8e479f9b 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/properties/GrayTrackProperties.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/properties/GrayTrackProperties.java
@@ -1,11 +1,12 @@
package cn.springcloud.gray.client.config.properties;
+import cn.springcloud.gray.model.GrayTrackDefinition;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
@Setter
@@ -16,6 +17,8 @@ public class GrayTrackProperties {
private String trackType = "web";
private Web web = new Web();
+ private int definitionsUpdateIntervalTimerInMs = 0;
+
@Setter
@Getter
public static class Web {
@@ -29,7 +32,8 @@ public static class Web {
private String[] pathPatterns = new String[]{"/*"};
private String[] excludePathPatterns = new String[]{};
- private Map need = new HashMap<>();
+ private List trackDefinitions = new ArrayList<>();
+
}
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/communication/HttpInformationClient.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/communication/HttpInformationClient.java
index 4d1cd12d..68557cba 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/communication/HttpInformationClient.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/communication/HttpInformationClient.java
@@ -1,6 +1,7 @@
package cn.springcloud.gray.communication;
import cn.springcloud.gray.model.GrayInstance;
+import cn.springcloud.gray.model.GrayTrackDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.ParameterizedTypeReference;
@@ -78,4 +79,19 @@ public void serviceDownline(String instanceId) {
throw e;
}
}
+
+ @Override
+ public List getTrackDefinitions(String serviceId, String instanceId) {
+ String url = this.baseUrl + "/gray/trackDefinitions?serviceId={serviceId}&instanceId={instanceId}";
+ ParameterizedTypeReference> typeRef = new ParameterizedTypeReference>() {
+ };
+ try {
+ ResponseEntity> responseEntity =
+ rest.exchange(url, HttpMethod.GET, null, typeRef, serviceId, instanceId);
+ return responseEntity.getBody();
+ } catch (RuntimeException e) {
+ log.error("获取灰度追踪信息", e);
+ throw e;
+ }
+ }
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/communication/InformationClient.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/communication/InformationClient.java
index 0168b5df..6fe2c2cb 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/communication/InformationClient.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/communication/InformationClient.java
@@ -1,6 +1,7 @@
package cn.springcloud.gray.communication;
import cn.springcloud.gray.model.GrayInstance;
+import cn.springcloud.gray.model.GrayTrackDefinition;
import java.util.List;
@@ -43,4 +44,5 @@ public interface InformationClient {
*/
void serviceDownline(String instanceId);
+ List getTrackDefinitions(String serviceId, String instanceId);
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/communication/InformationClientDecorator.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/communication/InformationClientDecorator.java
index 4e8e8992..0a011e90 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/communication/InformationClientDecorator.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/communication/InformationClientDecorator.java
@@ -1,6 +1,7 @@
package cn.springcloud.gray.communication;
import cn.springcloud.gray.model.GrayInstance;
+import cn.springcloud.gray.model.GrayTrackDefinition;
import java.util.List;
@@ -12,10 +13,11 @@ public abstract class InformationClientDecorator implements InformationClient {
public enum RequestType {
- AddGrayInstance,
- ServiceDownline,
- AllGrayInstances,
- GetGrayInstance
+ ADD_GRAY_INSTANCE,
+ SERVICE_DOWNLINE,
+ ALL_GRAY_INSTANCES,
+ GET_GRAY_INSTANCE,
+ GET_TRACK_DEFINITIONS,
}
@@ -38,7 +40,7 @@ public GrayInstance execute(InformationClient delegate) {
@Override
public RequestType getRequestType() {
- return RequestType.GetGrayInstance;
+ return RequestType.GET_GRAY_INSTANCE;
}
});
}
@@ -53,7 +55,7 @@ public List execute(InformationClient delegate) {
@Override
public RequestType getRequestType() {
- return RequestType.AllGrayInstances;
+ return RequestType.ALL_GRAY_INSTANCES;
}
});
}
@@ -71,7 +73,7 @@ public Object execute(InformationClient delegate) {
@Override
public RequestType getRequestType() {
- return RequestType.AddGrayInstance;
+ return RequestType.ADD_GRAY_INSTANCE;
}
});
}
@@ -88,7 +90,22 @@ public Object execute(InformationClient delegate) {
@Override
public RequestType getRequestType() {
- return RequestType.ServiceDownline;
+ return RequestType.SERVICE_DOWNLINE;
+ }
+ });
+ }
+
+ @Override
+ public List getTrackDefinitions(String serviceId, String instanceId) {
+ return execute(new RequestExecutor>() {
+ @Override
+ public List execute(InformationClient delegate) {
+ return delegate.getTrackDefinitions(serviceId, instanceId);
+ }
+
+ @Override
+ public RequestType getRequestType() {
+ return RequestType.GET_TRACK_DEFINITIONS;
}
});
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/decision/factory/GrayDecisionFactory.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/decision/factory/GrayDecisionFactory.java
index aa5602fb..2a01bfe6 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/decision/factory/GrayDecisionFactory.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/decision/factory/GrayDecisionFactory.java
@@ -1,9 +1,7 @@
package cn.springcloud.gray.decision.factory;
import cn.springcloud.gray.decision.GrayDecision;
-import cn.springcloud.gray.model.DecisionDefinition;
import cn.springcloud.gray.utils.NameUtils;
-import org.springframework.beans.BeanUtils;
import java.util.function.Consumer;
@@ -14,7 +12,7 @@ public interface GrayDecisionFactory {
default String name() {
- return NameUtils.normalizeFilterFactoryName(getClass());
+ return NameUtils.normalizeDecisionFactoryName(getClass());
}
default C newConfig() {
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/event/DefaultGrayEventListener.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/event/DefaultGrayEventListener.java
index 68d06421..171324f7 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/event/DefaultGrayEventListener.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/event/DefaultGrayEventListener.java
@@ -1,19 +1,63 @@
package cn.springcloud.gray.event;
import cn.springcloud.gray.CommunicableGrayManager;
+import cn.springcloud.gray.InstanceLocalInfo;
+import cn.springcloud.gray.InstanceLocalInfoAware;
import cn.springcloud.gray.exceptions.EventException;
import cn.springcloud.gray.model.GrayInstance;
+import cn.springcloud.gray.model.GrayTrackDefinition;
+import cn.springcloud.gray.request.track.CommunicableGrayTrackHolder;
+import org.apache.commons.lang3.StringUtils;
-public class DefaultGrayEventListener implements GrayEventListener {
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.Consumer;
+
+public class DefaultGrayEventListener implements GrayEventListener, InstanceLocalInfoAware {
private CommunicableGrayManager grayManager;
+ private CommunicableGrayTrackHolder grayTrackHolder;
+ private InstanceLocalInfo instanceLocalInfo;
+
+ private Map> handers = new HashMap<>();
- public DefaultGrayEventListener(CommunicableGrayManager grayManager) {
+ public DefaultGrayEventListener(CommunicableGrayTrackHolder grayTrackHolder, CommunicableGrayManager grayManager) {
this.grayManager = grayManager;
+ initHandlers();
+ this.grayTrackHolder = grayTrackHolder;
}
@Override
public void onEvent(GrayEventMsg msg) throws EventException {
+ handleSource(msg);
+ }
+
+ private void handleSource(GrayEventMsg msg) {
+ Optional.ofNullable(getHandler(msg.getSourceType())).ifPresent(handler -> {
+ handler.accept(msg);
+ });
+ }
+
+
+ private Consumer getHandler(SourceType type) {
+ return handers.get(type);
+ }
+
+
+ private void initHandlers() {
+ putHandler(SourceType.GRAY_INSTANCE, this::handleGrayInstance)
+ .putHandler(SourceType.GRAY_TRACK, this::handleGrayTrack);
+ }
+
+ private DefaultGrayEventListener putHandler(SourceType sourceType, Consumer handler) {
+ handers.put(sourceType, handler);
+ return this;
+ }
+
+
+ private void handleGrayInstance(GrayEventMsg msg) {
switch (msg.getEventType()) {
case DOWN:
grayManager.closeGray(msg.getServiceId(), msg.getInstanceId());
@@ -23,4 +67,39 @@ public void onEvent(GrayEventMsg msg) throws EventException {
grayManager.updateGrayInstance(grayInstance);
}
}
+
+ private void handleGrayTrack(GrayEventMsg msg) {
+ if (!StringUtils.equals(msg.getServiceId(), instanceLocalInfo.getServiceId())) {
+ return;
+ }
+ if (StringUtils.isNotEmpty(msg.getInstanceId())
+ && !StringUtils.equals(msg.getInstanceId(), instanceLocalInfo.getInstanceId())) {
+ return;
+ }
+
+ GrayTrackDefinition definition = (GrayTrackDefinition) msg.getExtra();
+ if (definition == null) {
+ List definitions =
+ grayTrackHolder.getGrayInformationClient().getTrackDefinitions(msg.getServiceId(), msg.getInstanceId());
+ if (definitions != null) {
+ definitions.forEach(d -> {
+ grayTrackHolder.updateTrackDefinition(d);
+ });
+ }
+ } else {
+ switch (msg.getEventType()) {
+ case DOWN:
+ grayTrackHolder.deleteTrackDefinition(definition.getName());
+ case UPDATE:
+ grayTrackHolder.updateTrackDefinition(definition);
+ }
+ }
+
+
+ }
+
+ @Override
+ public void setInstanceLocalInfo(InstanceLocalInfo instanceLocalInfo) {
+ this.instanceLocalInfo = instanceLocalInfo;
+ }
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/request/GrayInfoTracker.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/request/GrayInfoTracker.java
index adae8aec..087b3d1a 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/request/GrayInfoTracker.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/request/GrayInfoTracker.java
@@ -1,16 +1,22 @@
package cn.springcloud.gray.request;
+import cn.springcloud.gray.utils.NameUtils;
import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
public interface GrayInfoTracker