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 查看接口列表,也可以调用其中的接口。 + +![灰度服务端swagger api list](../doc/img/web-api-gray-server.png) + +以上介绍完了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