diff --git a/README.md b/README.md
index 622e9016..e70186be 100644
--- a/README.md
+++ b/README.md
@@ -21,6 +21,7 @@
* spring-cloud-start-gray
* spring-cloud-start-gray-server
* [spring-cloud-gray-samples](spring-cloud-gray-samples/README.md)
+* [spring-cloud-gray-zookeeper-samples](spring-cloud-gray-zookeeper-samples/README.md)
#### maven 依赖
jar包已经上传到maven中央库,可以通过maven直接从中央库下载
diff --git a/pom.xml b/pom.xml
index d968e177..69cd894a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
cn.springcloud.gray
spring-cloud-gray
pom
- 1.0.2
+ 1.1.0
org.springframework.boot
spring-boot-starter-parent
@@ -27,6 +27,7 @@
spring-cloud-starter-gray
spring-cloud-starter-gray-server
spring-cloud-gray-samples
+ spring-cloud-gray-zookeeper-samples
diff --git a/spring-cloud-bamboo/pom.xml b/spring-cloud-bamboo/pom.xml
index d5f8483f..a731a9c0 100644
--- a/spring-cloud-bamboo/pom.xml
+++ b/spring-cloud-bamboo/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-gray-client/pom.xml b/spring-cloud-gray-client/pom.xml
index b579a55a..78b6e46b 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
- 1.0.2
+ 1.1.0
4.0.0
@@ -37,6 +37,11 @@
spring-cloud-starter-eureka
provided
+
+ org.springframework.cloud
+ spring-cloud-starter-zookeeper-discovery
+ provided
+
org.springframework.cloud
spring-cloud-starter-feign
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 e4602210..b3bab564 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
@@ -4,7 +4,6 @@
import cn.springcloud.bamboo.autoconfig.BambooAutoConfiguration;
import cn.springcloud.gray.DefaultGrayManager;
import cn.springcloud.gray.HttpInformationClient;
-import cn.springcloud.gray.InstanceLocalInfo;
import cn.springcloud.gray.RetryableInformationClient;
import cn.springcloud.gray.client.GrayClientInitializingBean;
import cn.springcloud.gray.client.GrayOptionalArgs;
@@ -13,8 +12,6 @@
import cn.springcloud.gray.core.GrayManager;
import cn.springcloud.gray.core.InformationClient;
import cn.springcloud.gray.decision.DefaultGrayDecisionFactory;
-import com.netflix.appinfo.EurekaInstanceConfig;
-import com.netflix.discovery.EurekaClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -52,18 +49,6 @@ public GrayClientInitializingBean grayClientInitializingBean() {
return new GrayClientInitializingBean();
}
-
- @Bean
- public InstanceLocalInfo instanceLocalInfo(@Autowired EurekaClient eurekaClient) {
- EurekaInstanceConfig instanceConfig = eurekaClient.getApplicationInfoManager().getEurekaInstanceConfig();
- InstanceLocalInfo localInfo = new InstanceLocalInfo();
- localInfo.setInstanceId(instanceConfig.getInstanceId());
- localInfo.setServiceId(instanceConfig.getAppname());
- localInfo.setGray(false);
- return localInfo;
- }
-
-
@Bean
@ConditionalOnMissingBean
public GrayDecisionFactory grayDecisionFactory() {
@@ -72,14 +57,16 @@ public GrayDecisionFactory grayDecisionFactory() {
@Configuration
- @ConditionalOnProperty(prefix = "gray.client", value = "information-client", havingValue = "http", matchIfMissing = true)
+ @ConditionalOnProperty(prefix = "gray.client", value = "information-client", havingValue = "http", matchIfMissing
+ = true)
public static class HttpGrayManagerClientConfiguration {
@Autowired
private GrayClientProperties grayClientProperties;
@Bean
public InformationClient informationClient() {
- InformationClient client = new HttpInformationClient(grayClientProperties.getServerUrl(), new RestTemplate());
+ InformationClient client = new HttpInformationClient(grayClientProperties.getServerUrl(), new
+ RestTemplate());
if (!grayClientProperties.isRetryable()) {
return client;
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientEurekaAutoConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientEurekaAutoConfiguration.java
new file mode 100644
index 00000000..200f7080
--- /dev/null
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientEurekaAutoConfiguration.java
@@ -0,0 +1,31 @@
+package cn.springcloud.gray.client.config;
+
+import cn.springcloud.gray.InstanceLocalInfo;
+import com.netflix.discovery.EurekaClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Author: duozl
+ * @Date: 2018/6/5 18:18
+ */
+@Configuration
+@ConditionalOnBean(EurekaClient.class)
+public class GrayClientEurekaAutoConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean
+ public InstanceLocalInfo instanceLocalInfo(@Autowired EurekaRegistration registration) {
+ String instanceId = registration.getInstanceConfig().getInstanceId();
+
+ InstanceLocalInfo localInfo = new InstanceLocalInfo();
+ localInfo.setInstanceId(instanceId);
+ localInfo.setServiceId(registration.getServiceId());
+ localInfo.setGray(false);
+ return localInfo;
+ }
+}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientZookeeperAutoConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientZookeeperAutoConfiguration.java
new file mode 100644
index 00000000..b3e29e9d
--- /dev/null
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientZookeeperAutoConfiguration.java
@@ -0,0 +1,43 @@
+package cn.springcloud.gray.client.config;
+
+import cn.springcloud.gray.InstanceLocalInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.cloud.client.serviceregistry.Registration;
+import org.springframework.cloud.zookeeper.discovery.ZookeeperDiscoveryProperties;
+import org.springframework.cloud.zookeeper.serviceregistry.ZookeeperRegistration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.naming.ConfigurationException;
+
+/**
+ * @Author: duozl
+ * @Date: 2018/6/5 18:18
+ */
+@Configuration
+@ConditionalOnBean(ZookeeperRegistration.class)
+public class GrayClientZookeeperAutoConfiguration {
+ private static final String METADATA_KEY_INSTANCE_ID = "instanceId";
+
+ @Bean
+ @ConditionalOnMissingBean
+ public InstanceLocalInfo instanceLocalInfo(@Autowired Registration registration,
+ @Autowired ZookeeperDiscoveryProperties properties)
+ throws ConfigurationException {
+ String instanceId;
+ if (properties.getMetadata().containsKey(METADATA_KEY_INSTANCE_ID)) {
+ instanceId = properties.getMetadata().get(METADATA_KEY_INSTANCE_ID);
+ } else {
+ throw new ConfigurationException("Unable to find config spring.cloud.zookeeper.discovery.metadata" +
+ ".instanceId!");
+ }
+
+ InstanceLocalInfo localInfo = new InstanceLocalInfo();
+ localInfo.setInstanceId(instanceId);
+ localInfo.setServiceId(registration.getServiceId());
+ localInfo.setGray(false);
+ return localInfo;
+ }
+}
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 47104f19..6a03ac86 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
@@ -86,9 +86,10 @@ public void setRetryNumberOfRetries(int retryNumberOfRetries) {
*/
public class InstanceConfig {
- private boolean grayEnroll;
+ private boolean grayEnroll = false;
private int grayEnrollDealyTimeInMs = 40000;
private boolean useMultiVersion = false;
+ private String instanceId;
public boolean isGrayEnroll() {
return grayEnroll;
@@ -118,5 +119,13 @@ public boolean isUseMultiVersion() {
public void setUseMultiVersion(boolean useMultiVersion) {
this.useMultiVersion = useMultiVersion;
}
+
+ public String getInstanceId() {
+ return instanceId;
+ }
+
+ public void setInstanceId(String instanceId) {
+ this.instanceId = instanceId;
+ }
}
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/ribbon/GrayDecisionPredicate.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/ribbon/GrayDecisionPredicate.java
index 473213b8..a0b1e014 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/ribbon/GrayDecisionPredicate.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/ribbon/GrayDecisionPredicate.java
@@ -1,13 +1,16 @@
package cn.springcloud.gray.ribbon;
+import cn.springcloud.bamboo.BambooAppContext;
import cn.springcloud.bamboo.BambooRequest;
import cn.springcloud.bamboo.BambooRequestContext;
import cn.springcloud.gray.core.GrayDecision;
+import cn.springcloud.gray.utils.ServiceUtil;
import com.netflix.loadbalancer.AbstractServerPredicate;
import com.netflix.loadbalancer.PredicateKey;
-import com.netflix.niws.loadbalancer.DiscoveryEnabledServer;
+import com.netflix.loadbalancer.Server;
import java.util.List;
+import java.util.Map;
public class GrayDecisionPredicate extends AbstractServerPredicate {
@@ -21,10 +24,14 @@ public boolean apply(PredicateKey input) {
if (bambooRequestContext == null || bambooRequestContext.getBambooRequest() == null) {
return false;
}
- DiscoveryEnabledServer server = (DiscoveryEnabledServer) input.getServer();
BambooRequest bambooRequest = bambooRequestContext.getBambooRequest();
+ Server server = input.getServer();
+ String serviceId = bambooRequest.getServiceId();
+ Map serverMetadata = getServerMetadata(serviceId, server);
+ String instanceId = ServiceUtil.getInstanceId(server, serverMetadata);
+
List grayDecisions =
- getIRule().getGrayManager().grayDecision(bambooRequest.getServiceId(), server.getInstanceInfo().getInstanceId());
+ getIRule().getGrayManager().grayDecision(serviceId, instanceId);
for (GrayDecision grayDecision : grayDecisions) {
if (grayDecision.test(bambooRequest)) {
return true;
@@ -38,5 +45,7 @@ protected GrayLoadBalanceRule getIRule() {
return (GrayLoadBalanceRule) this.rule;
}
-
+ public Map getServerMetadata(String serviceId, Server server) {
+ return BambooAppContext.getEurekaServerExtractor().getServerMetadata(serviceId, server);
+ }
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/ribbon/GrayLoadBalanceRule.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/ribbon/GrayLoadBalanceRule.java
index 031d208b..cca1bc77 100644
--- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/ribbon/GrayLoadBalanceRule.java
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/ribbon/GrayLoadBalanceRule.java
@@ -1,21 +1,20 @@
package cn.springcloud.gray.ribbon;
+import cn.springcloud.bamboo.BambooAppContext;
import cn.springcloud.bamboo.BambooRequestContext;
import cn.springcloud.bamboo.ribbon.loadbalancer.BambooZoneAvoidanceRule;
import cn.springcloud.gray.client.GrayClientAppContext;
import cn.springcloud.gray.client.config.properties.GrayClientProperties;
import cn.springcloud.gray.core.GrayManager;
import cn.springcloud.gray.core.GrayService;
+import cn.springcloud.gray.utils.ServiceUtil;
import com.google.common.base.Optional;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.*;
-import com.netflix.niws.loadbalancer.DiscoveryEnabledServer;
import java.util.ArrayList;
import java.util.List;
-
-import static cn.springcloud.gray.client.GrayClientAppContext.getGrayClientProperties;
-
+import java.util.Map;
/**
* 灰度发布的负载规则
@@ -49,14 +48,16 @@ protected void init(){
public Server choose(Object key) {
ILoadBalancer lb = getLoadBalancer();
BambooRequestContext requestContext = BambooRequestContext.currentRequestCentxt();
- if (requestContext != null && getGrayManager().isOpen(requestContext.getServiceId())) {
- GrayService grayService = getGrayManager().grayService(requestContext.getServiceId());
+ String serviceId = requestContext.getServiceId();
+ if (requestContext != null && getGrayManager().isOpen(serviceId)) {
+ GrayService grayService = getGrayManager().grayService(serviceId);
List servers = lb.getAllServers();
List grayServers = new ArrayList<>(grayService.getGrayInstances().size());
List normalServers = new ArrayList<>(servers.size() - grayService.getGrayInstances().size());
for (Server server : servers) {
- DiscoveryEnabledServer disServer = (DiscoveryEnabledServer) server;
- if (grayService.getGrayInstance(disServer.getInstanceInfo().getInstanceId()) != null) {
+ Map serverMetadata = getServerMetadata(serviceId, server);
+ String instanceId = ServiceUtil.getInstanceId(server, serverMetadata);
+ if (grayService.getGrayInstance(instanceId) != null) {
grayServers.add(server);
} else {
normalServers.add(server);
@@ -101,8 +102,11 @@ private Server choose(AbstractServerPredicate serverPredicate, List serv
}
}
-
public GrayManager getGrayManager() {
return GrayClientAppContext.getGrayManager();
}
+
+ public static Map getServerMetadata(String serviceId, Server server) {
+ return BambooAppContext.getEurekaServerExtractor().getServerMetadata(serviceId, server);
+ }
}
diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/utils/ServiceUtil.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/utils/ServiceUtil.java
new file mode 100644
index 00000000..87b783cf
--- /dev/null
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/utils/ServiceUtil.java
@@ -0,0 +1,30 @@
+package cn.springcloud.gray.utils;
+
+import com.netflix.loadbalancer.Server;
+import org.springframework.cloud.zookeeper.discovery.ZookeeperServer;
+
+import java.util.Map;
+
+/**
+ * @Author: duozl
+ * @Date: 2018/6/5 15:56
+ */
+public class ServiceUtil {
+ private static final String METADATA_KEY_INSTANCE_ID = "instanceId";
+
+ public static String getInstanceId(Server server, Map serverMetadata) {
+ try {
+ if (server instanceof ZookeeperServer) {
+ if (serverMetadata.containsKey(METADATA_KEY_INSTANCE_ID)) {
+ return serverMetadata.get(METADATA_KEY_INSTANCE_ID);
+ } else {
+ throw new IllegalStateException("Unable to find config spring.cloud.zookeeper.discovery.metadata" +
+ ".instanceId!");
+ }
+ }
+ } catch (Throwable e) {
+ // do nothing,可能是类找不到等原因,如果引入了zookeeper的依赖,这个不会找不到
+ }
+ return server.getMetaInfo().getInstanceId();
+ }
+}
diff --git a/spring-cloud-gray-core/pom.xml b/spring-cloud-gray-core/pom.xml
index af58e5d1..ceee4fc9 100644
--- a/spring-cloud-gray-core/pom.xml
+++ b/spring-cloud-gray-core/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-gray-dependencies/pom.xml b/spring-cloud-gray-dependencies/pom.xml
index 1cabdb9f..b1c86fba 100644
--- a/spring-cloud-gray-dependencies/pom.xml
+++ b/spring-cloud-gray-dependencies/pom.xml
@@ -17,7 +17,7 @@
cn.springcloud.gray
spring-cloud-gray-dependencies
- 1.0.2
+ 1.1.0
pom
diff --git a/spring-cloud-gray-samples/pom.xml b/spring-cloud-gray-samples/pom.xml
index 482d3672..031c7a4b 100644
--- a/spring-cloud-gray-samples/pom.xml
+++ b/spring-cloud-gray-samples/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-gray-samples/spring-cloud-gray-eureka-sample/pom.xml b/spring-cloud-gray-samples/spring-cloud-gray-eureka-sample/pom.xml
index ae3e9a18..12881dd1 100644
--- a/spring-cloud-gray-samples/spring-cloud-gray-eureka-sample/pom.xml
+++ b/spring-cloud-gray-samples/spring-cloud-gray-eureka-sample/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray-samples
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-gray-samples/spring-cloud-gray-server-sample/pom.xml b/spring-cloud-gray-samples/spring-cloud-gray-server-sample/pom.xml
index 20d7cccb..0b691402 100644
--- a/spring-cloud-gray-samples/spring-cloud-gray-server-sample/pom.xml
+++ b/spring-cloud-gray-samples/spring-cloud-gray-server-sample/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray-samples
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-gray-samples/spring-cloud-gray-service-a-sample/pom.xml b/spring-cloud-gray-samples/spring-cloud-gray-service-a-sample/pom.xml
index a60206d5..dc691100 100644
--- a/spring-cloud-gray-samples/spring-cloud-gray-service-a-sample/pom.xml
+++ b/spring-cloud-gray-samples/spring-cloud-gray-service-a-sample/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray-samples
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-gray-samples/spring-cloud-gray-service-a-sample/src/main/resources/config/application.yml b/spring-cloud-gray-samples/spring-cloud-gray-service-a-sample/src/main/resources/config/application.yml
index c073fe40..041284fe 100644
--- a/spring-cloud-gray-samples/spring-cloud-gray-service-a-sample/src/main/resources/config/application.yml
+++ b/spring-cloud-gray-samples/spring-cloud-gray-service-a-sample/src/main/resources/config/application.yml
@@ -2,7 +2,7 @@ spring:
application:
name: service-a
server:
- port: 20101
+ port: 20103
eureka:
client:
register-with-eureka: true
@@ -14,5 +14,5 @@ eureka:
gray:
client:
instance:
- grayEnroll: false #是否在启动后自动注册成灰度实例
+ grayEnroll: true #是否在启动后自动注册成灰度实例
serverUrl: http://localhost:20202 #灰度服务端的url
\ No newline at end of file
diff --git a/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/pom.xml b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/pom.xml
index 18891bc7..d209b29b 100644
--- a/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/pom.xml
+++ b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray-samples
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/pom.xml b/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/pom.xml
index d5b12ec6..4fab81b0 100644
--- a/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/pom.xml
+++ b/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray-samples
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-gray-server/pom.xml b/spring-cloud-gray-server/pom.xml
index b794c0cf..1bef468a 100644
--- a/spring-cloud-gray-server/pom.xml
+++ b/spring-cloud-gray-server/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
@@ -33,7 +33,11 @@
spring-cloud-starter-eureka
provided
-
+
+ org.springframework.cloud
+ spring-cloud-starter-zookeeper-discovery
+ provided
+
org.springframework.cloud
spring-cloud-netflix-core
diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/DefaultGrayServiceManager.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/DefaultGrayServiceManager.java
index 33dd1459..bff86b86 100644
--- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/DefaultGrayServiceManager.java
+++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/DefaultGrayServiceManager.java
@@ -27,6 +27,7 @@ public DefaultGrayServiceManager(GrayServerConfig config) {
@Override
public void addGrayInstance(GrayInstance instance) {
+
GrayService grayService = grayServiceMap.get(instance.getServiceId());
lock.lock();
try {
diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/ZookeeperGrayServerEvictor.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/ZookeeperGrayServerEvictor.java
new file mode 100644
index 00000000..4b4d4288
--- /dev/null
+++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/ZookeeperGrayServerEvictor.java
@@ -0,0 +1,54 @@
+package cn.springcloud.gray.server;
+
+import cn.springcloud.gray.core.GrayInstance;
+import cn.springcloud.gray.core.GrayService;
+import cn.springcloud.gray.core.GrayServiceManager;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+
+import java.util.Collection;
+import java.util.List;
+
+
+/**
+ * 依赖EurekaClient来检查服务实例是否下线
+ */
+public class ZookeeperGrayServerEvictor implements GrayServerEvictor {
+
+ private DiscoveryClient discoveryClient;
+
+ public ZookeeperGrayServerEvictor(DiscoveryClient discoveryClient) {
+ this.discoveryClient = discoveryClient;
+ }
+
+ @Override
+ public void evict(GrayServiceManager serviceManager) {
+ Collection grayServices = serviceManager.allGrayService();
+ grayServices.forEach(grayService -> {
+ grayService.getGrayInstances().forEach(grayInstance -> {
+ evict(serviceManager, grayInstance);
+ });
+ });
+
+ }
+
+
+ private void evict(GrayServiceManager serviceManager, GrayInstance grayInstance) {
+ if (isDownline(grayInstance)) {
+ serviceManager.deleteGrayInstance(grayInstance.getServiceId(), grayInstance.getInstanceId());
+ }
+ }
+
+
+ private boolean isDownline(GrayInstance grayInstance) {
+ String serviceId = grayInstance.getServiceId();
+ String instanceId = grayInstance.getInstanceId();
+ List instances = discoveryClient.getInstances(serviceId);
+ if (null == instances || instances.isEmpty()) {
+ return true;
+ }
+
+ return instances.stream()
+ .anyMatch(instance -> instanceId.equals(instance.getHost() + ":" + instance.getPort()));
+ }
+}
diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/config/GrayServerAutoConfiguration.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/config/GrayServerAutoConfiguration.java
index da70220f..e6060c20 100644
--- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/config/GrayServerAutoConfiguration.java
+++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/config/GrayServerAutoConfiguration.java
@@ -1,9 +1,10 @@
package cn.springcloud.gray.server.config;
import cn.springcloud.bamboo.BambooConstants;
-import cn.springcloud.gray.server.*;
+import cn.springcloud.gray.server.DefaultGrayServiceManager;
+import cn.springcloud.gray.server.GrayServerConfig;
+import cn.springcloud.gray.server.GrayServerInitializingBean;
import cn.springcloud.gray.server.config.properties.GrayServerConfigBean;
-import com.netflix.discovery.EurekaClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -15,7 +16,7 @@
@Configuration
@EnableConfigurationProperties({GrayServerConfigBean.class})
-@Import(WebConfiguration.class)
+@Import(value = {WebConfiguration.class})
@ConditionalOnBean(GrayServerMarkerConfiguration.GrayServerMarker.class)
public class GrayServerAutoConfiguration {
@@ -36,10 +37,9 @@ public GrayServerInitializingBean grayServerInitializingBean() {
}
- @Bean
- @ConditionalOnMissingBean
- public GrayServerEvictor grayServerEvictor(@Autowired(required = false) EurekaClient eurekaClient) {
- return eurekaClient == null ? NoActionGrayServerEvictor.INSTANCE : new EurekaGrayServerEvictor(eurekaClient);
- }
-
+// @Bean
+// @ConditionalOnMissingBean
+// public GrayServerEvictor grayServerEvictor(@Autowired(required = false) EurekaClient eurekaClient) {
+// return eurekaClient == null ? NoActionGrayServerEvictor.INSTANCE : new EurekaGrayServerEvictor(eurekaClient);
+// }
}
diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/config/GrayServiceEurekaAutoConfiguration.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/config/GrayServiceEurekaAutoConfiguration.java
new file mode 100644
index 00000000..f942d070
--- /dev/null
+++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/config/GrayServiceEurekaAutoConfiguration.java
@@ -0,0 +1,47 @@
+package cn.springcloud.gray.server.config;
+
+/**
+ * @Author: duozl
+ * @Date: 2018/6/4 18:59
+ */
+
+import cn.springcloud.gray.core.GrayServiceManager;
+import cn.springcloud.gray.server.EurekaGrayServerEvictor;
+import cn.springcloud.gray.server.GrayServerEvictor;
+import cn.springcloud.gray.server.service.AbstractGrayService;
+import cn.springcloud.gray.server.service.EurekaGrayService;
+import com.netflix.discovery.EurekaClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConditionalOnBean(EurekaClient.class)
+public class GrayServiceEurekaAutoConfiguration {
+
+ private final EurekaClient eurekaClient;
+ private final DiscoveryClient discoveryClient;
+ private final GrayServiceManager grayServiceManager;
+
+ @Autowired
+ public GrayServiceEurekaAutoConfiguration(EurekaClient eurekaClient, DiscoveryClient discoveryClient,
+ GrayServiceManager grayServiceManager) {
+ this.eurekaClient = eurekaClient;
+ this.discoveryClient = discoveryClient;
+ this.grayServiceManager = grayServiceManager;
+ }
+
+ @Bean
+ public AbstractGrayService grayService() {
+ return new EurekaGrayService(eurekaClient, discoveryClient, grayServiceManager);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public GrayServerEvictor grayServerEvictor() {
+ return new EurekaGrayServerEvictor(eurekaClient);
+ }
+}
diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/config/GrayServiceZookeeperAutoConfiguration.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/config/GrayServiceZookeeperAutoConfiguration.java
new file mode 100644
index 00000000..fc62dc79
--- /dev/null
+++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/config/GrayServiceZookeeperAutoConfiguration.java
@@ -0,0 +1,44 @@
+package cn.springcloud.gray.server.config;
+
+import cn.springcloud.gray.core.GrayServiceManager;
+import cn.springcloud.gray.server.GrayServerEvictor;
+import cn.springcloud.gray.server.ZookeeperGrayServerEvictor;
+import cn.springcloud.gray.server.service.AbstractGrayService;
+import cn.springcloud.gray.server.service.ZookeeperGrayService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.cloud.zookeeper.serviceregistry.ZookeeperRegistration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Author: duozl
+ * @Date: 2018/6/4 18:59
+ */
+@Configuration
+@ConditionalOnBean(ZookeeperRegistration.class)
+public class GrayServiceZookeeperAutoConfiguration {
+
+ private final DiscoveryClient discoveryClient;
+ private final GrayServiceManager grayServiceManager;
+
+ @Autowired
+ public GrayServiceZookeeperAutoConfiguration(DiscoveryClient discoveryClient,
+ GrayServiceManager grayServiceManager) {
+ this.discoveryClient = discoveryClient;
+ this.grayServiceManager = grayServiceManager;
+ }
+
+ @Bean
+ public AbstractGrayService grayService() {
+ return new ZookeeperGrayService(discoveryClient, grayServiceManager);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public GrayServerEvictor grayServerEvictor() {
+ return new ZookeeperGrayServerEvictor(discoveryClient);
+ }
+}
diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/resources/rest/ServiceGrayResouce.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/resources/rest/ServiceGrayResouce.java
index 4d3aac90..5d64ae0c 100644
--- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/resources/rest/ServiceGrayResouce.java
+++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/resources/rest/ServiceGrayResouce.java
@@ -1,25 +1,16 @@
package cn.springcloud.gray.server.resources.rest;
-import cn.springcloud.gray.core.GrayInstance;
-import cn.springcloud.gray.core.GrayPolicyGroup;
-import cn.springcloud.gray.core.GrayService;
-import cn.springcloud.gray.core.GrayServiceManager;
import cn.springcloud.gray.server.resources.domain.fo.GrayPolicyGroupFO;
import cn.springcloud.gray.server.resources.domain.vo.GrayInstanceVO;
import cn.springcloud.gray.server.resources.domain.vo.GrayPolicyGroupVO;
import cn.springcloud.gray.server.resources.domain.vo.GrayServiceVO;
-import com.netflix.appinfo.InstanceInfo;
-import com.netflix.discovery.EurekaClient;
-import com.netflix.discovery.shared.Application;
+import cn.springcloud.gray.server.service.AbstractGrayService;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.client.serviceregistry.Registration;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
-import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
@RestController
@@ -27,13 +18,7 @@
public class ServiceGrayResouce {
@Autowired
- private Registration registration;
- @Autowired
- private EurekaClient eurekaClient;
- @Autowired
- private org.springframework.cloud.client.discovery.DiscoveryClient discoveryClient;
- @Autowired
- private GrayServiceManager grayServiceManager;
+ private AbstractGrayService grayService;
/**
@@ -43,23 +28,7 @@ public class ServiceGrayResouce {
*/
@RequestMapping(value = "/services", method = RequestMethod.GET)
public ResponseEntity> services() {
- List serviceIds = discoveryClient.getServices();
-// List apps = eurekaClient.getApplications().getRegisteredApplications();
- List services = new ArrayList<>(serviceIds.size());
- for (String serviceId : serviceIds) {
- GrayServiceVO vo = new GrayServiceVO();
- vo.setServiceId(serviceId);
- Application app = eurekaClient.getApplication(serviceId);
- vo.setAppName(app.getName());
- vo.setInstanceSize(app.getInstances().size());
- GrayService grayService = grayServiceManager.getGrayService(serviceId);
- if (grayService != null) {
- vo.setHasGrayInstances(grayService.isOpenGray());
- vo.setHasGrayPolicies(grayService.hasGrayPolicy());
- }
- services.add(vo);
- }
- return ResponseEntity.ok(services);
+ return grayService.services();
}
@@ -71,24 +40,7 @@ public ResponseEntity> services() {
*/
@RequestMapping(value = "/services/{serviceId}/instances", method = RequestMethod.GET)
public ResponseEntity> instances(@PathVariable("serviceId") String serviceId) {
- List list = new ArrayList<>();
- Application app = eurekaClient.getApplication(serviceId);
- List instanceInfos = app.getInstances();
- for (InstanceInfo instanceInfo : instanceInfos) {
- GrayInstanceVO vo = new GrayInstanceVO();
- vo.setAppName(app.getName());
- vo.setServiceId(serviceId);
- vo.setInstanceId(instanceInfo.getInstanceId());
- vo.setMetadata(instanceInfo.getMetadata());
- vo.setUrl(instanceInfo.getHomePageUrl());
- GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceInfo.getInstanceId());
- if (grayInstance != null) {
- vo.setOpenGray(grayInstance.isOpenGray());
- vo.setHasGrayPolicies(grayInstance.hasGrayPolicy());
- }
- list.add(vo);
- }
- return ResponseEntity.ok(list);
+ return grayService.instances(serviceId);
}
@@ -98,60 +50,37 @@ public ResponseEntity editInstanceStatus(
@PathVariable("serviceId") String serviceId,
@RequestParam("instanceId") String instanceId,
@ApiParam("0:关闭, 1:启用") @PathVariable("status") int status) {
-
- return grayServiceManager.updateInstanceStatus(serviceId, instanceId, status)
- ? ResponseEntity.ok().build() : ResponseEntity.badRequest().build();
+ return grayService.editInstanceStatus(serviceId, instanceId, status);
}
/**
* 服务实例的所有灰度策略组
*
- * @param serviceId 服务id
+ * @param serviceId 服务id
* @param instanceId 实例id
* @return 灰策略组VO列表
*/
@RequestMapping(value = "/services/{serviceId}/instance/policyGroups", method = RequestMethod.GET)
public ResponseEntity> policyGroups(@PathVariable("serviceId") String serviceId,
@RequestParam("instanceId") String instanceId) {
-
- Application app = eurekaClient.getApplication(serviceId);
- InstanceInfo instanceInfo = app.getByInstanceId(instanceId);
- GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceId);
- if (grayInstance != null && grayInstance.getGrayPolicyGroups() != null) {
- List policyGroups = grayInstance.getGrayPolicyGroups();
- List vos = new ArrayList<>(policyGroups.size());
- for (GrayPolicyGroup policyGroup : policyGroups) {
- vos.add(getPolicyGroup(serviceId, instanceInfo, policyGroup));
- }
- return ResponseEntity.ok(vos);
- }
- return ResponseEntity.ok(Collections.emptyList());
+ return grayService.policyGroups(serviceId, instanceId);
}
/**
* 灰度策略组
*
- * @param serviceId 服务id
+ * @param serviceId 服务id
* @param instanceId 实例id
- * @param groupId 灰度策略组id
+ * @param groupId 灰度策略组id
* @return 灰度策略组VO
*/
@RequestMapping(value = "/services/{serviceId}/instance/policyGroup/{groupId}", method = RequestMethod.GET)
public ResponseEntity policyGroup(@PathVariable("serviceId") String serviceId,
@RequestParam("instanceId") String instanceId,
@PathVariable("groupId") String groupId) {
- Application app = eurekaClient.getApplication(serviceId);
- InstanceInfo instanceInfo = app.getByInstanceId(instanceId);
- GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceId);
- if (grayInstance != null) {
- GrayPolicyGroup policyGroup = grayInstance.getGrayPolicyGroup(groupId);
- if (policyGroup != null) {
- return ResponseEntity.ok(getPolicyGroup(serviceId, instanceInfo, policyGroup));
- }
- }
- return ResponseEntity.ok().build();
+ return grayService.policyGroup(serviceId, instanceId, groupId);
}
@@ -161,17 +90,14 @@ public ResponseEntity editPolicyGroupStatus(@PathVariable("serviceId") Str
@RequestParam("instanceId") String instanceId,
@PathVariable("groupId") String groupId,
@ApiParam("0:关闭, 1:启用") @PathVariable("status") int enable) {
-
- return grayServiceManager.updatePolicyGroupStatus(serviceId, instanceId, groupId, enable)
- ? ResponseEntity.ok().build() :
- ResponseEntity.badRequest().build();
+ return grayService.editPolicyGroupStatus(serviceId, instanceId, groupId, enable);
}
/**
* 添加策略组
*
- * @param serviceId 服务id
+ * @param serviceId 服务id
* @param policyGroupFO 灰度策略组FO
* @return Void
*/
@@ -179,26 +105,15 @@ public ResponseEntity editPolicyGroupStatus(@PathVariable("serviceId") Str
public ResponseEntity policyGroup(
@PathVariable("serviceId") String serviceId,
@RequestBody GrayPolicyGroupFO policyGroupFO) {
- GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, policyGroupFO.getInstanceId());
- if (grayInstance == null) {
- grayInstance = new GrayInstance();
- grayInstance.setServiceId(serviceId);
- grayInstance.setInstanceId(policyGroupFO.getInstanceId());
- grayServiceManager.addGrayInstance(grayInstance);
- grayInstance = grayServiceManager.getGrayInstane(serviceId, policyGroupFO.getInstanceId());
- }
-
- grayInstance.addGrayPolicyGroup(policyGroupFO.toGrayPolicyGroup());
-
- return ResponseEntity.ok().build();
+ return grayService.policyGroup(serviceId, policyGroupFO);
}
/**
* 删除策略组
*
- * @param serviceId 服务id
- * @param instanceId 实例id
+ * @param serviceId 服务id
+ * @param instanceId 实例id
* @param policyGroupId 灰度策略组id
* @return Void
*/
@@ -208,29 +123,6 @@ public ResponseEntity delPolicyGroup(
@PathVariable("serviceId") String serviceId,
@RequestParam("instanceId") String instanceId,
@RequestParam("groupId") String policyGroupId) {
- GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceId);
- if (grayInstance != null) {
- if (grayInstance.removeGrayPolicyGroup(policyGroupId) != null && grayInstance.getGrayPolicyGroups().isEmpty()) {
- grayServiceManager.deleteGrayInstance(serviceId, instanceId);
- }
- }
-
- return ResponseEntity.ok().build();
+ return grayService.delPolicyGroup(serviceId, instanceId, policyGroupId);
}
-
-
- private GrayPolicyGroupVO getPolicyGroup(
- String serviceId, InstanceInfo instanceInfo, GrayPolicyGroup policyGroup) {
- GrayPolicyGroupVO vo = new GrayPolicyGroupVO();
- vo.setAppName(instanceInfo.getAppName());
- vo.setInstanceId(instanceInfo.getInstanceId());
- vo.setServiceId(serviceId);
- vo.setUrl(instanceInfo.getHomePageUrl());
- vo.setAlias(policyGroup.getAlias());
- vo.setPolicyGroupId(policyGroup.getPolicyGroupId());
- vo.setPolicies(policyGroup.getList());
- vo.setEnable(policyGroup.isEnable());
- return vo;
- }
-
}
diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/AbstractGrayService.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/AbstractGrayService.java
new file mode 100644
index 00000000..cb1999e5
--- /dev/null
+++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/AbstractGrayService.java
@@ -0,0 +1,157 @@
+package cn.springcloud.gray.server.service;
+
+import cn.springcloud.gray.core.GrayInstance;
+import cn.springcloud.gray.core.GrayPolicyGroup;
+import cn.springcloud.gray.core.GrayService;
+import cn.springcloud.gray.core.GrayServiceManager;
+import cn.springcloud.gray.server.resources.domain.fo.GrayPolicyGroupFO;
+import cn.springcloud.gray.server.resources.domain.vo.GrayInstanceVO;
+import cn.springcloud.gray.server.resources.domain.vo.GrayPolicyGroupVO;
+import cn.springcloud.gray.server.resources.domain.vo.GrayServiceVO;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.http.ResponseEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class AbstractGrayService {
+
+ private GrayServiceManager grayServiceManager;
+ private DiscoveryClient discoveryClient;
+
+ public AbstractGrayService(GrayServiceManager grayServiceManager, DiscoveryClient discoveryClient) {
+ this.grayServiceManager = grayServiceManager;
+ this.discoveryClient = discoveryClient;
+ }
+
+ /**
+ * 返回所有服务
+ *
+ * @return 灰度服务VO集合
+ */
+ public ResponseEntity> services() {
+ List serviceIds = discoveryClient.getServices();
+ List services = new ArrayList<>(serviceIds.size());
+ for (String serviceId : serviceIds) {
+ List instances = discoveryClient.getInstances(serviceId);
+ if (null == instances || instances.isEmpty()) {
+ continue;
+ }
+ GrayServiceVO vo = new GrayServiceVO();
+ vo.setServiceId(serviceId);
+ vo.setAppName(serviceId);
+ vo.setInstanceSize(instances.size());
+ GrayService grayService = grayServiceManager.getGrayService(serviceId);
+ if (grayService != null) {
+ vo.setHasGrayInstances(grayService.isOpenGray());
+ vo.setHasGrayPolicies(grayService.hasGrayPolicy());
+ }
+ services.add(vo);
+ }
+ return ResponseEntity.ok(services);
+ }
+
+ /**
+ * 返回服务实例列表
+ *
+ * @param serviceId 服务id
+ * @return 灰度服务实例VO列表
+ */
+ public abstract ResponseEntity> instances(String serviceId);
+
+ public ResponseEntity editInstanceStatus(String serviceId, String instanceId, int status) {
+
+ return grayServiceManager.updateInstanceStatus(serviceId, instanceId, status)
+ ? ResponseEntity.ok().build() : ResponseEntity.badRequest().build();
+ }
+
+
+ /**
+ * 服务实例的所有灰度策略组
+ *
+ * @param serviceId 服务id
+ * @param instanceId 实例id
+ * @return 灰策略组VO列表
+ */
+ public abstract ResponseEntity> policyGroups(String serviceId, String instanceId);
+
+
+ /**
+ * 灰度策略组
+ *
+ * @param serviceId 服务id
+ * @param instanceId 实例id
+ * @param groupId 灰度策略组id
+ * @return 灰度策略组VO
+ */
+ public abstract ResponseEntity policyGroup(String serviceId, String instanceId, String groupId);
+
+
+ public ResponseEntity editPolicyGroupStatus(String serviceId, String instanceId, String groupId, int enable) {
+
+ return grayServiceManager.updatePolicyGroupStatus(serviceId, instanceId, groupId, enable)
+ ? ResponseEntity.ok().build() :
+ ResponseEntity.badRequest().build();
+ }
+
+
+ /**
+ * 添加策略组
+ *
+ * @param serviceId 服务id
+ * @param policyGroupFO 灰度策略组FO
+ * @return Void
+ */
+ public ResponseEntity policyGroup(String serviceId, GrayPolicyGroupFO policyGroupFO) {
+ GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, policyGroupFO.getInstanceId());
+ if (grayInstance == null) {
+ grayInstance = new GrayInstance();
+ grayInstance.setServiceId(serviceId);
+ grayInstance.setInstanceId(policyGroupFO.getInstanceId());
+ grayServiceManager.addGrayInstance(grayInstance);
+ grayInstance = grayServiceManager.getGrayInstane(serviceId, policyGroupFO.getInstanceId());
+ }
+
+ grayInstance.addGrayPolicyGroup(policyGroupFO.toGrayPolicyGroup());
+
+ return ResponseEntity.ok().build();
+ }
+
+
+ /**
+ * 删除策略组
+ *
+ * @param serviceId 服务id
+ * @param instanceId 实例id
+ * @param policyGroupId 灰度策略组id
+ * @return Void
+ */
+ public ResponseEntity delPolicyGroup(String serviceId, String instanceId, String policyGroupId) {
+ GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceId);
+ if (grayInstance != null) {
+ if (grayInstance.removeGrayPolicyGroup(policyGroupId) != null && grayInstance.getGrayPolicyGroups()
+ .isEmpty()) {
+ grayServiceManager.deleteGrayInstance(serviceId, instanceId);
+ }
+ }
+
+ return ResponseEntity.ok().build();
+ }
+
+
+ protected GrayPolicyGroupVO getPolicyGroup(String serviceId, String appName, String instanceId, String homePageUrl,
+ GrayPolicyGroup policyGroup) {
+ GrayPolicyGroupVO vo = new GrayPolicyGroupVO();
+ vo.setAppName(appName);
+ vo.setInstanceId(instanceId);
+ vo.setServiceId(serviceId);
+ vo.setUrl(homePageUrl);
+ vo.setAlias(policyGroup.getAlias());
+ vo.setPolicyGroupId(policyGroup.getPolicyGroupId());
+ vo.setPolicies(policyGroup.getList());
+ vo.setEnable(policyGroup.isEnable());
+ return vo;
+ }
+
+}
diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/EurekaGrayService.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/EurekaGrayService.java
new file mode 100644
index 00000000..e36ecfad
--- /dev/null
+++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/EurekaGrayService.java
@@ -0,0 +1,117 @@
+package cn.springcloud.gray.server.service;
+
+import cn.springcloud.gray.core.GrayInstance;
+import cn.springcloud.gray.core.GrayPolicyGroup;
+import cn.springcloud.gray.core.GrayServiceManager;
+import cn.springcloud.gray.server.resources.domain.vo.GrayInstanceVO;
+import cn.springcloud.gray.server.resources.domain.vo.GrayPolicyGroupVO;
+import com.netflix.appinfo.InstanceInfo;
+import com.netflix.discovery.EurekaClient;
+import com.netflix.discovery.shared.Application;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Service
+@ConditionalOnBean(EurekaClient.class)
+public class EurekaGrayService extends AbstractGrayService {
+
+ private final EurekaClient eurekaClient;
+ private final DiscoveryClient discoveryClient;
+ private final GrayServiceManager grayServiceManager;
+
+ @Autowired
+ public EurekaGrayService(EurekaClient eurekaClient, DiscoveryClient discoveryClient, GrayServiceManager
+ grayServiceManager) {
+ super(grayServiceManager, discoveryClient);
+ this.eurekaClient = eurekaClient;
+ this.discoveryClient = discoveryClient;
+ this.grayServiceManager = grayServiceManager;
+ }
+
+ /**
+ * 返回服务实例列表
+ *
+ * @param serviceId 服务id
+ * @return 灰度服务实例VO列表
+ */
+ @Override
+ public ResponseEntity> instances(String serviceId) {
+ List list = new ArrayList<>();
+ Application app = eurekaClient.getApplication(serviceId);
+ List instanceInfos = app.getInstances();
+ for (InstanceInfo instanceInfo : instanceInfos) {
+ GrayInstanceVO vo = new GrayInstanceVO();
+ vo.setAppName(app.getName());
+ vo.setServiceId(serviceId);
+ vo.setInstanceId(instanceInfo.getInstanceId());
+ vo.setMetadata(instanceInfo.getMetadata());
+ vo.setUrl(instanceInfo.getHomePageUrl());
+ GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceInfo.getInstanceId());
+ if (grayInstance != null) {
+ vo.setOpenGray(grayInstance.isOpenGray());
+ vo.setHasGrayPolicies(grayInstance.hasGrayPolicy());
+ }
+ list.add(vo);
+ }
+ return ResponseEntity.ok(list);
+ }
+
+
+ /**
+ * 服务实例的所有灰度策略组
+ *
+ * @param serviceId 服务id
+ * @param instanceId 实例id
+ * @return 灰策略组VO列表
+ */
+ @Override
+ public ResponseEntity> policyGroups(String serviceId, String instanceId) {
+
+ Application app = eurekaClient.getApplication(serviceId);
+ InstanceInfo instanceInfo = app.getByInstanceId(instanceId);
+ GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceId);
+ String appName = instanceInfo.getAppName();
+ String homePageUrl = instanceInfo.getHomePageUrl();
+ if (grayInstance != null && grayInstance.getGrayPolicyGroups() != null) {
+ List policyGroups = grayInstance.getGrayPolicyGroups();
+ List vos = new ArrayList<>(policyGroups.size());
+ for (GrayPolicyGroup policyGroup : policyGroups) {
+ vos.add(getPolicyGroup(serviceId, appName, instanceId, homePageUrl, policyGroup));
+ }
+ return ResponseEntity.ok(vos);
+ }
+ return ResponseEntity.ok(Collections.emptyList());
+ }
+
+
+ /**
+ * 灰度策略组
+ *
+ * @param serviceId 服务id
+ * @param instanceId 实例id
+ * @param groupId 灰度策略组id
+ * @return 灰度策略组VO
+ */
+ @Override
+ public ResponseEntity policyGroup(String serviceId, String instanceId, String groupId) {
+ Application app = eurekaClient.getApplication(serviceId);
+ InstanceInfo instanceInfo = app.getByInstanceId(instanceId);
+ GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceId);
+ String appName = instanceInfo.getAppName();
+ String homePageUrl = instanceInfo.getHomePageUrl();
+ if (grayInstance != null) {
+ GrayPolicyGroup policyGroup = grayInstance.getGrayPolicyGroup(groupId);
+ if (policyGroup != null) {
+ return ResponseEntity.ok(getPolicyGroup(serviceId, appName, instanceId, homePageUrl, policyGroup));
+ }
+ }
+ return ResponseEntity.ok().build();
+ }
+}
diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/ZookeeperGrayService.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/ZookeeperGrayService.java
new file mode 100644
index 00000000..493a8394
--- /dev/null
+++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/ZookeeperGrayService.java
@@ -0,0 +1,133 @@
+package cn.springcloud.gray.server.service;
+
+import cn.springcloud.gray.core.GrayInstance;
+import cn.springcloud.gray.core.GrayPolicyGroup;
+import cn.springcloud.gray.core.GrayServiceManager;
+import cn.springcloud.gray.server.resources.domain.vo.GrayInstanceVO;
+import cn.springcloud.gray.server.resources.domain.vo.GrayPolicyGroupVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.cloud.zookeeper.serviceregistry.ZookeeperRegistration;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Service
+@ConditionalOnBean(ZookeeperRegistration.class)
+public class ZookeeperGrayService extends AbstractGrayService {
+ private static final String METADATA_KEY_INSTANCE_ID = "instanceId";
+
+ private final DiscoveryClient discoveryClient;
+ private final GrayServiceManager grayServiceManager;
+
+ @Autowired
+ public ZookeeperGrayService(DiscoveryClient discoveryClient, GrayServiceManager grayServiceManager) {
+ super(grayServiceManager, discoveryClient);
+ this.discoveryClient = discoveryClient;
+ this.grayServiceManager = grayServiceManager;
+ }
+
+ /**
+ * 返回服务实例列表
+ *
+ * @param serviceId 服务id
+ * @return 灰度服务实例VO列表
+ */
+ @Override
+ public ResponseEntity> instances(String serviceId) {
+ List list = new ArrayList<>();
+ List instances = discoveryClient.getInstances(serviceId);
+ if (null != instances && !instances.isEmpty()) {
+ instances.forEach(instance -> {
+ String instanceId = getInstanceId(instance);
+ GrayInstanceVO vo = new GrayInstanceVO();
+ vo.setAppName(serviceId);
+ vo.setServiceId(serviceId);
+ vo.setInstanceId(instanceId);
+ vo.setMetadata(instance.getMetadata());
+ vo.setUrl(instance.getUri().toString());
+ GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceId);
+ if (grayInstance != null) {
+ vo.setOpenGray(grayInstance.isOpenGray());
+ vo.setHasGrayPolicies(grayInstance.hasGrayPolicy());
+ }
+ list.add(vo);
+ });
+ }
+ return ResponseEntity.ok(list);
+ }
+
+ /**
+ * 服务实例的所有灰度策略组
+ *
+ * @param serviceId 服务id
+ * @param instanceId 实例id
+ * @return 灰策略组VO列表
+ */
+ @Override
+ public ResponseEntity> policyGroups(String serviceId, String instanceId) {
+ List instances = discoveryClient.getInstances(serviceId);
+ if (null == instances || instances.isEmpty()) {
+ return ResponseEntity.ok(Collections.emptyList());
+ }
+
+ ServiceInstance serviceInstance = instances.stream()
+ .filter(instance -> instanceId.equals(getInstanceId(instance)))
+ .findFirst().orElse(null);
+
+ GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceId);
+ if (null != serviceInstance && grayInstance != null && grayInstance.getGrayPolicyGroups() != null) {
+ String homePageUrl = serviceInstance.getUri().toString();
+ List policyGroups = grayInstance.getGrayPolicyGroups();
+ List vos = new ArrayList<>(policyGroups.size());
+ for (GrayPolicyGroup policyGroup : policyGroups) {
+ vos.add(getPolicyGroup(serviceId, serviceId, instanceId, homePageUrl, policyGroup));
+ }
+ return ResponseEntity.ok(vos);
+ }
+ return ResponseEntity.ok(Collections.emptyList());
+ }
+
+
+ /**
+ * 灰度策略组
+ *
+ * @param serviceId 服务id
+ * @param instanceId 实例id
+ * @param groupId 灰度策略组id
+ * @return 灰度策略组VO
+ */
+ @Override
+ public ResponseEntity policyGroup(String serviceId, String instanceId, String groupId) {
+ List instances = discoveryClient.getInstances(serviceId);
+ if (null == instances || instances.isEmpty()) {
+ return ResponseEntity.ok().build();
+ }
+
+ ServiceInstance serviceInstance = instances.stream()
+ .filter(instance -> instanceId.equals(getInstanceId(instance)))
+ .findFirst().orElse(null);
+
+ GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceId);
+ if (null != serviceInstance && grayInstance != null) {
+ GrayPolicyGroup policyGroup = grayInstance.getGrayPolicyGroup(groupId);
+ if (policyGroup != null) {
+ String homePageUrl = serviceInstance.getUri().toString();
+ return ResponseEntity.ok(getPolicyGroup(serviceId, serviceId, instanceId, homePageUrl, policyGroup));
+ }
+ }
+ return ResponseEntity.ok().build();
+ }
+
+ private String getInstanceId(ServiceInstance instance) {
+ if (instance.getMetadata().containsKey(METADATA_KEY_INSTANCE_ID)) {
+ return instance.getMetadata().get(METADATA_KEY_INSTANCE_ID);
+ }
+ throw new IllegalStateException("Unable to find config spring.cloud.zookeeper.discovery.metadata.instanceId!");
+ }
+}
diff --git a/spring-cloud-gray-zookeeper-samples/README.md b/spring-cloud-gray-zookeeper-samples/README.md
new file mode 100644
index 00000000..d84e74d6
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/README.md
@@ -0,0 +1,158 @@
+## 灰度发布使用说明
+(以下说明都是假设浏览者对spring-cloud-netflix有过了解)
+灰度管理的配置和bamboo的配置是一样的, 配置方式差别不大。不过由于gray-server需要注册到eureka,所以要先运行eureka-server。下面先说gray-server的配置。
+
+##### gray-server
+在项目的pom.xml加入spring-boot相关的依赖,再加入spring-cloud-starter-gray-server,然后启动就可以了。比如spring-cloud-gray-server-sample
+```xml
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zookeeper-discovery
+
+
+
+ cn.springcloud.gray
+ spring-cloud-starter-gray-server
+
+
+
+```
+
+在启动类中,需要启用服务发现,以及@EnableGrayServer。
+
+```java
+@SpringBootApplication
+@EnableGrayServer
+@EnableDiscoveryClient
+public class GrayServerApplication {
+
+ private static final org.slf4j.Logger log = LoggerFactory.getLogger(GrayServerApplication.class);
+
+
+ public static void main(String[] args) throws UnknownHostException {
+ Environment env = new SpringApplicationBuilder(GrayServerApplication.class).web(true).run(args).getEnvironment();
+ log.info(
+ "\n----------------------------------------------------------\n\t"
+ + "Application '{}' is running! Access URLs:\n\t" + "Local: \t\thttp://127.0.0.1:{}\n\t"
+ + "External: \thttp://{}:{}\n----------------------------------------------------------",
+ env.getProperty("spring.application.name"), env.getProperty("server.port"),
+ InetAddress.getLocalHost().getHostAddress(), env.getProperty("server.port"));
+
+ String configServerStatus = env.getProperty("configserver.status");
+ log.info(
+ "\n----------------------------------------------------------\n\t"
+ + "Config Server: \t{}\n----------------------------------------------------------",
+ configServerStatus == null ? "Not found or not setup for this application" : configServerStatus);
+ }
+}
+```
+
+启动后,可以访问 http://localhost:20202/swagger-ui.html 查看接口列表,也可以调用其中的接口。
+
+
+
+以上介绍完了gray-server的配置,下面再看gray-client的配置。
+
+
+##### gray-client
+
+1、在pom.xml中加入spring-cloud-starter-gray。比如spring-cloud-gray-service-b-sample
+```xml
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zookeeper-discovery
+
+
+ org.springframework.cloud
+ spring-cloud-starter-feign
+
+
+ org.apache.commons
+ commons-lang3
+ 3.5
+
+
+
+
+ cn.springcloud.gray
+ spring-cloud-starter-gray
+
+
+```
+
+2、在application.yaml中加入灰度配置。
+```yaml
+spring:
+ application:
+ name: service-b
+ cloud:
+ zookeeper:
+ connect-string: 127.0.0.1:2181
+ discovery:
+ register: true
+ root: dev
+ metadata:
+ # 因zookeeper作为注册中心生成的instanceId不规则且不易获取,所以必须配置instanceId,取值值只要能区分不同的实例即可
+ instanceId: ${spring.application.name}:${java.rmi.server.hostname}:${server.port}
+
+server:
+ port: 20101
+
+gray:
+ client:
+ instance:
+ grayEnroll: false #是否在启动后自动注册成灰度实例
+ serverUrl: http://localhost:20202 #灰度服务端的url
+```
+更多gray-client配置请查看cn.springcloud.gray.client.GrayClientConfig接口
+
+3、在启动类中加入灰度客户端的注解@EnableGrayClient
+```java
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableGrayClient
+@EnableFeignClients
+public class ServiceBApplication {
+ private static final org.slf4j.Logger log = LoggerFactory.getLogger(ServiceBApplication.class);
+
+
+ public static void main(String[] args) throws UnknownHostException {
+ Environment env = new SpringApplicationBuilder(ServiceBApplication.class).web(true).run(args).getEnvironment();
+ log.info(
+ "\n----------------------------------------------------------\n\t"
+ + "Application '{}' is running! Access URLs:\n\t" + "Local: \t\thttp://127.0.0.1:{}\n\t"
+ + "External: \thttp://{}:{}\n----------------------------------------------------------",
+ env.getProperty("spring.application.name"), env.getProperty("server.port"),
+ InetAddress.getLocalHost().getHostAddress(), env.getProperty("server.port"));
+
+ String configServerStatus = env.getProperty("configserver.status");
+ log.info(
+ "\n----------------------------------------------------------\n\t"
+ + "Config Server: \t{}\n----------------------------------------------------------",
+ configServerStatus == null ? "Not found or not setup for this application" : configServerStatus);
+ }
+}
+```
+
+这样灰略度的服务端和客户端都配置好了, 只要在灰度服务端开启灰度实例和灰度策,在灰度客户端就会自动进行灰度路由。
+
+
+
diff --git a/spring-cloud-gray-zookeeper-samples/pom.xml b/spring-cloud-gray-zookeeper-samples/pom.xml
new file mode 100644
index 00000000..4a4200d6
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/pom.xml
@@ -0,0 +1,35 @@
+
+
+
+ spring-cloud-gray
+ cn.springcloud.gray
+ 1.1.0
+
+ 4.0.0
+
+ spring-cloud-gray-zookeeper-samples
+ pom
+
+ spring-cloud-gray-zookeeper-zuul-sample
+ spring-cloud-gray-zookeeper-service-a-sample
+ spring-cloud-gray-zookeeper-service-b-sample
+ spring-cloud-gray-zookeeper-server-sample
+
+
+
+
+
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-server-sample/pom.xml b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-server-sample/pom.xml
new file mode 100644
index 00000000..91e4926d
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-server-sample/pom.xml
@@ -0,0 +1,47 @@
+
+
+
+ spring-cloud-gray-zookeeper-samples
+ cn.springcloud.gray
+ 1.1.0
+
+ 4.0.0
+
+ spring-cloud-gray-zookeeper-server-sample
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zookeeper-discovery
+
+
+ cn.springcloud.gray
+ spring-cloud-starter-gray-server
+
+
+
+
+
+
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-server-sample/src/main/java/cn/springcloud/gray/server/GrayServerApplication.java b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-server-sample/src/main/java/cn/springcloud/gray/server/GrayServerApplication.java
new file mode 100644
index 00000000..e31c2a46
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-server-sample/src/main/java/cn/springcloud/gray/server/GrayServerApplication.java
@@ -0,0 +1,35 @@
+package cn.springcloud.gray.server;
+
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.core.env.Environment;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+@SpringBootApplication
+@EnableGrayServer
+@EnableDiscoveryClient
+public class GrayServerApplication {
+
+ private static final org.slf4j.Logger log = LoggerFactory.getLogger(GrayServerApplication.class);
+
+
+ public static void main(String[] args) throws UnknownHostException {
+ Environment env = new SpringApplicationBuilder(GrayServerApplication.class).web(true).run(args).getEnvironment();
+ log.info(
+ "\n----------------------------------------------------------\n\t"
+ + "Application '{}' is running! Access URLs:\n\t" + "Local: \t\thttp://127.0.0.1:{}\n\t"
+ + "External: \thttp://{}:{}\n----------------------------------------------------------",
+ env.getProperty("spring.application.name"), env.getProperty("server.port"),
+ InetAddress.getLocalHost().getHostAddress(), env.getProperty("server.port"));
+
+ String configServerStatus = env.getProperty("configserver.status");
+ log.info(
+ "\n----------------------------------------------------------\n\t"
+ + "Config Server: \t{}\n----------------------------------------------------------",
+ configServerStatus == null ? "Not found or not setup for this application" : configServerStatus);
+ }
+}
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-server-sample/src/main/resources/config/application.yml b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-server-sample/src/main/resources/config/application.yml
new file mode 100644
index 00000000..bf4ae0d6
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-server-sample/src/main/resources/config/application.yml
@@ -0,0 +1,12 @@
+spring:
+ application:
+ name: gray-server
+ cloud:
+ zookeeper:
+ connect-string: 127.0.0.1:2181
+ discovery:
+ register: true
+ root: dev
+
+server:
+ port: 20202
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/pom.xml b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/pom.xml
new file mode 100644
index 00000000..11e10887
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/pom.xml
@@ -0,0 +1,51 @@
+
+
+
+ spring-cloud-gray-zookeeper-samples
+ cn.springcloud.gray
+ 1.1.0
+
+ 4.0.0
+
+ spring-cloud-gray-zookeeper-service-a-sample
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zookeeper-discovery
+
+
+ org.apache.commons
+ commons-lang3
+ 3.5
+
+
+
+ cn.springcloud.gray
+ spring-cloud-starter-gray
+
+
+
+
+
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/src/main/java/cn/springcloud/service/a/ServiceAApplication.java b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/src/main/java/cn/springcloud/service/a/ServiceAApplication.java
new file mode 100644
index 00000000..d392ee06
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/src/main/java/cn/springcloud/service/a/ServiceAApplication.java
@@ -0,0 +1,38 @@
+package cn.springcloud.service.a;
+
+import cn.springcloud.gray.client.EnableGrayClient;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.core.env.Environment;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * Created by saleson on 2017/10/18.
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableGrayClient
+public class ServiceAApplication {
+ private static final org.slf4j.Logger log = LoggerFactory.getLogger(ServiceAApplication.class);
+
+
+ public static void main(String[] args) throws UnknownHostException {
+ Environment env = new SpringApplicationBuilder(ServiceAApplication.class).web(true).run(args).getEnvironment();
+ log.info(
+ "\n----------------------------------------------------------\n\t"
+ + "Application '{}' is running! Access URLs:\n\t" + "Local: \t\thttp://127.0.0.1:{}\n\t"
+ + "External: \thttp://{}:{}\n----------------------------------------------------------",
+ env.getProperty("spring.application.name"), env.getProperty("server.port"),
+ InetAddress.getLocalHost().getHostAddress(), env.getProperty("server.port"));
+
+ String configServerStatus = env.getProperty("configserver.status");
+ log.info(
+ "\n----------------------------------------------------------\n\t"
+ + "Config Server: \t{}\n----------------------------------------------------------",
+ configServerStatus == null ? "Not found or not setup for this application" : configServerStatus);
+ }
+}
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/src/main/java/cn/springcloud/service/a/rest/TestResource.java b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/src/main/java/cn/springcloud/service/a/rest/TestResource.java
new file mode 100644
index 00000000..ed783baf
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/src/main/java/cn/springcloud/service/a/rest/TestResource.java
@@ -0,0 +1,27 @@
+package cn.springcloud.service.a.rest;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * Created by saleson on 2017/10/18.
+ */
+@RestController
+@RequestMapping("/api/test")
+public class TestResource {
+ @Autowired
+ Environment env;
+
+ @RequestMapping(value = "/get", method = RequestMethod.GET)
+ @ResponseBody
+ public Map testGet(@RequestParam(value = "version", required = false) String version) {
+ return ImmutableMap.of("test", "success.", "version", StringUtils.defaultIfEmpty(version, ""), "serverPort", env.getProperty("server.port"));
+ }
+
+
+}
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/src/main/resources/config/application.yml b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/src/main/resources/config/application.yml
new file mode 100644
index 00000000..f1fe7d4e
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/src/main/resources/config/application.yml
@@ -0,0 +1,19 @@
+spring:
+ application:
+ name: service-a
+ cloud:
+ zookeeper:
+ connect-string: 127.0.0.1:2181
+ discovery:
+ register: true
+ root: dev
+ metadata:
+ instanceId: ${spring.application.name}:${java.rmi.server.hostname}:${server.port}
+server:
+ port: 20101
+
+gray:
+ client:
+ instance:
+ grayEnroll: false #是否在启动后自动注册成灰度实例
+ serverUrl: http://localhost:20202 #灰度服务端的url
\ No newline at end of file
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/pom.xml b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/pom.xml
new file mode 100644
index 00000000..23bbcfe7
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/pom.xml
@@ -0,0 +1,57 @@
+
+
+
+ spring-cloud-gray-zookeeper-samples
+ cn.springcloud.gray
+ 1.1.0
+
+ 4.0.0
+
+ spring-cloud-gray-zookeeper-service-b-sample
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zookeeper-discovery
+
+
+ org.springframework.cloud
+ spring-cloud-starter-feign
+
+
+ org.apache.commons
+ commons-lang3
+ 3.5
+
+
+
+
+ cn.springcloud.gray
+ spring-cloud-starter-gray
+
+
+
+
+
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/java/cn/springcloud/gray/service/b/ServiceBApplication.java b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/java/cn/springcloud/gray/service/b/ServiceBApplication.java
new file mode 100644
index 00000000..842a0df2
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/java/cn/springcloud/gray/service/b/ServiceBApplication.java
@@ -0,0 +1,40 @@
+package cn.springcloud.gray.service.b;
+
+import cn.springcloud.gray.client.EnableGrayClient;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.netflix.feign.EnableFeignClients;
+import org.springframework.core.env.Environment;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * Created by saleson on 2017/10/18.
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableGrayClient
+@EnableFeignClients
+public class ServiceBApplication {
+ private static final org.slf4j.Logger log = LoggerFactory.getLogger(ServiceBApplication.class);
+
+
+ public static void main(String[] args) throws UnknownHostException {
+ Environment env = new SpringApplicationBuilder(ServiceBApplication.class).web(true).run(args).getEnvironment();
+ log.info(
+ "\n----------------------------------------------------------\n\t"
+ + "Application '{}' is running! Access URLs:\n\t" + "Local: \t\thttp://127.0.0.1:{}\n\t"
+ + "External: \thttp://{}:{}\n----------------------------------------------------------",
+ env.getProperty("spring.application.name"), env.getProperty("server.port"),
+ InetAddress.getLocalHost().getHostAddress(), env.getProperty("server.port"));
+
+ String configServerStatus = env.getProperty("configserver.status");
+ log.info(
+ "\n----------------------------------------------------------\n\t"
+ + "Config Server: \t{}\n----------------------------------------------------------",
+ configServerStatus == null ? "Not found or not setup for this application" : configServerStatus);
+ }
+}
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/java/cn/springcloud/gray/service/b/feign/TestClient.java b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/java/cn/springcloud/gray/service/b/feign/TestClient.java
new file mode 100644
index 00000000..dc12a37a
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/java/cn/springcloud/gray/service/b/feign/TestClient.java
@@ -0,0 +1,19 @@
+package cn.springcloud.gray.service.b.feign;
+
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.Map;
+
+/**
+ * Created by saleson on 2017/11/10.
+ */
+@FeignClient(name = "service-a")
+public interface TestClient {
+
+ @RequestMapping(path = "/api/test/get", method = RequestMethod.GET)
+ Map testGet(@RequestParam(value = "version", required = false) String version);
+
+}
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/java/cn/springcloud/gray/service/b/rest/TestResource.java b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/java/cn/springcloud/gray/service/b/rest/TestResource.java
new file mode 100644
index 00000000..9e114290
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/java/cn/springcloud/gray/service/b/rest/TestResource.java
@@ -0,0 +1,64 @@
+package cn.springcloud.gray.service.b.rest;
+
+import cn.springcloud.gray.service.b.feign.TestClient;
+import com.google.common.collect.ImmutableMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.RestTemplate;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+/**
+ * Created by saleson on 2017/10/18.
+ */
+@RestController
+@RequestMapping("/api/test")
+public class TestResource {
+ @Autowired
+ private RestTemplate restTemplate;
+ @Autowired
+ private TestClient testClient;
+
+
+ @RequestMapping(value = "/testGet", method = RequestMethod.GET)
+ @ResponseBody
+ public Map testGet(HttpServletRequest request) {
+ return ImmutableMap.of("restTemplateGet", "success.", "service-b-result", "");
+ }
+
+
+ /**
+ * test rest template invoke service-a
+ *
+ * @param request HttpServletRequest
+ * @return 内容
+ */
+ @RequestMapping(value = "/restTemplateGet", method = RequestMethod.GET)
+ @ResponseBody
+ public Map restTemplateGet(HttpServletRequest request) {
+ String url = "http://service-a/api/test/get";
+ String query = request.getQueryString();
+ if (!StringUtils.isEmpty(query)) {
+ url = url + "?" + query;
+ }
+
+ Map map = restTemplate.getForObject(url, Map.class);
+ return ImmutableMap.of("restTemplateGet", "success.", "service-a-result", map);
+ }
+
+
+ /**
+ * test feign invoke service-a
+ *
+ * @param version 请求的版本
+ * @return 内容
+ */
+ @RequestMapping(value = "/feignGet", method = RequestMethod.GET)
+ @ResponseBody
+ public Map feignGet(@RequestParam(value = "version", required = false) String version) {
+ Map map = testClient.testGet(version);
+ return ImmutableMap.of("feignGet", "success.", "service-a-result", map);
+ }
+}
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/resources/config/application.yml b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/resources/config/application.yml
new file mode 100644
index 00000000..eeabd291
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/resources/config/application.yml
@@ -0,0 +1,24 @@
+spring:
+ application:
+ name: service-b
+ cloud:
+ zookeeper:
+ connect-string: 127.0.0.1:2181
+ discovery:
+ register: true
+ root: dev
+ metadata:
+ instanceId: ${spring.application.name}:${java.rmi.server.hostname}:${server.port}
+
+server:
+ port: 20102
+
+feign:
+ hystrix:
+ enabled: true
+
+gray:
+ client:
+ instance:
+ grayEnroll: false #是否在启动后自动注册成灰度实例
+ serverUrl: http://localhost:20202 #灰度服务端的url
\ No newline at end of file
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-zuul-sample/pom.xml b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-zuul-sample/pom.xml
new file mode 100644
index 00000000..7e65962c
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-zuul-sample/pom.xml
@@ -0,0 +1,50 @@
+
+
+
+ spring-cloud-gray-zookeeper-samples
+ cn.springcloud.gray
+ 1.1.0
+
+ 4.0.0
+
+ spring-cloud-gray-zookeeper-zuul-sample
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zuul
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zookeeper-discovery
+
+
+
+ cn.springcloud.gray
+ spring-cloud-starter-gray
+
+
+
+
+
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-zuul-sample/src/main/java/cn/springcloud/gray/zuul/GrayZuulApplication.java b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-zuul-sample/src/main/java/cn/springcloud/gray/zuul/GrayZuulApplication.java
new file mode 100644
index 00000000..ff63148f
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-zuul-sample/src/main/java/cn/springcloud/gray/zuul/GrayZuulApplication.java
@@ -0,0 +1,40 @@
+package cn.springcloud.gray.zuul;
+
+import cn.springcloud.gray.client.EnableGrayClient;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+import org.springframework.core.env.Environment;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * Created by saleson on 2017/10/18.
+ */
+@SpringCloudApplication
+@EnableZuulProxy
+@EnableDiscoveryClient
+@EnableGrayClient
+public class GrayZuulApplication {
+ private static final org.slf4j.Logger log = LoggerFactory.getLogger(GrayZuulApplication.class);
+
+
+ public static void main(String[] args) throws UnknownHostException {
+ Environment env = new SpringApplicationBuilder(GrayZuulApplication.class).web(true).run(args).getEnvironment();
+ log.info(
+ "\n----------------------------------------------------------\n\t"
+ + "Application '{}' is running! Access URLs:\n\t" + "Local: \t\thttp://127.0.0.1:{}\n\t"
+ + "External: \thttp://{}:{}\n----------------------------------------------------------",
+ env.getProperty("spring.application.name"), env.getProperty("server.port"),
+ InetAddress.getLocalHost().getHostAddress(), env.getProperty("server.port"));
+
+ String configServerStatus = env.getProperty("configserver.status");
+ log.info(
+ "\n----------------------------------------------------------\n\t"
+ + "Config Server: \t{}\n----------------------------------------------------------",
+ configServerStatus == null ? "Not found or not setup for this application" : configServerStatus);
+ }
+}
diff --git a/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-zuul-sample/src/main/resources/config/application.yml b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-zuul-sample/src/main/resources/config/application.yml
new file mode 100644
index 00000000..e179a36c
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-zuul-sample/src/main/resources/config/application.yml
@@ -0,0 +1,30 @@
+spring:
+ application:
+ name: api-gateway
+ cloud:
+ zookeeper:
+ connect-string: 127.0.0.1:2181
+ discovery:
+ register: true
+ root: dev
+ metadata:
+ instanceId: ${spring.application.name}:${java.rmi.server.hostname}:${server.port}
+
+server:
+ port: 20301
+
+ribbon:
+# ReadTimeout: 30000
+# ConnectTimeout: 30000
+
+zuul:
+ prefix: /gateway #为zuul设置一个公共的前缀
+# routes:
+# eureka-client: #随便定义,当不存在serviceId时,默认该值为serviceId(就是注册服务的名称,属性spring.application.name)
+# path: /client/** #匹配/techouse/usersystem/** 均路由到cloud-client
+# serviceId: eureka-client #指定路由到的serviceId
+gray:
+ client:
+ server-url: http://localhost:20202 #灰度服务端的url
+ instance:
+ use-multi-version: false
\ No newline at end of file
diff --git a/spring-cloud-mult-version-samples/pom.xml b/spring-cloud-mult-version-samples/pom.xml
index 973a490e..997c620e 100644
--- a/spring-cloud-mult-version-samples/pom.xml
+++ b/spring-cloud-mult-version-samples/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-eureka-samples/pom.xml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-eureka-samples/pom.xml
index f63f4cfd..29ef9fb7 100644
--- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-eureka-samples/pom.xml
+++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-eureka-samples/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-mult-version-samples
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/pom.xml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/pom.xml
index 67d08a12..74416751 100644
--- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/pom.xml
+++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-mult-version-samples
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/pom.xml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/pom.xml
index 0e12d635..cbe55abd 100644
--- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/pom.xml
+++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-mult-version-samples
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/pom.xml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/pom.xml
index a701b2d0..34a826fd 100644
--- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/pom.xml
+++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-mult-version-samples
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/pom.xml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/pom.xml
index 62229ead..a3fd12f0 100644
--- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/pom.xml
+++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-mult-version-samples
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-samples/pom.xml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-samples/pom.xml
index d03eb22f..57cb004d 100644
--- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-samples/pom.xml
+++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-samples/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-mult-version-samples
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/pom.xml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/pom.xml
index f28d6846..1644dce3 100644
--- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/pom.xml
+++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-mult-version-samples
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-starter-gray-server/pom.xml b/spring-cloud-starter-gray-server/pom.xml
index 4f4c3036..bc03a9e2 100644
--- a/spring-cloud-starter-gray-server/pom.xml
+++ b/spring-cloud-starter-gray-server/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-starter-gray-server/src/main/resources/META-INF/spring.factories b/spring-cloud-starter-gray-server/src/main/resources/META-INF/spring.factories
index 9ec3431b..d2899dee 100644
--- a/spring-cloud-starter-gray-server/src/main/resources/META-INF/spring.factories
+++ b/spring-cloud-starter-gray-server/src/main/resources/META-INF/spring.factories
@@ -1,3 +1,5 @@
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
- cn.springcloud.gray.server.config.GrayServerAutoConfiguration
\ No newline at end of file
+ cn.springcloud.gray.server.config.GrayServerAutoConfiguration,\
+ cn.springcloud.gray.server.config.GrayServiceEurekaAutoConfiguration,\
+ cn.springcloud.gray.server.config.GrayServiceZookeeperAutoConfiguration
\ No newline at end of file
diff --git a/spring-cloud-starter-gray/pom.xml b/spring-cloud-starter-gray/pom.xml
index 56de1824..9ddc0c2b 100644
--- a/spring-cloud-starter-gray/pom.xml
+++ b/spring-cloud-starter-gray/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0
diff --git a/spring-cloud-starter-gray/src/main/resources/META-INF/spring.factories b/spring-cloud-starter-gray/src/main/resources/META-INF/spring.factories
index 261d4111..3dc90898 100644
--- a/spring-cloud-starter-gray/src/main/resources/META-INF/spring.factories
+++ b/spring-cloud-starter-gray/src/main/resources/META-INF/spring.factories
@@ -1,3 +1,5 @@
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
- cn.springcloud.gray.client.config.GrayClientAutoConfiguration
\ No newline at end of file
+ cn.springcloud.gray.client.config.GrayClientAutoConfiguration,\
+ cn.springcloud.gray.client.config.GrayClientEurekaAutoConfiguration,\
+ cn.springcloud.gray.client.config.GrayClientZookeeperAutoConfiguration
\ No newline at end of file
diff --git a/spring-cloud-starter-multi-version/pom.xml b/spring-cloud-starter-multi-version/pom.xml
index 31a1fc4b..1437517c 100644
--- a/spring-cloud-starter-multi-version/pom.xml
+++ b/spring-cloud-starter-multi-version/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray
cn.springcloud.gray
- 1.0.2
+ 1.1.0
4.0.0