From 40ad2fd85241a92d3eae1006fe880559756b39d8 Mon Sep 17 00:00:00 2001
From: eric <935658701@qq.com>
Date: Tue, 5 Jun 2018 16:41:12 +0800
Subject: [PATCH 1/3] =?UTF-8?q?=E7=81=B0=E5=BA=A6=E5=8F=91=E5=B8=83?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9zookeeper=E7=9A=84=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 3 +-
spring-cloud-bamboo/pom.xml | 2 +-
spring-cloud-gray-client/pom.xml | 7 +-
.../config/GrayClientAutoConfiguration.java | 26 ++-
.../gray/ribbon/GrayDecisionPredicate.java | 9 +-
.../gray/ribbon/GrayLoadBalanceRule.java | 9 +-
.../springcloud/gray/utils/ServiceUtil.java | 52 ++++++
spring-cloud-gray-core/pom.xml | 2 +-
spring-cloud-gray-dependencies/pom.xml | 2 +-
spring-cloud-gray-samples/pom.xml | 2 +-
.../spring-cloud-gray-eureka-sample/pom.xml | 2 +-
.../spring-cloud-gray-server-sample/pom.xml | 2 +-
.../pom.xml | 2 +-
.../pom.xml | 2 +-
.../spring-cloud-gray-zuul-sample/pom.xml | 2 +-
spring-cloud-gray-server/pom.xml | 8 +-
.../server/DefaultGrayServiceManager.java | 1 +
.../server/ZookeeperGrayServerEvictor.java | 54 ++++++
.../config/GrayServerAutoConfiguration.java | 18 +-
.../GrayServiceEurekaAutoConfiguration.java | 47 ++++++
...GrayServiceZookeeperAutoConfiguration.java | 44 +++++
.../resources/rest/ServiceGrayResouce.java | 140 ++--------------
.../server/service/AbstractGrayService.java | 140 ++++++++++++++++
.../server/service/EurekaGrayService.java | 147 ++++++++++++++++
.../server/service/ZookeeperGrayService.java | 158 ++++++++++++++++++
spring-cloud-gray-zookeeper-samples/README.md | 142 ++++++++++++++++
spring-cloud-gray-zookeeper-samples/pom.xml | 35 ++++
.../pom.xml | 47 ++++++
.../gray/server/GrayServerApplication.java | 35 ++++
.../src/main/resources/config/application.yml | 13 ++
.../pom.xml | 51 ++++++
.../service/a/ServiceAApplication.java | 38 +++++
.../service/a/rest/TestResource.java | 27 +++
.../src/main/resources/config/application.yml | 18 ++
.../pom.xml | 57 +++++++
.../gray/service/b/ServiceBApplication.java | 40 +++++
.../gray/service/b/feign/TestClient.java | 19 +++
.../gray/service/b/rest/TestResource.java | 64 +++++++
.../src/main/resources/config/application.yml | 22 +++
.../pom.xml | 50 ++++++
.../gray/zuul/GrayZuulApplication.java | 40 +++++
.../src/main/resources/config/application.yml | 31 ++++
spring-cloud-mult-version-samples/pom.xml | 2 +-
.../pom.xml | 2 +-
.../pom.xml | 2 +-
.../pom.xml | 2 +-
.../pom.xml | 2 +-
.../pom.xml | 2 +-
.../spring-cloud-bamboo-zuul-samples/pom.xml | 2 +-
.../pom.xml | 2 +-
spring-cloud-starter-gray-server/pom.xml | 2 +-
.../main/resources/META-INF/spring.factories | 4 +-
spring-cloud-starter-gray/pom.xml | 2 +-
spring-cloud-starter-multi-version/pom.xml | 2 +-
54 files changed, 1460 insertions(+), 176 deletions(-)
create mode 100644 spring-cloud-gray-client/src/main/java/cn/springcloud/gray/utils/ServiceUtil.java
create mode 100644 spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/ZookeeperGrayServerEvictor.java
create mode 100644 spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/config/GrayServiceEurekaAutoConfiguration.java
create mode 100644 spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/config/GrayServiceZookeeperAutoConfiguration.java
create mode 100644 spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/AbstractGrayService.java
create mode 100644 spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/EurekaGrayService.java
create mode 100644 spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/ZookeeperGrayService.java
create mode 100644 spring-cloud-gray-zookeeper-samples/README.md
create mode 100644 spring-cloud-gray-zookeeper-samples/pom.xml
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-server-sample/pom.xml
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-server-sample/src/main/java/cn/springcloud/gray/server/GrayServerApplication.java
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-server-sample/src/main/resources/config/application.yml
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/pom.xml
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/src/main/java/cn/springcloud/service/a/ServiceAApplication.java
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/src/main/java/cn/springcloud/service/a/rest/TestResource.java
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/src/main/resources/config/application.yml
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/pom.xml
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/java/cn/springcloud/gray/service/b/ServiceBApplication.java
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/java/cn/springcloud/gray/service/b/feign/TestClient.java
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/java/cn/springcloud/gray/service/b/rest/TestResource.java
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/resources/config/application.yml
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-zuul-sample/pom.xml
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-zuul-sample/src/main/java/cn/springcloud/gray/zuul/GrayZuulApplication.java
create mode 100644 spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-zuul-sample/src/main/resources/config/application.yml
diff --git a/pom.xml b/pom.xml
index d968e177..0b8cb452 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
cn.springcloud.gray
spring-cloud-gray
pom
- 1.0.2
+ 1.1.0-SNAPSHOT
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..25345a53 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-SNAPSHOT
4.0.0
diff --git a/spring-cloud-gray-client/pom.xml b/spring-cloud-gray-client/pom.xml
index b579a55a..359f45c0 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-SNAPSHOT
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..66ca5ebe 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
@@ -13,14 +13,15 @@
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 cn.springcloud.gray.utils.ServiceUtil;
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.cloud.client.serviceregistry.Registration;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
+import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
@@ -54,16 +55,21 @@ public GrayClientInitializingBean grayClientInitializingBean() {
@Bean
- public InstanceLocalInfo instanceLocalInfo(@Autowired EurekaClient eurekaClient) {
- EurekaInstanceConfig instanceConfig = eurekaClient.getApplicationInfoManager().getEurekaInstanceConfig();
+ @ConditionalOnMissingBean
+ public InstanceLocalInfo instanceLocalInfo(@Autowired ApplicationContext context,
+ @Autowired Registration registration) {
+ String instanceId = ServiceUtil.getInstanceId(registration);
+ if(null == instanceId){
+ context.getId();
+ }
+
InstanceLocalInfo localInfo = new InstanceLocalInfo();
- localInfo.setInstanceId(instanceConfig.getInstanceId());
- localInfo.setServiceId(instanceConfig.getAppname());
+ localInfo.setInstanceId(instanceId);
+ localInfo.setServiceId(registration.getServiceId());
localInfo.setGray(false);
return localInfo;
}
-
@Bean
@ConditionalOnMissingBean
public GrayDecisionFactory grayDecisionFactory() {
@@ -72,14 +78,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/ribbon/GrayDecisionPredicate.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/ribbon/GrayDecisionPredicate.java
index 473213b8..c202ed3d 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
@@ -3,9 +3,10 @@
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;
@@ -21,10 +22,12 @@ public boolean apply(PredicateKey input) {
if (bambooRequestContext == null || bambooRequestContext.getBambooRequest() == null) {
return false;
}
- DiscoveryEnabledServer server = (DiscoveryEnabledServer) input.getServer();
+ Server server = input.getServer();
+ String instanceId = ServiceUtil.getInstanceId(server);
+
BambooRequest bambooRequest = bambooRequestContext.getBambooRequest();
List grayDecisions =
- getIRule().getGrayManager().grayDecision(bambooRequest.getServiceId(), server.getInstanceInfo().getInstanceId());
+ getIRule().getGrayManager().grayDecision(bambooRequest.getServiceId(), instanceId);
for (GrayDecision grayDecision : grayDecisions) {
if (grayDecision.test(bambooRequest)) {
return true;
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..191bbc0e 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
@@ -6,17 +6,14 @@
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;
-
-
/**
* 灰度发布的负载规则
*/
@@ -55,8 +52,8 @@ public Server choose(Object key) {
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) {
+ String instanceId = ServiceUtil.getInstanceId(server);
+ if (grayService.getGrayInstance(instanceId) != null) {
grayServers.add(server);
} else {
normalServers.add(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..34c39f90
--- /dev/null
+++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/utils/ServiceUtil.java
@@ -0,0 +1,52 @@
+package cn.springcloud.gray.utils;
+
+import com.netflix.loadbalancer.Server;
+import org.apache.curator.x.discovery.ServiceInstance;
+import org.springframework.cloud.client.serviceregistry.Registration;
+import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration;
+import org.springframework.cloud.zookeeper.discovery.ZookeeperInstance;
+import org.springframework.cloud.zookeeper.discovery.ZookeeperServer;
+import org.springframework.cloud.zookeeper.serviceregistry.ZookeeperRegistration;
+
+/**
+ * @Author: duozl
+ * @Date: 2018/6/5 15:56
+ */
+public class ServiceUtil {
+
+ public static String getInstanceId(Server server) {
+ String instanceId;
+ try {
+ if (server instanceof ZookeeperServer) {
+ return server.getHostPort();
+ }
+ } catch (Exception e) {
+ // do nothing,可能是类找不到等原因,如果引入了zookeeper的依赖,这个不会找不到
+ }
+ instanceId = server.getMetaInfo().getInstanceId();
+ return instanceId;
+ }
+
+ public static String getInstanceId(Registration registration) {
+ String instanceId = null;
+ try {
+ if (registration instanceof ZookeeperRegistration) {
+ ServiceInstance instance = ((ZookeeperRegistration) registration)
+ .getServiceInstance();
+ instanceId = instance.getAddress() + ":" + instance.getPort();
+ }
+ } catch (Throwable e) {
+ // do nothing,可能是类找不到等原因,如果引入了zookeeper的依赖,这个不会找不到
+ }
+
+ try {
+ if (registration instanceof EurekaRegistration) {
+ instanceId = ((EurekaRegistration) registration).getInstanceConfig().getInstanceId();
+ }
+ } catch (Throwable e) {
+ // do nothing,可能是类找不到等原因,如果引入了eureka的依赖,这个不会找不到
+ }
+
+ return instanceId;
+ }
+}
diff --git a/spring-cloud-gray-core/pom.xml b/spring-cloud-gray-core/pom.xml
index af58e5d1..2aebc546 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-SNAPSHOT
4.0.0
diff --git a/spring-cloud-gray-dependencies/pom.xml b/spring-cloud-gray-dependencies/pom.xml
index 1cabdb9f..66c100f6 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-SNAPSHOT
pom
diff --git a/spring-cloud-gray-samples/pom.xml b/spring-cloud-gray-samples/pom.xml
index 482d3672..4750ed71 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-SNAPSHOT
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..5ed4fead 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-SNAPSHOT
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..03610853 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-SNAPSHOT
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..00862faf 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-SNAPSHOT
4.0.0
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..d19883f6 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-SNAPSHOT
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..c0f6a8e2 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-SNAPSHOT
4.0.0
diff --git a/spring-cloud-gray-server/pom.xml b/spring-cloud-gray-server/pom.xml
index b794c0cf..290c7f48 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-SNAPSHOT
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..610bfa4b
--- /dev/null
+++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/AbstractGrayService.java
@@ -0,0 +1,140 @@
+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.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 io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.http.ResponseEntity;
+
+import java.util.List;
+
+public abstract class AbstractGrayService {
+
+ private GrayServiceManager grayServiceManager;
+
+ public AbstractGrayService(GrayServiceManager grayServiceManager) {
+ this.grayServiceManager = grayServiceManager;
+ }
+
+ /**
+ * 返回所有服务
+ *
+ * @return 灰度服务VO集合
+ */
+ public abstract ResponseEntity> services();
+
+
+ /**
+ * 返回服务实例列表
+ *
+ * @param serviceId 服务id
+ * @return 灰度服务实例VO列表
+ */
+ public abstract ResponseEntity> instances(String serviceId);
+
+
+ @ApiOperation(value = "更新实例灰度状态")
+ public ResponseEntity editInstanceStatus(String serviceId, String instanceId,
+ @ApiParam("0:关闭, 1:启用") 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);
+
+
+ @ApiOperation(value = "更新实例策略组启用状态")
+ public ResponseEntity editPolicyGroupStatus(String serviceId, String instanceId, String groupId,
+ @ApiParam("0:关闭, 1:启用") 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
+ */
+ @ApiOperation("删除策略组")
+ 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..ec4bd9c9
--- /dev/null
+++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/EurekaGrayService.java
@@ -0,0 +1,147 @@
+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.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 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);
+ this.eurekaClient = eurekaClient;
+ this.discoveryClient = discoveryClient;
+ this.grayServiceManager = grayServiceManager;
+ }
+
+
+ /**
+ * 返回所有服务
+ *
+ * @return 灰度服务VO集合
+ */
+ @Override
+ 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);
+ }
+
+
+ /**
+ * 返回服务实例列表
+ *
+ * @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..14d33dd8
--- /dev/null
+++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/ZookeeperGrayService.java
@@ -0,0 +1,158 @@
+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.vo.GrayInstanceVO;
+import cn.springcloud.gray.server.resources.domain.vo.GrayPolicyGroupVO;
+import cn.springcloud.gray.server.resources.domain.vo.GrayServiceVO;
+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 final DiscoveryClient discoveryClient;
+ private final GrayServiceManager grayServiceManager;
+
+ @Autowired
+ public ZookeeperGrayService(DiscoveryClient discoveryClient, GrayServiceManager grayServiceManager) {
+ super(grayServiceManager);
+ this.discoveryClient = discoveryClient;
+ this.grayServiceManager = grayServiceManager;
+ }
+
+
+ /**
+ * 返回所有服务
+ *
+ * @return 灰度服务VO集合
+ */
+ @Override
+ 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列表
+ */
+ @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 = instance.getHost() + ":" + instance.getPort();
+ 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(instance.getHost() + ":" + instance.getPort()))
+ .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(instance.getHost() + ":" + instance.getPort()))
+ .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();
+ }
+}
diff --git a/spring-cloud-gray-zookeeper-samples/README.md b/spring-cloud-gray-zookeeper-samples/README.md
new file mode 100644
index 00000000..ac94cb5e
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/README.md
@@ -0,0 +1,142 @@
+## 灰度发布使用说明
+(以下说明都是假设浏览者对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-eureka
+
+
+
+ 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-eureka
+
+
+ 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
+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..75e96db0
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/pom.xml
@@ -0,0 +1,35 @@
+
+
+
+ spring-cloud-gray
+ cn.springcloud.gray
+ 1.1.0-SNAPSHOT
+
+ 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..64cea223
--- /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-SNAPSHOT
+
+ 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..0584a8a6
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-server-sample/src/main/resources/config/application.yml
@@ -0,0 +1,13 @@
+spring:
+ application:
+ name: gray-server
+ cloud:
+ zookeeper:
+ connect-string: 127.0.0.1:2181
+ discovery:
+ register: true
+ root: dev
+ instance-port: ${server.port}
+
+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..961d2964
--- /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-SNAPSHOT
+
+ 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..c0c00a6c
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-a-sample/src/main/resources/config/application.yml
@@ -0,0 +1,18 @@
+spring:
+ application:
+ name: service-a
+ cloud:
+ zookeeper:
+ connect-string: 127.0.0.1:2181
+ discovery:
+ register: true
+ root: dev
+ instance-port: ${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..18fafbc6
--- /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-SNAPSHOT
+
+ 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..163311bc
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-service-b-sample/src/main/resources/config/application.yml
@@ -0,0 +1,22 @@
+spring:
+ application:
+ name: service-b
+ cloud:
+ zookeeper:
+ connect-string: 127.0.0.1:2181
+ discovery:
+ register: true
+ root: dev
+ instance-port: ${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..354a9318
--- /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-SNAPSHOT
+
+ 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..19c9d13d
--- /dev/null
+++ b/spring-cloud-gray-zookeeper-samples/spring-cloud-gray-zookeeper-zuul-sample/src/main/resources/config/application.yml
@@ -0,0 +1,31 @@
+spring:
+ application:
+ name: api-gateway
+ cloud:
+ zookeeper:
+ connect-string: 127.0.0.1:2181
+ discovery:
+ register: true
+ root: dev
+ instance-port: ${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..d9d739f4 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-SNAPSHOT
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..d9b8dce8 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-SNAPSHOT
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..da2f99f4 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-SNAPSHOT
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..7ef91142 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-SNAPSHOT
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..0060ffc7 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-SNAPSHOT
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..7299997f 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-SNAPSHOT
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..04edfb20 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-SNAPSHOT
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..908f4050 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-SNAPSHOT
4.0.0
diff --git a/spring-cloud-starter-gray-server/pom.xml b/spring-cloud-starter-gray-server/pom.xml
index 4f4c3036..ed3a0eb9 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-SNAPSHOT
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..542ff6ad 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-SNAPSHOT
4.0.0
diff --git a/spring-cloud-starter-multi-version/pom.xml b/spring-cloud-starter-multi-version/pom.xml
index 31a1fc4b..7399902d 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-SNAPSHOT
4.0.0
From ee29a033e787d1da2b88963111297bb22fc8628c Mon Sep 17 00:00:00 2001
From: eric <935658701@qq.com>
Date: Tue, 5 Jun 2018 19:29:16 +0800
Subject: [PATCH 2/3] =?UTF-8?q?=E7=81=B0=E5=BA=A6=E5=8F=91=E5=B8=83?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AF=B9zookeeper=E7=9A=84=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 1 +
.../config/GrayClientAutoConfiguration.java | 21 --------
.../GrayClientEurekaAutoConfiguration.java | 31 ++++++++++++
.../GrayClientZookeeperAutoConfiguration.java | 43 ++++++++++++++++
.../properties/GrayClientProperties.java | 11 ++++-
.../gray/ribbon/GrayDecisionPredicate.java | 14 ++++--
.../gray/ribbon/GrayLoadBalanceRule.java | 15 ++++--
.../springcloud/gray/utils/ServiceUtil.java | 44 +++++------------
.../src/main/resources/config/application.yml | 4 +-
.../server/service/AbstractGrayService.java | 43 +++++++++++-----
.../server/service/EurekaGrayService.java | 32 +-----------
.../server/service/ZookeeperGrayService.java | 49 +++++--------------
spring-cloud-gray-zookeeper-samples/README.md | 20 +++++++-
.../src/main/resources/config/application.yml | 1 -
.../src/main/resources/config/application.yml | 3 +-
.../src/main/resources/config/application.yml | 4 +-
.../src/main/resources/config/application.yml | 5 +-
.../main/resources/META-INF/spring.factories | 4 +-
18 files changed, 190 insertions(+), 155 deletions(-)
create mode 100644 spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientEurekaAutoConfiguration.java
create mode 100644 spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientZookeeperAutoConfiguration.java
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/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 66ca5ebe..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,15 +12,12 @@
import cn.springcloud.gray.core.GrayManager;
import cn.springcloud.gray.core.InformationClient;
import cn.springcloud.gray.decision.DefaultGrayDecisionFactory;
-import cn.springcloud.gray.utils.ServiceUtil;
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.cloud.client.serviceregistry.Registration;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
-import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
@@ -53,23 +49,6 @@ public GrayClientInitializingBean grayClientInitializingBean() {
return new GrayClientInitializingBean();
}
-
- @Bean
- @ConditionalOnMissingBean
- public InstanceLocalInfo instanceLocalInfo(@Autowired ApplicationContext context,
- @Autowired Registration registration) {
- String instanceId = ServiceUtil.getInstanceId(registration);
- if(null == instanceId){
- context.getId();
- }
-
- InstanceLocalInfo localInfo = new InstanceLocalInfo();
- localInfo.setInstanceId(instanceId);
- localInfo.setServiceId(registration.getServiceId());
- localInfo.setGray(false);
- return localInfo;
- }
-
@Bean
@ConditionalOnMissingBean
public GrayDecisionFactory grayDecisionFactory() {
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 c202ed3d..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,5 +1,6 @@
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;
@@ -9,6 +10,7 @@
import com.netflix.loadbalancer.Server;
import java.util.List;
+import java.util.Map;
public class GrayDecisionPredicate extends AbstractServerPredicate {
@@ -22,12 +24,14 @@ public boolean apply(PredicateKey input) {
if (bambooRequestContext == null || bambooRequestContext.getBambooRequest() == null) {
return false;
}
+ BambooRequest bambooRequest = bambooRequestContext.getBambooRequest();
Server server = input.getServer();
- String instanceId = ServiceUtil.getInstanceId(server);
+ String serviceId = bambooRequest.getServiceId();
+ Map serverMetadata = getServerMetadata(serviceId, server);
+ String instanceId = ServiceUtil.getInstanceId(server, serverMetadata);
- BambooRequest bambooRequest = bambooRequestContext.getBambooRequest();
List grayDecisions =
- getIRule().getGrayManager().grayDecision(bambooRequest.getServiceId(), instanceId);
+ getIRule().getGrayManager().grayDecision(serviceId, instanceId);
for (GrayDecision grayDecision : grayDecisions) {
if (grayDecision.test(bambooRequest)) {
return true;
@@ -41,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 191bbc0e..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,5 +1,6 @@
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;
@@ -13,6 +14,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
/**
* 灰度发布的负载规则
@@ -46,13 +48,15 @@ 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) {
- String instanceId = ServiceUtil.getInstanceId(server);
+ Map serverMetadata = getServerMetadata(serviceId, server);
+ String instanceId = ServiceUtil.getInstanceId(server, serverMetadata);
if (grayService.getGrayInstance(instanceId) != null) {
grayServers.add(server);
} else {
@@ -98,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
index 34c39f90..87b783cf 100644
--- 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
@@ -1,52 +1,30 @@
package cn.springcloud.gray.utils;
import com.netflix.loadbalancer.Server;
-import org.apache.curator.x.discovery.ServiceInstance;
-import org.springframework.cloud.client.serviceregistry.Registration;
-import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration;
-import org.springframework.cloud.zookeeper.discovery.ZookeeperInstance;
import org.springframework.cloud.zookeeper.discovery.ZookeeperServer;
-import org.springframework.cloud.zookeeper.serviceregistry.ZookeeperRegistration;
+
+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) {
- String instanceId;
+ public static String getInstanceId(Server server, Map serverMetadata) {
try {
if (server instanceof ZookeeperServer) {
- return server.getHostPort();
- }
- } catch (Exception e) {
- // do nothing,可能是类找不到等原因,如果引入了zookeeper的依赖,这个不会找不到
- }
- instanceId = server.getMetaInfo().getInstanceId();
- return instanceId;
- }
-
- public static String getInstanceId(Registration registration) {
- String instanceId = null;
- try {
- if (registration instanceof ZookeeperRegistration) {
- ServiceInstance instance = ((ZookeeperRegistration) registration)
- .getServiceInstance();
- instanceId = instance.getAddress() + ":" + instance.getPort();
+ 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的依赖,这个不会找不到
}
-
- try {
- if (registration instanceof EurekaRegistration) {
- instanceId = ((EurekaRegistration) registration).getInstanceConfig().getInstanceId();
- }
- } catch (Throwable e) {
- // do nothing,可能是类找不到等原因,如果引入了eureka的依赖,这个不会找不到
- }
-
- return instanceId;
+ return server.getMetaInfo().getInstanceId();
}
}
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-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
index 610bfa4b..cb1999e5 100644
--- 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
@@ -2,23 +2,27 @@
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 io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+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) {
+ public AbstractGrayService(GrayServiceManager grayServiceManager, DiscoveryClient discoveryClient) {
this.grayServiceManager = grayServiceManager;
+ this.discoveryClient = discoveryClient;
}
/**
@@ -26,8 +30,27 @@ public AbstractGrayService(GrayServiceManager grayServiceManager) {
*
* @return 灰度服务VO集合
*/
- public abstract ResponseEntity> services();
-
+ 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);
+ }
/**
* 返回服务实例列表
@@ -37,10 +60,7 @@ public AbstractGrayService(GrayServiceManager grayServiceManager) {
*/
public abstract ResponseEntity> instances(String serviceId);
-
- @ApiOperation(value = "更新实例灰度状态")
- public ResponseEntity editInstanceStatus(String serviceId, String instanceId,
- @ApiParam("0:关闭, 1:启用") int status) {
+ public ResponseEntity editInstanceStatus(String serviceId, String instanceId, int status) {
return grayServiceManager.updateInstanceStatus(serviceId, instanceId, status)
? ResponseEntity.ok().build() : ResponseEntity.badRequest().build();
@@ -68,9 +88,7 @@ public ResponseEntity editInstanceStatus(String serviceId, String instance
public abstract ResponseEntity policyGroup(String serviceId, String instanceId, String groupId);
- @ApiOperation(value = "更新实例策略组启用状态")
- public ResponseEntity editPolicyGroupStatus(String serviceId, String instanceId, String groupId,
- @ApiParam("0:关闭, 1:启用") int enable) {
+ public ResponseEntity editPolicyGroupStatus(String serviceId, String instanceId, String groupId, int enable) {
return grayServiceManager.updatePolicyGroupStatus(serviceId, instanceId, groupId, enable)
? ResponseEntity.ok().build() :
@@ -109,7 +127,6 @@ public ResponseEntity policyGroup(String serviceId, GrayPolicyGroupFO poli
* @param policyGroupId 灰度策略组id
* @return Void
*/
- @ApiOperation("删除策略组")
public ResponseEntity delPolicyGroup(String serviceId, String instanceId, String policyGroupId) {
GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceId);
if (grayInstance != null) {
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
index ec4bd9c9..e36ecfad 100644
--- 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
@@ -2,11 +2,9 @@
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.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;
@@ -31,40 +29,12 @@ public class EurekaGrayService extends AbstractGrayService {
@Autowired
public EurekaGrayService(EurekaClient eurekaClient, DiscoveryClient discoveryClient, GrayServiceManager
grayServiceManager) {
- super(grayServiceManager);
+ super(grayServiceManager, discoveryClient);
this.eurekaClient = eurekaClient;
this.discoveryClient = discoveryClient;
this.grayServiceManager = grayServiceManager;
}
-
- /**
- * 返回所有服务
- *
- * @return 灰度服务VO集合
- */
- @Override
- 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);
- }
-
-
/**
* 返回服务实例列表
*
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
index 14d33dd8..493a8394 100644
--- 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
@@ -2,11 +2,9 @@
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.vo.GrayInstanceVO;
import cn.springcloud.gray.server.resources.domain.vo.GrayPolicyGroupVO;
-import cn.springcloud.gray.server.resources.domain.vo.GrayServiceVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.cloud.client.ServiceInstance;
@@ -22,47 +20,18 @@
@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);
+ super(grayServiceManager, discoveryClient);
this.discoveryClient = discoveryClient;
this.grayServiceManager = grayServiceManager;
}
-
- /**
- * 返回所有服务
- *
- * @return 灰度服务VO集合
- */
- @Override
- 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);
- }
-
-
/**
* 返回服务实例列表
*
@@ -75,7 +44,7 @@ public ResponseEntity> instances(String serviceId) {
List instances = discoveryClient.getInstances(serviceId);
if (null != instances && !instances.isEmpty()) {
instances.forEach(instance -> {
- String instanceId = instance.getHost() + ":" + instance.getPort();
+ String instanceId = getInstanceId(instance);
GrayInstanceVO vo = new GrayInstanceVO();
vo.setAppName(serviceId);
vo.setServiceId(serviceId);
@@ -93,7 +62,6 @@ public ResponseEntity> instances(String serviceId) {
return ResponseEntity.ok(list);
}
-
/**
* 服务实例的所有灰度策略组
*
@@ -109,7 +77,7 @@ public ResponseEntity> policyGroups(String serviceId, St
}
ServiceInstance serviceInstance = instances.stream()
- .filter(instance -> instanceId.equals(instance.getHost() + ":" + instance.getPort()))
+ .filter(instance -> instanceId.equals(getInstanceId(instance)))
.findFirst().orElse(null);
GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceId);
@@ -142,7 +110,7 @@ public ResponseEntity policyGroup(String serviceId, String in
}
ServiceInstance serviceInstance = instances.stream()
- .filter(instance -> instanceId.equals(instance.getHost() + ":" + instance.getPort()))
+ .filter(instance -> instanceId.equals(getInstanceId(instance)))
.findFirst().orElse(null);
GrayInstance grayInstance = grayServiceManager.getGrayInstane(serviceId, instanceId);
@@ -155,4 +123,11 @@ public ResponseEntity policyGroup(String serviceId, String in
}
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
index ac94cb5e..d84e74d6 100644
--- a/spring-cloud-gray-zookeeper-samples/README.md
+++ b/spring-cloud-gray-zookeeper-samples/README.md
@@ -16,7 +16,7 @@
org.springframework.cloud
- spring-cloud-starter-eureka
+ spring-cloud-starter-zookeeper-discovery
@@ -78,7 +78,7 @@ public class GrayServerApplication {
org.springframework.cloud
- spring-cloud-starter-eureka
+ spring-cloud-starter-zookeeper-discovery
org.springframework.cloud
@@ -100,6 +100,22 @@ public class GrayServerApplication {
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:
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
index 0584a8a6..bf4ae0d6 100644
--- 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
@@ -7,7 +7,6 @@ spring:
discovery:
register: true
root: dev
- instance-port: ${server.port}
server:
port: 20202
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
index c0c00a6c..f1fe7d4e 100644
--- 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
@@ -7,7 +7,8 @@ spring:
discovery:
register: true
root: dev
- instance-port: ${server.port}
+ metadata:
+ instanceId: ${spring.application.name}:${java.rmi.server.hostname}:${server.port}
server:
port: 20101
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
index 163311bc..eeabd291 100644
--- 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
@@ -7,7 +7,9 @@ spring:
discovery:
register: true
root: dev
- instance-port: ${server.port}
+ metadata:
+ instanceId: ${spring.application.name}:${java.rmi.server.hostname}:${server.port}
+
server:
port: 20102
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
index 19c9d13d..e179a36c 100644
--- 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
@@ -7,9 +7,8 @@ spring:
discovery:
register: true
root: dev
- instance-port: ${server.port}
-
-
+ metadata:
+ instanceId: ${spring.application.name}:${java.rmi.server.hostname}:${server.port}
server:
port: 20301
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
From f89bcb339e58bdfd346f6fc6cef63677cb0463e9 Mon Sep 17 00:00:00 2001
From: javaerEric
Date: Tue, 5 Jun 2018 21:15:36 +0800
Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?=
=?UTF-8?q?=E5=8F=B7=E5=88=B01.1.0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
spring-cloud-bamboo/pom.xml | 2 +-
spring-cloud-gray-client/pom.xml | 2 +-
spring-cloud-gray-core/pom.xml | 2 +-
spring-cloud-gray-dependencies/pom.xml | 2 +-
spring-cloud-gray-samples/pom.xml | 2 +-
.../spring-cloud-gray-eureka-sample/pom.xml | 2 +-
.../spring-cloud-gray-server-sample/pom.xml | 2 +-
.../spring-cloud-gray-service-a-sample/pom.xml | 2 +-
.../spring-cloud-gray-service-b-sample/pom.xml | 2 +-
spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/pom.xml | 2 +-
spring-cloud-gray-server/pom.xml | 2 +-
spring-cloud-gray-zookeeper-samples/pom.xml | 2 +-
.../spring-cloud-gray-zookeeper-server-sample/pom.xml | 2 +-
.../spring-cloud-gray-zookeeper-service-a-sample/pom.xml | 2 +-
.../spring-cloud-gray-zookeeper-service-b-sample/pom.xml | 2 +-
.../spring-cloud-gray-zookeeper-zuul-sample/pom.xml | 2 +-
spring-cloud-mult-version-samples/pom.xml | 2 +-
.../spring-cloud-bamboo-eureka-samples/pom.xml | 2 +-
.../spring-cloud-bamboo-service-a-samples/pom.xml | 2 +-
.../spring-cloud-bamboo-service-b-samples/pom.xml | 2 +-
.../spring-cloud-bamboo-service-c-samples/pom.xml | 2 +-
.../spring-cloud-bamboo-service-d-samples/pom.xml | 2 +-
.../spring-cloud-bamboo-zuul-samples/pom.xml | 2 +-
.../spring-cloud-bamboo-zuul-zookeeper-samples/pom.xml | 2 +-
spring-cloud-starter-gray-server/pom.xml | 2 +-
spring-cloud-starter-gray/pom.xml | 2 +-
spring-cloud-starter-multi-version/pom.xml | 2 +-
28 files changed, 28 insertions(+), 28 deletions(-)
diff --git a/pom.xml b/pom.xml
index 0b8cb452..69cd894a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
cn.springcloud.gray
spring-cloud-gray
pom
- 1.1.0-SNAPSHOT
+ 1.1.0
org.springframework.boot
spring-boot-starter-parent
diff --git a/spring-cloud-bamboo/pom.xml b/spring-cloud-bamboo/pom.xml
index 25345a53..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.1.0-SNAPSHOT
+ 1.1.0
4.0.0
diff --git a/spring-cloud-gray-client/pom.xml b/spring-cloud-gray-client/pom.xml
index 359f45c0..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.1.0-SNAPSHOT
+ 1.1.0
4.0.0
diff --git a/spring-cloud-gray-core/pom.xml b/spring-cloud-gray-core/pom.xml
index 2aebc546..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.1.0-SNAPSHOT
+ 1.1.0
4.0.0
diff --git a/spring-cloud-gray-dependencies/pom.xml b/spring-cloud-gray-dependencies/pom.xml
index 66c100f6..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.1.0-SNAPSHOT
+ 1.1.0
pom
diff --git a/spring-cloud-gray-samples/pom.xml b/spring-cloud-gray-samples/pom.xml
index 4750ed71..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.1.0-SNAPSHOT
+ 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 5ed4fead..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.1.0-SNAPSHOT
+ 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 03610853..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.1.0-SNAPSHOT
+ 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 00862faf..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.1.0-SNAPSHOT
+ 1.1.0
4.0.0
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 d19883f6..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.1.0-SNAPSHOT
+ 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 c0f6a8e2..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.1.0-SNAPSHOT
+ 1.1.0
4.0.0
diff --git a/spring-cloud-gray-server/pom.xml b/spring-cloud-gray-server/pom.xml
index 290c7f48..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.1.0-SNAPSHOT
+ 1.1.0
4.0.0
diff --git a/spring-cloud-gray-zookeeper-samples/pom.xml b/spring-cloud-gray-zookeeper-samples/pom.xml
index 75e96db0..4a4200d6 100644
--- a/spring-cloud-gray-zookeeper-samples/pom.xml
+++ b/spring-cloud-gray-zookeeper-samples/pom.xml
@@ -5,7 +5,7 @@
spring-cloud-gray
cn.springcloud.gray
- 1.1.0-SNAPSHOT
+ 1.1.0
4.0.0
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
index 64cea223..91e4926d 100644
--- 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
@@ -5,7 +5,7 @@
spring-cloud-gray-zookeeper-samples
cn.springcloud.gray
- 1.1.0-SNAPSHOT
+ 1.1.0
4.0.0
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
index 961d2964..11e10887 100644
--- 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
@@ -5,7 +5,7 @@
spring-cloud-gray-zookeeper-samples
cn.springcloud.gray
- 1.1.0-SNAPSHOT
+ 1.1.0
4.0.0
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
index 18fafbc6..23bbcfe7 100644
--- 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
@@ -5,7 +5,7 @@
spring-cloud-gray-zookeeper-samples
cn.springcloud.gray
- 1.1.0-SNAPSHOT
+ 1.1.0
4.0.0
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
index 354a9318..7e65962c 100644
--- 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
@@ -5,7 +5,7 @@
spring-cloud-gray-zookeeper-samples
cn.springcloud.gray
- 1.1.0-SNAPSHOT
+ 1.1.0
4.0.0
diff --git a/spring-cloud-mult-version-samples/pom.xml b/spring-cloud-mult-version-samples/pom.xml
index d9d739f4..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.1.0-SNAPSHOT
+ 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 d9b8dce8..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.1.0-SNAPSHOT
+ 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 da2f99f4..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.1.0-SNAPSHOT
+ 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 7ef91142..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.1.0-SNAPSHOT
+ 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 0060ffc7..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.1.0-SNAPSHOT
+ 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 7299997f..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.1.0-SNAPSHOT
+ 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 04edfb20..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.1.0-SNAPSHOT
+ 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 908f4050..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.1.0-SNAPSHOT
+ 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 ed3a0eb9..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.1.0-SNAPSHOT
+ 1.1.0
4.0.0
diff --git a/spring-cloud-starter-gray/pom.xml b/spring-cloud-starter-gray/pom.xml
index 542ff6ad..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.1.0-SNAPSHOT
+ 1.1.0
4.0.0
diff --git a/spring-cloud-starter-multi-version/pom.xml b/spring-cloud-starter-multi-version/pom.xml
index 7399902d..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.1.0-SNAPSHOT
+ 1.1.0
4.0.0