From f0e411d3d7530ca8dfc3cfedec717becda368693 Mon Sep 17 00:00:00 2001 From: saleson Date: Mon, 20 May 2019 13:24:00 +0800 Subject: [PATCH 01/14] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- spring-cloud-gray-client-netflix/pom.xml | 2 +- spring-cloud-gray-client/pom.xml | 2 +- spring-cloud-gray-core/pom.xml | 2 +- spring-cloud-gray-dependencies/pom.xml | 4 ++-- spring-cloud-gray-samples/pom.xml | 2 +- .../spring-cloud-gray-eureka-sample/pom.xml | 4 ++-- .../spring-cloud-gray-server-sample/pom.xml | 2 +- .../spring-cloud-gray-service-a-sample/pom.xml | 2 +- .../spring-cloud-gray-service-a1-sample/pom.xml | 2 +- .../spring-cloud-gray-service-b-sample/pom.xml | 2 +- .../spring-cloud-gray-stream-sample/pom.xml | 2 +- .../spring-cloud-gray-zuul-sample/pom.xml | 2 +- spring-cloud-gray-server/pom.xml | 2 +- spring-cloud-gray-starter-dependencies/pom.xml | 2 +- spring-cloud-gray-utils/pom.xml | 2 +- spring-cloud-gray-webui/pom.xml | 2 +- spring-cloud-starter-gray-client/pom.xml | 2 +- spring-cloud-starter-gray-eureka-server/pom.xml | 2 +- spring-cloud-starter-gray-server/pom.xml | 2 +- 20 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index b99a1c30..1ab7a6b8 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ cn.springcloud.gray spring-cloud-gray pom - 2.1.0 + A.1.0.0 https://github.com/SpringCloud/spring-cloud-gray Spring Cloud中国社区 diff --git a/spring-cloud-gray-client-netflix/pom.xml b/spring-cloud-gray-client-netflix/pom.xml index 76b842d0..22c76783 100644 --- a/spring-cloud-gray-client-netflix/pom.xml +++ b/spring-cloud-gray-client-netflix/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - 2.1.0 + A.1.0.0 4.0.0 diff --git a/spring-cloud-gray-client/pom.xml b/spring-cloud-gray-client/pom.xml index 0e32020c..9b20c5eb 100644 --- a/spring-cloud-gray-client/pom.xml +++ b/spring-cloud-gray-client/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - 2.1.0 + A.1.0.0 4.0.0 diff --git a/spring-cloud-gray-core/pom.xml b/spring-cloud-gray-core/pom.xml index 47833ceb..479c0042 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 - 2.1.0 + A.1.0.0 4.0.0 diff --git a/spring-cloud-gray-dependencies/pom.xml b/spring-cloud-gray-dependencies/pom.xml index 24f2b676..b3b37d49 100644 --- a/spring-cloud-gray-dependencies/pom.xml +++ b/spring-cloud-gray-dependencies/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - 2.1.0 + A.1.0.0 @@ -17,7 +17,7 @@ cn.springcloud.gray spring-cloud-gray-dependencies - 2.1.0 + A.1.0.0 pom diff --git a/spring-cloud-gray-samples/pom.xml b/spring-cloud-gray-samples/pom.xml index 63664fdf..8be9cacc 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 - 2.1.0 + A.1.0.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 9e3d32c0..9d884731 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 - 2.1.0 + A.1.0.0 4.0.0 @@ -20,7 +20,7 @@ spring-cloud-gray-utils cn.springcloud.gray - 2.1.0 + A.1.0.0 org.springframework.boot 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 f02f4881..44b8d729 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 - 2.1.0 + A.1.0.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 7d6a0317..c7ecb33a 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 - 2.1.0 + A.1.0.0 4.0.0 diff --git a/spring-cloud-gray-samples/spring-cloud-gray-service-a1-sample/pom.xml b/spring-cloud-gray-samples/spring-cloud-gray-service-a1-sample/pom.xml index 5972f88a..4dddcd03 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-service-a1-sample/pom.xml +++ b/spring-cloud-gray-samples/spring-cloud-gray-service-a1-sample/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray-samples cn.springcloud.gray - 2.1.0 + A.1.0.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 347c01f1..90ecaf74 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 - 2.1.0 + A.1.0.0 4.0.0 diff --git a/spring-cloud-gray-samples/spring-cloud-gray-stream-sample/pom.xml b/spring-cloud-gray-samples/spring-cloud-gray-stream-sample/pom.xml index cc96b623..e735123d 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-stream-sample/pom.xml +++ b/spring-cloud-gray-samples/spring-cloud-gray-stream-sample/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray-samples cn.springcloud.gray - 2.1.0 + A.1.0.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 dbf75869..411516b2 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 - 2.1.0 + A.1.0.0 4.0.0 diff --git a/spring-cloud-gray-server/pom.xml b/spring-cloud-gray-server/pom.xml index a1af1066..c10fff4c 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 - 2.1.0 + A.1.0.0 4.0.0 diff --git a/spring-cloud-gray-starter-dependencies/pom.xml b/spring-cloud-gray-starter-dependencies/pom.xml index a9fb6975..b972caec 100644 --- a/spring-cloud-gray-starter-dependencies/pom.xml +++ b/spring-cloud-gray-starter-dependencies/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - 2.1.0 + A.1.0.0 4.0.0 diff --git a/spring-cloud-gray-utils/pom.xml b/spring-cloud-gray-utils/pom.xml index c57924e2..301e08fb 100644 --- a/spring-cloud-gray-utils/pom.xml +++ b/spring-cloud-gray-utils/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - 2.1.0 + A.1.0.0 4.0.0 diff --git a/spring-cloud-gray-webui/pom.xml b/spring-cloud-gray-webui/pom.xml index a16291d1..3c86dc64 100644 --- a/spring-cloud-gray-webui/pom.xml +++ b/spring-cloud-gray-webui/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - 2.1.0 + A.1.0.0 4.0.0 diff --git a/spring-cloud-starter-gray-client/pom.xml b/spring-cloud-starter-gray-client/pom.xml index 823d6925..254d6e17 100644 --- a/spring-cloud-starter-gray-client/pom.xml +++ b/spring-cloud-starter-gray-client/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - 2.1.0 + A.1.0.0 4.0.0 diff --git a/spring-cloud-starter-gray-eureka-server/pom.xml b/spring-cloud-starter-gray-eureka-server/pom.xml index 16fd2a23..30362f3b 100644 --- a/spring-cloud-starter-gray-eureka-server/pom.xml +++ b/spring-cloud-starter-gray-eureka-server/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - 2.1.0 + A.1.0.0 4.0.0 diff --git a/spring-cloud-starter-gray-server/pom.xml b/spring-cloud-starter-gray-server/pom.xml index 95b5f717..49c16ef1 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 - 2.1.0 + A.1.0.0 4.0.0 From 12ff0f015ca8d246aa18cac06268d42560aa265c Mon Sep 17 00:00:00 2001 From: saleson Date: Mon, 20 May 2019 13:59:41 +0800 Subject: [PATCH 02/14] =?UTF-8?q?=E4=BC=98=E5=8C=96DefultRibbonConnectionP?= =?UTF-8?q?oint;=20=E6=96=B0=E5=A2=9E=E6=94=AF=E6=8C=81Hystrix=E7=9A=84Rib?= =?UTF-8?q?bonConnectionPoint=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HystrixGrayAutoConfiguration.java | 15 ++++++++ .../DefaultHystrixRibbonConnectionPoint.java | 38 +++++++++++++++++++ .../DefaultRibbonConnectionPoint.java | 38 ++++++------------- 3 files changed, 65 insertions(+), 26 deletions(-) create mode 100644 spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/connectionpoint/DefaultHystrixRibbonConnectionPoint.java diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java index a274db50..8a53835e 100644 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java @@ -1,6 +1,8 @@ package cn.springcloud.gray.client.netflix.configuration; import cn.springcloud.gray.GrayManager; +import cn.springcloud.gray.client.netflix.connectionpoint.DefaultHystrixRibbonConnectionPoint; +import cn.springcloud.gray.client.netflix.connectionpoint.RibbonConnectionPoint; import cn.springcloud.gray.client.netflix.hystrix.HystrixRequestLocalStorage; import cn.springcloud.gray.request.RequestLocalStorage; import cn.springcloud.gray.request.track.GrayTrackHolder; @@ -26,6 +28,8 @@ public class HystrixGrayAutoConfiguration { @Autowired private GrayManager grayManager; + @Autowired + private RequestLocalStorage requestLocalStorage; @Bean @@ -55,4 +59,15 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha }; } + + /** + * 支持hystrix使用线程隔离时依然能够进行跑线程传递GrayRequest + * + * @return DefaultHystrixRibbonConnectionPoint + */ + @Bean + public RibbonConnectionPoint hystrixRibbonConnectionPoint() { + return new DefaultHystrixRibbonConnectionPoint(grayManager, requestLocalStorage); + } + } diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/connectionpoint/DefaultHystrixRibbonConnectionPoint.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/connectionpoint/DefaultHystrixRibbonConnectionPoint.java new file mode 100644 index 00000000..e2e82420 --- /dev/null +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/connectionpoint/DefaultHystrixRibbonConnectionPoint.java @@ -0,0 +1,38 @@ +package cn.springcloud.gray.client.netflix.connectionpoint; + +import cn.springcloud.gray.GrayManager; +import cn.springcloud.gray.request.RequestLocalStorage; +import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext; + +public class DefaultHystrixRibbonConnectionPoint extends DefaultRibbonConnectionPoint { + + private ThreadLocal hystrixRequestContextInitialized = new ThreadLocal<>(); + + public DefaultHystrixRibbonConnectionPoint(GrayManager grayManager, RequestLocalStorage requestLocalStorage) { + super(grayManager, requestLocalStorage); + } + + + @Override + public void executeConnectPoint(ConnectPointContext connectPointContext) { + if (!HystrixRequestContext.isCurrentThreadInitialized()) { + HystrixRequestContext.initializeContext(); + hystrixRequestContextInitialized.set(true); + } + super.executeConnectPoint(connectPointContext); + } + + @Override + public void shutdownconnectPoint(ConnectPointContext connectPointContext) { + try { + super.shutdownconnectPoint(connectPointContext); + } finally { + Boolean hystrixReqCxtInited = hystrixRequestContextInitialized.get(); + if (hystrixReqCxtInited != null && hystrixReqCxtInited && HystrixRequestContext.isCurrentThreadInitialized()) { + HystrixRequestContext.getContextForCurrentThread().shutdown(); + } + } + } + + +} diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/connectionpoint/DefaultRibbonConnectionPoint.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/connectionpoint/DefaultRibbonConnectionPoint.java index ece98572..994df1c6 100644 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/connectionpoint/DefaultRibbonConnectionPoint.java +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/connectionpoint/DefaultRibbonConnectionPoint.java @@ -4,7 +4,6 @@ import cn.springcloud.gray.RequestInterceptor; import cn.springcloud.gray.request.GrayRequest; import cn.springcloud.gray.request.RequestLocalStorage; -import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext; import java.util.List; @@ -12,7 +11,6 @@ public class DefaultRibbonConnectionPoint implements RibbonConnectionPoint { private GrayManager grayManager; private RequestLocalStorage requestLocalStorage; - private ThreadLocal hystrixRequestContextInitialized = new ThreadLocal<>(); public DefaultRibbonConnectionPoint(GrayManager grayManager, RequestLocalStorage requestLocalStorage) { this.grayManager = grayManager; @@ -22,11 +20,6 @@ public DefaultRibbonConnectionPoint(GrayManager grayManager, RequestLocalStorage @Override public void executeConnectPoint(ConnectPointContext connectPointContext) { - if (!HystrixRequestContext.isCurrentThreadInitialized()) { - HystrixRequestContext.initializeContext(); - hystrixRequestContextInitialized.set(true); - } - ConnectPointContext.setContextLocal(connectPointContext); GrayRequest grayRequest = connectPointContext.getGrayRequest(); grayRequest.setGrayTrackInfo(requestLocalStorage.getGrayTrackInfo()); @@ -45,28 +38,21 @@ public void executeConnectPoint(ConnectPointContext connectPointContext) { @Override public void shutdownconnectPoint(ConnectPointContext connectPointContext) { - try { - if (requestLocalStorage.getGrayRequest() == null) { - return; - } +// if (requestLocalStorage.getGrayRequest() == null) { +// return; +// } - List interceptors = grayManager.getRequeestInterceptors(connectPointContext.getInterceptroType()); - interceptors.forEach(interceptor -> { - if (interceptor.shouldIntercept()) { - if (!interceptor.after(connectPointContext.getGrayRequest())) { - return; - } + List interceptors = grayManager.getRequeestInterceptors(connectPointContext.getInterceptroType()); + interceptors.forEach(interceptor -> { + if (interceptor.shouldIntercept()) { + if (!interceptor.after(connectPointContext.getGrayRequest())) { + return; } - }); - ConnectPointContext.removeContextLocal(); - requestLocalStorage.removeGrayTrackInfo(); - requestLocalStorage.removeGrayRequest(); - } finally { - Boolean hystrixReqCxtInited = hystrixRequestContextInitialized.get(); - if (hystrixReqCxtInited != null && hystrixReqCxtInited && HystrixRequestContext.isCurrentThreadInitialized()) { - HystrixRequestContext.getContextForCurrentThread().shutdown(); } - } + }); + ConnectPointContext.removeContextLocal(); + requestLocalStorage.removeGrayTrackInfo(); + requestLocalStorage.removeGrayRequest(); } From 4110d25bd4619b136847c3a1731037e9d1223ddf Mon Sep 17 00:00:00 2001 From: saleson Date: Fri, 24 May 2019 18:39:29 +0800 Subject: [PATCH 03/14] =?UTF-8?q?=E4=BF=AE=E6=94=B9HttpInformationClient?= =?UTF-8?q?=E7=9A=84=E9=85=8D=E7=BD=AEBean?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gray/client/config/GrayClientAutoConfiguration.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 699193f2..50863097 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 @@ -19,6 +19,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.web.client.RestTemplate; import java.util.List; @@ -36,8 +37,8 @@ public class GrayClientAutoConfiguration { @Bean @ConditionalOnMissingBean @ConditionalOnProperty(value = "gray.client.serverUrl") - public InformationClient informationClient() { - InformationClient httpClient = new HttpInformationClient(grayClientProperties.getServerUrl()); + public InformationClient informationClient(@Autowired(required = false) RestTemplate restTemplate) { + InformationClient httpClient = new HttpInformationClient(grayClientProperties.getServerUrl(), restTemplate); if (grayClientProperties.isRetryable()) { return new RetryableInformationClient(Math.max(3, grayClientProperties.getRetryNumberOfRetries()), httpClient); } else { From 00c70745a03054c529170a94bd8016d30fd2adb5 Mon Sep 17 00:00:00 2001 From: saleson Date: Fri, 24 May 2019 21:14:09 +0800 Subject: [PATCH 04/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gray/client/netflix/ribbon/GrayLoadBalanceRule.java | 4 ++-- .../springcloud/gray/AbstractCommunicableGrayManager.java | 6 ------ .../main/java/cn/springcloud/gray/SimpleGrayManager.java | 3 ++- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/ribbon/GrayLoadBalanceRule.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/ribbon/GrayLoadBalanceRule.java index aa3b84b0..f5cd031a 100644 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/ribbon/GrayLoadBalanceRule.java +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/ribbon/GrayLoadBalanceRule.java @@ -3,9 +3,9 @@ import cn.springcloud.gray.GrayManager; import cn.springcloud.gray.client.netflix.GrayClientHolder; import cn.springcloud.gray.model.GrayService; -import cn.springcloud.gray.servernode.ServerExplainer; import cn.springcloud.gray.request.GrayRequest; import cn.springcloud.gray.request.RequestLocalStorage; +import cn.springcloud.gray.servernode.ServerExplainer; import com.google.common.base.Optional; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.*; @@ -93,7 +93,7 @@ public void setLoadBalancer(ILoadBalancer lb) { super.setLoadBalancer(lb); } - private Server choose(AbstractServerPredicate serverPredicate, List servers, Object key) { + protected Server choose(AbstractServerPredicate serverPredicate, List servers, Object key) { Optional server = serverPredicate.chooseRoundRobinAfterFiltering(servers, key); if (server.isPresent()) { return server.get(); diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/AbstractCommunicableGrayManager.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/AbstractCommunicableGrayManager.java index e96d59fb..b915c3db 100644 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/AbstractCommunicableGrayManager.java +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/AbstractCommunicableGrayManager.java @@ -16,7 +16,6 @@ public AbstractCommunicableGrayManager( super(grayDecisionFactoryKeeper, requestInterceptors); this.grayClientConfig = grayClientConfig; this.informationClient = informationClient; - createInformationClient(); } public GrayClientConfig getGrayClientConfig() { @@ -28,10 +27,5 @@ public InformationClient getGrayInformationClient() { return informationClient; } - protected void createInformationClient() { - - - } - } diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/SimpleGrayManager.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/SimpleGrayManager.java index e16ff48b..e7065b89 100644 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/SimpleGrayManager.java +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/SimpleGrayManager.java @@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -33,7 +34,7 @@ public boolean hasGray(String serviceId) { @Override public Collection allGrayServices() { - return grayServices.values(); + return Collections.unmodifiableCollection(grayServices.values()); } @Override From 4145127321291c3807604942e896216834d8a91a Mon Sep 17 00:00:00 2001 From: saleson Date: Sat, 25 May 2019 11:27:31 +0800 Subject: [PATCH 05/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring-cloud-gray-client-netflix/pom.xml | 5 +++++ spring-cloud-gray-server/pom.xml | 5 +++++ .../springcloud/gray/server/dao/model/GrayInstanceDO.java | 1 - .../cn/springcloud/gray/server/dao/model/GrayServiceDO.java | 6 ++++-- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/spring-cloud-gray-client-netflix/pom.xml b/spring-cloud-gray-client-netflix/pom.xml index 22c76783..f36bf994 100644 --- a/spring-cloud-gray-client-netflix/pom.xml +++ b/spring-cloud-gray-client-netflix/pom.xml @@ -50,6 +50,11 @@ org.springframework.cloud spring-cloud-netflix-eureka-client + + org.springframework.boot + spring-boot-configuration-processor + true + com.netflix.eureka eureka-client diff --git a/spring-cloud-gray-server/pom.xml b/spring-cloud-gray-server/pom.xml index c10fff4c..c6b7c254 100644 --- a/spring-cloud-gray-server/pom.xml +++ b/spring-cloud-gray-server/pom.xml @@ -28,6 +28,11 @@ spring-boot-starter-test provided + + org.springframework.boot + spring-boot-configuration-processor + true + org.springframework.cloud spring-cloud-starter-eureka diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/model/GrayInstanceDO.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/model/GrayInstanceDO.java index 6e1c0bf3..ca6682d1 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/model/GrayInstanceDO.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/model/GrayInstanceDO.java @@ -14,7 +14,6 @@ public class GrayInstanceDO { @Id @Column(length = 64) - @GeneratedValue(strategy = GenerationType.IDENTITY) private String instanceId; @Column(length = 32) private String serviceId; diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/model/GrayServiceDO.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/model/GrayServiceDO.java index 12604d9e..9895cb13 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/model/GrayServiceDO.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/model/GrayServiceDO.java @@ -2,7 +2,10 @@ import lombok.*; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; @Setter @@ -16,7 +19,6 @@ public class GrayServiceDO { @Id @Column(length = 32) - @GeneratedValue(strategy = GenerationType.IDENTITY) private String serviceId; @Column(length = 64) private String serviceName; From d4413760e7aba4d348a16aa8dc545e64129a7516 Mon Sep 17 00:00:00 2001 From: saleson Date: Sat, 25 May 2019 15:16:42 +0800 Subject: [PATCH 06/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GrayRestTemplateAutoConfiguration.java | 49 ++++++++++++------- .../config/GrayClientAutoConfiguration.java | 39 ++++++++++----- .../client/config/GrayTrackConfiguration.java | 5 +- 3 files changed, 59 insertions(+), 34 deletions(-) diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/resttemplate/configuration/GrayRestTemplateAutoConfiguration.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/resttemplate/configuration/GrayRestTemplateAutoConfiguration.java index 2138843f..821b618c 100644 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/resttemplate/configuration/GrayRestTemplateAutoConfiguration.java +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/resttemplate/configuration/GrayRestTemplateAutoConfiguration.java @@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; @@ -19,28 +20,41 @@ @ConditionalOnClass(value = RestTemplate.class) public class GrayRestTemplateAutoConfiguration { - @Autowired - private GrayRequestProperties grayRequestProperties; - @Autowired - private RibbonConnectionPoint ribbonConnectionPoint; + @ConditionalOnMissingBean(RestTemplate.class) + @ConditionalOnClass({LoadBalanced.class}) + public static class LoadBalancedRestTemplateConfiguration { - @Bean - @LoadBalanced - @ConditionalOnMissingBean - public RestTemplate restTemplate() { - RestTemplate restTemplate = new RestTemplate(); -// restTemplate.getInterceptors().add(grayClientHttpRequestIntercptor); - return restTemplate; + @Autowired + private GrayRequestProperties grayRequestProperties; + @Autowired + private RibbonConnectionPoint ribbonConnectionPoint; + + @Bean + @LoadBalanced + public RestTemplate restTemplate() { + RestTemplate restTemplate = new RestTemplate(); + return restTemplate; + } + + @Bean + public GrayClientHttpRequestIntercptor grayClientHttpRequestIntercptor(@LoadBalanced List restTemplates) { + GrayClientHttpRequestIntercptor intercptor = new GrayClientHttpRequestIntercptor( + grayRequestProperties, ribbonConnectionPoint); + restTemplates.forEach(restTemplate -> restTemplate.getInterceptors().add(intercptor)); + return intercptor; + } } - @Bean - public GrayClientHttpRequestIntercptor grayClientHttpRequestIntercptor(@LoadBalanced List restTemplates) { - GrayClientHttpRequestIntercptor intercptor = new GrayClientHttpRequestIntercptor( - grayRequestProperties, ribbonConnectionPoint); - restTemplates.forEach(restTemplate -> restTemplate.getInterceptors().add(intercptor)); - return intercptor; + @ConditionalOnMissingBean(RestTemplate.class) + @ConditionalOnMissingClass({"org.springframework.cloud.client.loadbalancer.LoadBalanced"}) + public static class RestTemplateConfiguration { + @Bean + public RestTemplate restTemplate() { + RestTemplate restTemplate = new RestTemplate(); + return restTemplate; + } } @@ -48,7 +62,6 @@ public GrayClientHttpRequestIntercptor grayClientHttpRequestIntercptor(@LoadBala @ConditionalOnProperty(value = "gray.request.track.enabled", matchIfMissing = true) public static class GrayTrackRestTemplateConfiguration { - @Bean public RestTemplateRequestInterceptor restTemplateRequestInterceptor() { return new RestTemplateRequestInterceptor(); 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 50863097..7f39f74a 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 @@ -34,19 +34,6 @@ public class GrayClientAutoConfiguration { private GrayClientProperties grayClientProperties; - @Bean - @ConditionalOnMissingBean - @ConditionalOnProperty(value = "gray.client.serverUrl") - public InformationClient informationClient(@Autowired(required = false) RestTemplate restTemplate) { - InformationClient httpClient = new HttpInformationClient(grayClientProperties.getServerUrl(), restTemplate); - if (grayClientProperties.isRetryable()) { - return new RetryableInformationClient(Math.max(3, grayClientProperties.getRetryNumberOfRetries()), httpClient); - } else { - return httpClient; - } - } - - @Bean @ConditionalOnMissingBean public GrayManager grayManager( @@ -75,4 +62,30 @@ public RequestLocalStorage requestLocalStorage() { } + @Configuration + public static class InformationClientConfiguration { + + + @Bean("grayInformationRestTemplate") + @ConditionalOnMissingBean(name = {"grayInformationRestTemplate"}) + public RestTemplate grayInformationRestTemplate() { + return new RestTemplate(); + } + + + @Bean + @ConditionalOnMissingBean + @ConditionalOnProperty(value = "gray.client.serverUrl") + public InformationClient informationClient( + @Autowired(required = false) RestTemplate grayInformationRestTemplate, + GrayClientProperties grayClientProperties) { + InformationClient httpClient = new HttpInformationClient(grayClientProperties.getServerUrl(), grayInformationRestTemplate); + if (grayClientProperties.isRetryable()) { + return new RetryableInformationClient(Math.max(3, grayClientProperties.getRetryNumberOfRetries()), httpClient); + } else { + return httpClient; + } + } + } + } diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayTrackConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayTrackConfiguration.java index bd16c3d6..c4dd0660 100644 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayTrackConfiguration.java +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayTrackConfiguration.java @@ -19,7 +19,6 @@ import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import javax.servlet.http.HttpServletRequest; import java.util.List; @@ -42,7 +41,7 @@ public GrayTrackHolder grayTrackHolder( @ConditionalOnProperty(value = "gray.client.runenv", havingValue = "web", matchIfMissing = true) @Configuration - public static class GrayClientWebConfiguration extends WebMvcConfigurerAdapter { + public static class GrayClientWebConfiguration { @Autowired private GrayTrackProperties grayTrackProperties; @@ -61,7 +60,7 @@ public GrayTrackFilter grayTrackFilter(GrayTrackHolder grayTrackHolder) { @Bean - public FilterRegistrationBean companyUrlFilterRegister(GrayTrackFilter filter) { + public FilterRegistrationBean grayTrackFilter(GrayTrackFilter filter) { GrayTrackProperties.Web webProperties = grayTrackProperties.getWeb(); FilterRegistrationBean registration = new FilterRegistrationBean(); //注入过滤器 From 5dccfc232c42727be0c01e536c0973831293234a Mon Sep 17 00:00:00 2001 From: saleson Date: Sat, 25 May 2019 15:41:26 +0800 Subject: [PATCH 07/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....java => GrayClientEnrollInitializingDestroyBean.java} | 4 ++-- .../gray/client/config/GrayClientAutoConfiguration.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) rename spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/{GrayClientInitializingDestroyBean.java => GrayClientEnrollInitializingDestroyBean.java} (94%) diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/GrayClientInitializingDestroyBean.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/GrayClientEnrollInitializingDestroyBean.java similarity index 94% rename from spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/GrayClientInitializingDestroyBean.java rename to spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/GrayClientEnrollInitializingDestroyBean.java index 1f18174f..015d431d 100644 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/GrayClientInitializingDestroyBean.java +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/GrayClientEnrollInitializingDestroyBean.java @@ -10,13 +10,13 @@ @Slf4j -public class GrayClientInitializingDestroyBean implements InitializingBean { +public class GrayClientEnrollInitializingDestroyBean implements InitializingBean { private CommunicableGrayManager grayManager; private InstanceLocalInfo instanceLocalInfo; private GrayClientConfig clientConfig; - public GrayClientInitializingDestroyBean( + public GrayClientEnrollInitializingDestroyBean( CommunicableGrayManager grayManager, GrayClientConfig clientConfig, InstanceLocalInfo instanceLocalInfo) { this.grayManager = grayManager; this.clientConfig = clientConfig; 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 7f39f74a..866a79cd 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 @@ -1,7 +1,7 @@ package cn.springcloud.gray.client.config; import cn.springcloud.gray.*; -import cn.springcloud.gray.client.GrayClientInitializingDestroyBean; +import cn.springcloud.gray.client.GrayClientEnrollInitializingDestroyBean; import cn.springcloud.gray.client.config.properties.GrayClientProperties; import cn.springcloud.gray.client.config.properties.GrayLoadProperties; import cn.springcloud.gray.client.config.properties.GrayRequestProperties; @@ -48,10 +48,10 @@ public GrayManager grayManager( @Bean - @ConditionalOnBean({CommunicableGrayManager.class, InstanceLocalInfo.class}) - public GrayClientInitializingDestroyBean grayClientInitializingDestroyBean( + @ConditionalOnProperty(value = "gray.client.instance.grayEnroll") + public GrayClientEnrollInitializingDestroyBean grayClientEnrollInitializingDestroyBean( CommunicableGrayManager grayManager, InstanceLocalInfo instanceLocalInfo) { - return new GrayClientInitializingDestroyBean(grayManager, grayClientProperties, instanceLocalInfo); + return new GrayClientEnrollInitializingDestroyBean(grayManager, grayClientProperties, instanceLocalInfo); } From 186bf21cbe1be06781f5ccc2d323a043f45cfaaf Mon Sep 17 00:00:00 2001 From: saleson Date: Sat, 25 May 2019 16:32:24 +0800 Subject: [PATCH 08/14] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gray/client/netflix/ribbon/GrayLoadBalanceRule.java | 2 +- .../src/main/resources/config/application.yml | 2 +- .../src/main/resources/config/application.yml | 4 ++-- .../src/main/resources/config/application.yml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/ribbon/GrayLoadBalanceRule.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/ribbon/GrayLoadBalanceRule.java index f5cd031a..8dab424e 100644 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/ribbon/GrayLoadBalanceRule.java +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/ribbon/GrayLoadBalanceRule.java @@ -61,7 +61,7 @@ public Server choose(Object key) { GrayService grayService = grayManager.getGrayService(serviceId); List servers = lb.getAllServers(); List grayServers = new ArrayList<>(grayService.getGrayInstances().size()); - List normalServers = new ArrayList<>(servers.size() - grayService.getGrayInstances().size()); + List normalServers = new ArrayList<>(Math.min(servers.size(), grayService.getGrayInstances().size())); for (Server server : servers) { // ServerSpec serverSpec = serverExplainer.apply(server); 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 07621a45..ae1ee685 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 @@ -16,5 +16,5 @@ eureka: gray: client: instance: - grayEnroll: true #是否在启动后自动注册成灰度实例 + grayEnroll: false #是否在启动后自动注册成灰度实例 serverUrl: http://localhost:20202 #灰度服务端的url \ No newline at end of file diff --git a/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml index 8bd22265..7dea6bcd 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml +++ b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml @@ -38,7 +38,7 @@ eureka: instanceId: ${spring.application.name}:${server.port} lease-renewal-interval-in-seconds: 10 lease-expiration-duration-in-seconds: 30 - initial-status: starting +# initial-status: starting feign: hystrix: enabled: true @@ -60,7 +60,7 @@ gray: value: version,test path-patterns: /* load: - enabled: true + enabled: false gray-instances: - serviceId: service-a instance-id: service-a:20104 diff --git a/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml b/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml index 8491329d..9277978f 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml +++ b/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml @@ -34,7 +34,7 @@ eureka: instance: lease-renewal-interval-in-seconds: 10 lease-expiration-duration-in-seconds: 30 - initial-status: starting +# initial-status: starting ribbon: # ReadTimeout: 30000 From 29d5514bf5473bf47ee77acad94454b90842ae16 Mon Sep 17 00:00:00 2001 From: saleson Date: Sat, 25 May 2019 17:01:21 +0800 Subject: [PATCH 09/14] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- spring-cloud-gray-client-netflix/pom.xml | 2 +- spring-cloud-gray-client/pom.xml | 2 +- spring-cloud-gray-core/pom.xml | 2 +- spring-cloud-gray-dependencies/pom.xml | 4 ++-- spring-cloud-gray-samples/pom.xml | 2 +- .../spring-cloud-gray-eureka-sample/pom.xml | 4 ++-- .../spring-cloud-gray-server-sample/pom.xml | 2 +- .../spring-cloud-gray-service-a-sample/pom.xml | 2 +- .../spring-cloud-gray-service-a1-sample/pom.xml | 2 +- .../spring-cloud-gray-service-b-sample/pom.xml | 2 +- .../spring-cloud-gray-stream-sample/pom.xml | 2 +- .../spring-cloud-gray-zuul-sample/pom.xml | 2 +- spring-cloud-gray-server/pom.xml | 2 +- spring-cloud-gray-starter-dependencies/pom.xml | 2 +- spring-cloud-gray-utils/pom.xml | 2 +- spring-cloud-gray-webui/pom.xml | 2 +- spring-cloud-starter-gray-client/pom.xml | 2 +- spring-cloud-starter-gray-eureka-server/pom.xml | 2 +- spring-cloud-starter-gray-server/pom.xml | 2 +- 20 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 1ab7a6b8..65e65cb9 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ cn.springcloud.gray spring-cloud-gray pom - A.1.0.0 + A.1.0.1 https://github.com/SpringCloud/spring-cloud-gray Spring Cloud中国社区 diff --git a/spring-cloud-gray-client-netflix/pom.xml b/spring-cloud-gray-client-netflix/pom.xml index f36bf994..3610ffd5 100644 --- a/spring-cloud-gray-client-netflix/pom.xml +++ b/spring-cloud-gray-client-netflix/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - A.1.0.0 + A.1.0.1 4.0.0 diff --git a/spring-cloud-gray-client/pom.xml b/spring-cloud-gray-client/pom.xml index 9b20c5eb..63924263 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 - A.1.0.0 + A.1.0.1 4.0.0 diff --git a/spring-cloud-gray-core/pom.xml b/spring-cloud-gray-core/pom.xml index 479c0042..b7081de1 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 - A.1.0.0 + A.1.0.1 4.0.0 diff --git a/spring-cloud-gray-dependencies/pom.xml b/spring-cloud-gray-dependencies/pom.xml index b3b37d49..4127be79 100644 --- a/spring-cloud-gray-dependencies/pom.xml +++ b/spring-cloud-gray-dependencies/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - A.1.0.0 + A.1.0.1 @@ -17,7 +17,7 @@ cn.springcloud.gray spring-cloud-gray-dependencies - A.1.0.0 + A.1.0.1 pom diff --git a/spring-cloud-gray-samples/pom.xml b/spring-cloud-gray-samples/pom.xml index 8be9cacc..abed80b9 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 - A.1.0.0 + A.1.0.1 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 9d884731..5ce4fb36 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 - A.1.0.0 + A.1.0.1 4.0.0 @@ -20,7 +20,7 @@ spring-cloud-gray-utils cn.springcloud.gray - A.1.0.0 + A.1.0.1 org.springframework.boot 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 44b8d729..16ea7e64 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 - A.1.0.0 + A.1.0.1 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 c7ecb33a..a6a45458 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 - A.1.0.0 + A.1.0.1 4.0.0 diff --git a/spring-cloud-gray-samples/spring-cloud-gray-service-a1-sample/pom.xml b/spring-cloud-gray-samples/spring-cloud-gray-service-a1-sample/pom.xml index 4dddcd03..bcc3177f 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-service-a1-sample/pom.xml +++ b/spring-cloud-gray-samples/spring-cloud-gray-service-a1-sample/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray-samples cn.springcloud.gray - A.1.0.0 + A.1.0.1 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 90ecaf74..120344df 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 - A.1.0.0 + A.1.0.1 4.0.0 diff --git a/spring-cloud-gray-samples/spring-cloud-gray-stream-sample/pom.xml b/spring-cloud-gray-samples/spring-cloud-gray-stream-sample/pom.xml index e735123d..302907ba 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-stream-sample/pom.xml +++ b/spring-cloud-gray-samples/spring-cloud-gray-stream-sample/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray-samples cn.springcloud.gray - A.1.0.0 + A.1.0.1 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 411516b2..0dc63e4e 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 - A.1.0.0 + A.1.0.1 4.0.0 diff --git a/spring-cloud-gray-server/pom.xml b/spring-cloud-gray-server/pom.xml index c6b7c254..00aec0b4 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 - A.1.0.0 + A.1.0.1 4.0.0 diff --git a/spring-cloud-gray-starter-dependencies/pom.xml b/spring-cloud-gray-starter-dependencies/pom.xml index b972caec..37088201 100644 --- a/spring-cloud-gray-starter-dependencies/pom.xml +++ b/spring-cloud-gray-starter-dependencies/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - A.1.0.0 + A.1.0.1 4.0.0 diff --git a/spring-cloud-gray-utils/pom.xml b/spring-cloud-gray-utils/pom.xml index 301e08fb..0e81065b 100644 --- a/spring-cloud-gray-utils/pom.xml +++ b/spring-cloud-gray-utils/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - A.1.0.0 + A.1.0.1 4.0.0 diff --git a/spring-cloud-gray-webui/pom.xml b/spring-cloud-gray-webui/pom.xml index 3c86dc64..a0fa3783 100644 --- a/spring-cloud-gray-webui/pom.xml +++ b/spring-cloud-gray-webui/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - A.1.0.0 + A.1.0.1 4.0.0 diff --git a/spring-cloud-starter-gray-client/pom.xml b/spring-cloud-starter-gray-client/pom.xml index 254d6e17..2aabd7e5 100644 --- a/spring-cloud-starter-gray-client/pom.xml +++ b/spring-cloud-starter-gray-client/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - A.1.0.0 + A.1.0.1 4.0.0 diff --git a/spring-cloud-starter-gray-eureka-server/pom.xml b/spring-cloud-starter-gray-eureka-server/pom.xml index 30362f3b..89e0294e 100644 --- a/spring-cloud-starter-gray-eureka-server/pom.xml +++ b/spring-cloud-starter-gray-eureka-server/pom.xml @@ -5,7 +5,7 @@ spring-cloud-gray cn.springcloud.gray - A.1.0.0 + A.1.0.1 4.0.0 diff --git a/spring-cloud-starter-gray-server/pom.xml b/spring-cloud-starter-gray-server/pom.xml index 49c16ef1..cb555238 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 - A.1.0.0 + A.1.0.1 4.0.0 From 4b3879ad236ccb30b12ee54bf42f60ee5ece845b Mon Sep 17 00:00:00 2001 From: saleson Date: Sat, 25 May 2019 19:02:08 +0800 Subject: [PATCH 10/14] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GrayClientEurekaAutoConfiguration.java | 3 +- .../HystrixGrayAutoConfiguration.java | 2 + .../NetflixGrayAutoConfiguration.java | 2 + .../GrayFeignAutoConfiguration.java | 5 +- .../GrayRestTemplateAutoConfiguration.java | 49 ++++++------------ .../GrayZuulAutoConfiguration.java | 3 ++ spring-cloud-gray-client/pom.xml | 5 ++ .../gray/client/EnableGrayClient.java | 7 +-- .../config/GrayClientAutoConfiguration.java | 4 +- ...yClientBeanPostProcessorConfiguration.java | 3 ++ .../config/GrayClientImportSelector.java | 50 +++++++++++++++++++ .../config/GrayClientMarkerConfiguration.java | 17 ------- .../config/GrayClientWebConfiguration.java | 11 +++- .../config/GrayEventAutoConfiguration.java | 3 ++ .../config/GrayLoadAutoConfigration.java | 2 + .../service/a/ServiceAApplication.java | 2 - .../src/main/resources/config/application.yml | 1 + .../gray/service/b/ServiceBApplication.java | 2 - .../RestTemplateConfiguration.java | 18 +++++++ .../src/main/resources/config/application.yml | 1 + .../gray/zuul/GrayZuulApplication.java | 2 +- .../src/main/resources/config/application.yml | 1 + .../main/resources/META-INF/spring.factories | 2 + 23 files changed, 131 insertions(+), 64 deletions(-) create mode 100644 spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientImportSelector.java delete mode 100644 spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientMarkerConfiguration.java create mode 100644 spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/java/cn/springcloud/gray/service/b/configuration/RestTemplateConfiguration.java diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/GrayClientEurekaAutoConfiguration.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/GrayClientEurekaAutoConfiguration.java index d112b4f5..f1079091 100644 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/GrayClientEurekaAutoConfiguration.java +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/GrayClientEurekaAutoConfiguration.java @@ -1,5 +1,6 @@ package cn.springcloud.gray.client.netflix.configuration; +import cn.springcloud.gray.GrayManager; import cn.springcloud.gray.InstanceLocalInfo; import cn.springcloud.gray.client.netflix.eureka.EurekaInstanceDiscoveryClient; import cn.springcloud.gray.client.netflix.eureka.EurekaServerExplainer; @@ -15,7 +16,7 @@ import org.springframework.context.annotation.Configuration; @Configuration -@ConditionalOnBean(EurekaClient.class) +@ConditionalOnBean({GrayManager.class, EurekaClient.class}) public class GrayClientEurekaAutoConfiguration { @Autowired diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java index 8a53835e..1a19b1e4 100644 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java @@ -11,6 +11,7 @@ import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext; import feign.hystrix.HystrixFeign; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -22,6 +23,7 @@ import java.io.IOException; @Configuration +@ConditionalOnBean(GrayManager.class) @ConditionalOnClass({HystrixCommand.class, HystrixFeign.class}) public class HystrixGrayAutoConfiguration { diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/NetflixGrayAutoConfiguration.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/NetflixGrayAutoConfiguration.java index e0e29d80..c0e9c566 100644 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/NetflixGrayAutoConfiguration.java +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/NetflixGrayAutoConfiguration.java @@ -6,12 +6,14 @@ import cn.springcloud.gray.client.netflix.ribbon.configuration.GrayRibbonClientsConfiguration; import cn.springcloud.gray.request.RequestLocalStorage; 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.ribbon.RibbonClients; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration +@ConditionalOnBean(GrayManager.class) @RibbonClients(defaultConfiguration = GrayRibbonClientsConfiguration.class) public class NetflixGrayAutoConfiguration { diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/feign/configuration/GrayFeignAutoConfiguration.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/feign/configuration/GrayFeignAutoConfiguration.java index 19d84092..31ad5bf3 100644 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/feign/configuration/GrayFeignAutoConfiguration.java +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/feign/configuration/GrayFeignAutoConfiguration.java @@ -1,10 +1,12 @@ package cn.springcloud.gray.client.netflix.feign.configuration; +import cn.springcloud.gray.GrayManager; import cn.springcloud.gray.client.netflix.configuration.HystrixGrayAutoConfiguration; import cn.springcloud.gray.client.netflix.feign.GrayTrackFeignRequestInterceptor; import cn.springcloud.gray.request.RequestLocalStorage; import com.netflix.loadbalancer.ILoadBalancer; import feign.Feign; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.netflix.feign.EnableFeignClients; @@ -14,8 +16,9 @@ /** * Created by saleson on 2017/11/9. */ -@ConditionalOnClass(value = {ILoadBalancer.class, Feign.class}) @Configuration +@ConditionalOnBean(GrayManager.class) +@ConditionalOnClass(value = {ILoadBalancer.class, Feign.class}) @EnableFeignClients(defaultConfiguration = {GrayFeignClientsConfiguration.class}) public class GrayFeignAutoConfiguration { diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/resttemplate/configuration/GrayRestTemplateAutoConfiguration.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/resttemplate/configuration/GrayRestTemplateAutoConfiguration.java index 821b618c..c2deaaac 100644 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/resttemplate/configuration/GrayRestTemplateAutoConfiguration.java +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/resttemplate/configuration/GrayRestTemplateAutoConfiguration.java @@ -1,13 +1,13 @@ package cn.springcloud.gray.client.netflix.resttemplate.configuration; +import cn.springcloud.gray.GrayManager; import cn.springcloud.gray.client.config.properties.GrayRequestProperties; import cn.springcloud.gray.client.netflix.connectionpoint.RibbonConnectionPoint; import cn.springcloud.gray.client.netflix.resttemplate.GrayClientHttpRequestIntercptor; import cn.springcloud.gray.client.netflix.resttemplate.RestTemplateRequestInterceptor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; @@ -17,44 +17,25 @@ import java.util.List; @Configuration -@ConditionalOnClass(value = RestTemplate.class) +@ConditionalOnBean({GrayManager.class, RestTemplate.class}) +@ConditionalOnClass(value = {RestTemplate.class, LoadBalanced.class}) public class GrayRestTemplateAutoConfiguration { + @Autowired + private GrayRequestProperties grayRequestProperties; + @Autowired + private RibbonConnectionPoint ribbonConnectionPoint; - @ConditionalOnMissingBean(RestTemplate.class) - @ConditionalOnClass({LoadBalanced.class}) - public static class LoadBalancedRestTemplateConfiguration { - @Autowired - private GrayRequestProperties grayRequestProperties; - @Autowired - private RibbonConnectionPoint ribbonConnectionPoint; - - @Bean - @LoadBalanced - public RestTemplate restTemplate() { - RestTemplate restTemplate = new RestTemplate(); - return restTemplate; - } - - @Bean - public GrayClientHttpRequestIntercptor grayClientHttpRequestIntercptor(@LoadBalanced List restTemplates) { - GrayClientHttpRequestIntercptor intercptor = new GrayClientHttpRequestIntercptor( - grayRequestProperties, ribbonConnectionPoint); + @Bean + public GrayClientHttpRequestIntercptor grayClientHttpRequestIntercptor( + @Autowired(required = false) @LoadBalanced List restTemplates) { + GrayClientHttpRequestIntercptor intercptor = new GrayClientHttpRequestIntercptor( + grayRequestProperties, ribbonConnectionPoint); + if (restTemplates != null) { restTemplates.forEach(restTemplate -> restTemplate.getInterceptors().add(intercptor)); - return intercptor; - } - } - - - @ConditionalOnMissingBean(RestTemplate.class) - @ConditionalOnMissingClass({"org.springframework.cloud.client.loadbalancer.LoadBalanced"}) - public static class RestTemplateConfiguration { - @Bean - public RestTemplate restTemplate() { - RestTemplate restTemplate = new RestTemplate(); - return restTemplate; } + return intercptor; } diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/zuul/configuration/GrayZuulAutoConfiguration.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/zuul/configuration/GrayZuulAutoConfiguration.java index 66ccb1a7..f420b07b 100644 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/zuul/configuration/GrayZuulAutoConfiguration.java +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/zuul/configuration/GrayZuulAutoConfiguration.java @@ -1,5 +1,6 @@ package cn.springcloud.gray.client.netflix.zuul.configuration; +import cn.springcloud.gray.GrayManager; import cn.springcloud.gray.client.config.properties.GrayRequestProperties; import cn.springcloud.gray.client.netflix.configuration.HystrixGrayAutoConfiguration; import cn.springcloud.gray.client.netflix.connectionpoint.RibbonConnectionPoint; @@ -8,12 +9,14 @@ import cn.springcloud.gray.client.netflix.zuul.ZuulRequestInterceptor; import com.netflix.zuul.http.ZuulServlet; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration +@ConditionalOnBean(GrayManager.class) @ConditionalOnClass(value = ZuulServlet.class) public class GrayZuulAutoConfiguration { diff --git a/spring-cloud-gray-client/pom.xml b/spring-cloud-gray-client/pom.xml index 63924263..b0945dec 100644 --- a/spring-cloud-gray-client/pom.xml +++ b/spring-cloud-gray-client/pom.xml @@ -63,6 +63,11 @@ org.springframework.cloud spring-cloud-stream + + org.springframework.cloud + spring-cloud-commons + compile + diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/EnableGrayClient.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/EnableGrayClient.java index 86bf5a4c..8a6d56d4 100644 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/EnableGrayClient.java +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/EnableGrayClient.java @@ -1,14 +1,15 @@ package cn.springcloud.gray.client; -import cn.springcloud.gray.client.config.GrayClientMarkerConfiguration; +import cn.springcloud.gray.client.config.GrayClientImportSelector; import org.springframework.context.annotation.Import; import java.lang.annotation.*; -@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) @Documented -@Import(GrayClientMarkerConfiguration.class) +@Inherited +@Import(GrayClientImportSelector.class) public @interface EnableGrayClient { 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 866a79cd..5ea13836 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 @@ -12,7 +12,6 @@ import cn.springcloud.gray.request.RequestLocalStorage; import cn.springcloud.gray.request.ThreadLocalRequestStorage; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -25,7 +24,8 @@ @Configuration @EnableConfigurationProperties({GrayClientProperties.class, GrayRequestProperties.class}) -@ConditionalOnBean(GrayClientMarkerConfiguration.GrayClientMarker.class) +//@ConditionalOnBean(GrayClientMarkerConfiguration.GrayClientMarker.class) +@ConditionalOnProperty(value = "gray.enabled") @Import({GrayDecisionFactoryConfiguration.class, GrayTrackConfiguration.class}) public class GrayClientAutoConfiguration { diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientBeanPostProcessorConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientBeanPostProcessorConfiguration.java index 867bdebc..a4f8cd5d 100644 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientBeanPostProcessorConfiguration.java +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientBeanPostProcessorConfiguration.java @@ -1,13 +1,16 @@ package cn.springcloud.gray.client.config; +import cn.springcloud.gray.GrayManager; import cn.springcloud.gray.InstanceLocalInfo; import cn.springcloud.gray.InstanceLocalInfoAware; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration +@ConditionalOnBean(GrayManager.class) public class GrayClientBeanPostProcessorConfiguration { diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientImportSelector.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientImportSelector.java new file mode 100644 index 00000000..d53c1894 --- /dev/null +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientImportSelector.java @@ -0,0 +1,50 @@ +package cn.springcloud.gray.client.config; + + +import cn.springcloud.gray.client.EnableGrayClient; +import org.apache.commons.lang3.StringUtils; +import org.springframework.cloud.commons.util.SpringFactoryImportSelector; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.Environment; +import org.springframework.core.env.MutablePropertySources; +import org.springframework.core.env.PropertiesPropertySource; +import org.springframework.core.type.AnnotationMetadata; + +import java.util.Properties; + +@Order(Ordered.LOWEST_PRECEDENCE - 100) +public class GrayClientImportSelector extends SpringFactoryImportSelector { + + + @Override + public String[] selectImports(AnnotationMetadata metadata) { + String[] imports = super.selectImports(metadata); + + Environment env = getEnvironment(); + String grayEnabled = env.getProperty("gray.enabled"); + if (StringUtils.isEmpty(grayEnabled)) { + if (ConfigurableEnvironment.class.isInstance(env)) { + ConfigurableEnvironment environment = (ConfigurableEnvironment) env; + MutablePropertySources m = environment.getPropertySources(); + Properties p = new Properties(); + p.put("gray.enabled", "true"); + m.addLast(new PropertiesPropertySource("defaultProperties", p)); + } + } + + return imports; + } + + + @Override + protected boolean isEnabled() { + return false; + } + + @Override + protected boolean hasDefaultFactory() { + return true; + } +} diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientMarkerConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientMarkerConfiguration.java deleted file mode 100644 index 917a7379..00000000 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientMarkerConfiguration.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.springcloud.gray.client.config; - - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class GrayClientMarkerConfiguration { - - @Bean - public GrayClientMarker grayClientMarker() { - return new GrayClientMarker(); - } - - public class GrayClientMarker { - } -} diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientWebConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientWebConfiguration.java index e1192ec2..15caab88 100644 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientWebConfiguration.java +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayClientWebConfiguration.java @@ -1,10 +1,19 @@ package cn.springcloud.gray.client.config; +import cn.springcloud.gray.GrayManager; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration -@ComponentScan(basePackages = {"cn.springcloud.gray.web.resources"}) +@ConditionalOnBean(GrayManager.class) public class GrayClientWebConfiguration { + + + @Configuration + @ComponentScan(basePackages = {"cn.springcloud.gray.web.resources"}) + public static class GrayClientResourcesConfiguration { + + } } diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayEventAutoConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayEventAutoConfiguration.java index eb141c64..f946ffb4 100644 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayEventAutoConfiguration.java +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayEventAutoConfiguration.java @@ -1,11 +1,13 @@ package cn.springcloud.gray.client.config; import cn.springcloud.gray.CommunicableGrayManager; +import cn.springcloud.gray.GrayManager; import cn.springcloud.gray.event.DefaultGrayEventListener; import cn.springcloud.gray.event.GrayEventListener; import cn.springcloud.gray.event.stream.StreamInput; import cn.springcloud.gray.event.stream.StreamMessageListener; import cn.springcloud.gray.request.track.CommunicableGrayTrackHolder; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -14,6 +16,7 @@ import org.springframework.context.annotation.Configuration; @Configuration +@ConditionalOnBean(GrayManager.class) public class GrayEventAutoConfiguration { diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayLoadAutoConfigration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayLoadAutoConfigration.java index 3da51f44..06e728a7 100644 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayLoadAutoConfigration.java +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayLoadAutoConfigration.java @@ -5,6 +5,7 @@ import cn.springcloud.gray.model.GrayStatus; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -12,6 +13,7 @@ @Configuration @ConditionalOnProperty(value = "gray.load.enabled", havingValue = "true") +@ConditionalOnBean(GrayManager.class) @EnableConfigurationProperties({GrayLoadProperties.class}) public class GrayLoadAutoConfigration { diff --git a/spring-cloud-gray-samples/spring-cloud-gray-service-a-sample/src/main/java/cn/springcloud/service/a/ServiceAApplication.java b/spring-cloud-gray-samples/spring-cloud-gray-service-a-sample/src/main/java/cn/springcloud/service/a/ServiceAApplication.java index d392ee06..2138ef65 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-service-a-sample/src/main/java/cn/springcloud/service/a/ServiceAApplication.java +++ b/spring-cloud-gray-samples/spring-cloud-gray-service-a-sample/src/main/java/cn/springcloud/service/a/ServiceAApplication.java @@ -1,6 +1,5 @@ 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; @@ -15,7 +14,6 @@ */ @SpringBootApplication @EnableDiscoveryClient -@EnableGrayClient public class ServiceAApplication { private static final org.slf4j.Logger log = LoggerFactory.getLogger(ServiceAApplication.class); 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 ae1ee685..545b6f41 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 @@ -14,6 +14,7 @@ eureka: lease-renewal-interval-in-seconds: 10 lease-expiration-duration-in-seconds: 30 gray: + enabled: true client: instance: grayEnroll: false #是否在启动后自动注册成灰度实例 diff --git a/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/java/cn/springcloud/gray/service/b/ServiceBApplication.java b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/java/cn/springcloud/gray/service/b/ServiceBApplication.java index 842a0df2..961f1c3a 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/java/cn/springcloud/gray/service/b/ServiceBApplication.java +++ b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/java/cn/springcloud/gray/service/b/ServiceBApplication.java @@ -1,6 +1,5 @@ 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; @@ -16,7 +15,6 @@ */ @SpringBootApplication @EnableDiscoveryClient -@EnableGrayClient @EnableFeignClients public class ServiceBApplication { private static final org.slf4j.Logger log = LoggerFactory.getLogger(ServiceBApplication.class); diff --git a/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/java/cn/springcloud/gray/service/b/configuration/RestTemplateConfiguration.java b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/java/cn/springcloud/gray/service/b/configuration/RestTemplateConfiguration.java new file mode 100644 index 00000000..5a7dbb33 --- /dev/null +++ b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/java/cn/springcloud/gray/service/b/configuration/RestTemplateConfiguration.java @@ -0,0 +1,18 @@ +package cn.springcloud.gray.service.b.configuration; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfiguration { + + @Bean + @ConditionalOnMissingBean + @LoadBalanced + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} diff --git a/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml index 7dea6bcd..77d221ff 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml +++ b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml @@ -44,6 +44,7 @@ feign: enabled: true gray: + enabled: true client: server-url: http://localhost:20202 request: diff --git a/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/java/cn/springcloud/gray/zuul/GrayZuulApplication.java b/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/java/cn/springcloud/gray/zuul/GrayZuulApplication.java index ff63148f..e2b9e7f4 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/java/cn/springcloud/gray/zuul/GrayZuulApplication.java +++ b/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/java/cn/springcloud/gray/zuul/GrayZuulApplication.java @@ -14,10 +14,10 @@ /** * Created by saleson on 2017/10/18. */ +@EnableGrayClient @SpringCloudApplication @EnableZuulProxy @EnableDiscoveryClient -@EnableGrayClient public class GrayZuulApplication { private static final org.slf4j.Logger log = LoggerFactory.getLogger(GrayZuulApplication.class); diff --git a/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml b/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml index 9277978f..5682de91 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml +++ b/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml @@ -49,6 +49,7 @@ zuul: # path: /client/** #匹配/techouse/usersystem/** 均路由到cloud-client # serviceId: eureka-client #指定路由到的serviceId gray: + # enabled: true client: server-url: http://localhost:20202 serviceUpdateIntervalTimerInMs: 0 diff --git a/spring-cloud-starter-gray-client/src/main/resources/META-INF/spring.factories b/spring-cloud-starter-gray-client/src/main/resources/META-INF/spring.factories index a8ec7ac3..562c9f39 100644 --- a/spring-cloud-starter-gray-client/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-starter-gray-client/src/main/resources/META-INF/spring.factories @@ -1,4 +1,6 @@ # Auto Configure +#cn.springcloud.gray.client.EnableGrayClient=\ +# cn.springcloud.gray.client.config.GrayClientImportSelector org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ cn.springcloud.gray.client.config.GrayClientAutoConfiguration,\ cn.springcloud.gray.client.config.GrayClientWebConfiguration,\ From 69fc5e026818878d00093bf8d0997bba36d3f7bb Mon Sep 17 00:00:00 2001 From: saleson Date: Sat, 25 May 2019 21:33:27 +0800 Subject: [PATCH 11/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HystrixGrayAutoConfiguration.java | 33 +--------------- .../HystrixGrayTrackWebConfiguration.java | 39 +++++++++++++++++++ .../src/main/resources/config/application.yml | 4 +- .../src/main/resources/config/application.yml | 4 +- .../src/main/resources/config/application.yml | 4 +- .../gray/server/module/GrayServerModule.java | 2 + .../server/module/SimpleGrayServerModule.java | 5 +++ .../listener/EurekaInstanceListener.java | 6 ++- 8 files changed, 58 insertions(+), 39 deletions(-) create mode 100644 spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayTrackWebConfiguration.java diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java index 1a19b1e4..1ae747eb 100644 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java @@ -5,26 +5,19 @@ import cn.springcloud.gray.client.netflix.connectionpoint.RibbonConnectionPoint; import cn.springcloud.gray.client.netflix.hystrix.HystrixRequestLocalStorage; import cn.springcloud.gray.request.RequestLocalStorage; -import cn.springcloud.gray.request.track.GrayTrackHolder; -import cn.springcloud.gray.web.GrayTrackFilter; import com.netflix.hystrix.HystrixCommand; -import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext; import feign.hystrix.HystrixFeign; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import java.io.IOException; +import org.springframework.context.annotation.Import; @Configuration @ConditionalOnBean(GrayManager.class) @ConditionalOnClass({HystrixCommand.class, HystrixFeign.class}) +@Import(HystrixGrayTrackWebConfiguration.class) public class HystrixGrayAutoConfiguration { @@ -40,28 +33,6 @@ public RequestLocalStorage requestLocalStorage() { } - @Bean - public GrayTrackFilter grayTrackFilter( - GrayTrackHolder grayTrackHolder, - RequestLocalStorage requestLocalStorage) { - return new GrayTrackFilter(grayTrackHolder, requestLocalStorage) { - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - if (!HystrixRequestContext.isCurrentThreadInitialized()) { - HystrixRequestContext.initializeContext(); - } - try { - super.doFilter(request, response, chain); - } finally { - if (HystrixRequestContext.isCurrentThreadInitialized()) { - HystrixRequestContext.getContextForCurrentThread().shutdown(); - } - } - } - }; - } - - /** * 支持hystrix使用线程隔离时依然能够进行跑线程传递GrayRequest * diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayTrackWebConfiguration.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayTrackWebConfiguration.java new file mode 100644 index 00000000..b8d756de --- /dev/null +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayTrackWebConfiguration.java @@ -0,0 +1,39 @@ +package cn.springcloud.gray.client.netflix.configuration; + +import cn.springcloud.gray.request.RequestLocalStorage; +import cn.springcloud.gray.request.track.GrayTrackHolder; +import cn.springcloud.gray.web.GrayTrackFilter; +import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.IOException; + +@Configuration +public class HystrixGrayTrackWebConfiguration { + + @Bean + public GrayTrackFilter grayTrackFilter( + GrayTrackHolder grayTrackHolder, + RequestLocalStorage requestLocalStorage) { + return new GrayTrackFilter(grayTrackHolder, requestLocalStorage) { + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + if (!HystrixRequestContext.isCurrentThreadInitialized()) { + HystrixRequestContext.initializeContext(); + } + try { + super.doFilter(request, response, chain); + } finally { + if (HystrixRequestContext.isCurrentThreadInitialized()) { + HystrixRequestContext.getContextForCurrentThread().shutdown(); + } + } + } + }; + } +} diff --git a/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/main/resources/config/application.yml b/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/main/resources/config/application.yml index 48aaddc5..f08392ab 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/main/resources/config/application.yml +++ b/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/main/resources/config/application.yml @@ -35,7 +35,7 @@ spring: # max-attempts: 1 GrayEventOutput: destination: gray_event - # rabbit: + # rabbit: # bindings: # GrayEventInput: # consumer: @@ -54,4 +54,4 @@ eureka: gray: server: - evictionIntervalTimerInMs: 60000 \ No newline at end of file + evictionIntervalTimerInMs: 30000 \ No newline at end of file diff --git a/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml index 77d221ff..97930721 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml +++ b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml @@ -36,8 +36,8 @@ eureka: defaultZone: http://localhost:20001/eureka/ instance: instanceId: ${spring.application.name}:${server.port} - lease-renewal-interval-in-seconds: 10 - lease-expiration-duration-in-seconds: 30 + lease-renewal-interval-in-seconds: 5 + lease-expiration-duration-in-seconds: 15 # initial-status: starting feign: hystrix: diff --git a/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml b/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml index 5682de91..af5e5a8a 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml +++ b/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml @@ -32,8 +32,8 @@ eureka: serviceUrl: defaultZone: http://localhost:20001/eureka/ instance: - lease-renewal-interval-in-seconds: 10 - lease-expiration-duration-in-seconds: 30 + lease-renewal-interval-in-seconds: 5 + lease-expiration-duration-in-seconds: 15 # initial-status: starting ribbon: diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/GrayServerModule.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/GrayServerModule.java index 2e025df5..a1592e56 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/GrayServerModule.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/GrayServerModule.java @@ -44,6 +44,8 @@ default void openGray(String instanceId) { void updateInstanceStatus(String instanceId, InstanceStatus instanceStatus); + void updateInstanceStatus(GrayInstance instance, InstanceStatus instanceStatus); + void deleteGrayInstance(String intanceId); void saveGrayPolicy(GrayPolicy grayPolicy); diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayServerModule.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayServerModule.java index ea9b46a5..7e6da582 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayServerModule.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayServerModule.java @@ -94,6 +94,11 @@ public void saveGrayInstance(GrayInstance instance) { @Override public void updateInstanceStatus(String instanceId, InstanceStatus instanceStatus) { GrayInstance instance = grayInstanceService.findOneModel(instanceId); + updateInstanceStatus(instance, instanceStatus); + } + + @Override + public void updateInstanceStatus(GrayInstance instance, InstanceStatus instanceStatus) { if (instance != null && !Objects.equals(instance.getInstanceStatus(), instanceStatus)) { instance.setInstanceStatus(instanceStatus); grayInstanceService.saveModel(instance); diff --git a/spring-cloud-starter-gray-eureka-server/src/main/java/cn/springcloud/gray/eureka/server/listener/EurekaInstanceListener.java b/spring-cloud-starter-gray-eureka-server/src/main/java/cn/springcloud/gray/eureka/server/listener/EurekaInstanceListener.java index d17926fa..69fd65b5 100644 --- a/spring-cloud-starter-gray-eureka-server/src/main/java/cn/springcloud/gray/eureka/server/listener/EurekaInstanceListener.java +++ b/spring-cloud-starter-gray-eureka-server/src/main/java/cn/springcloud/gray/eureka/server/listener/EurekaInstanceListener.java @@ -34,7 +34,8 @@ public void listenDown(EurekaInstanceCanceledEvent event) { InstanceRegistry registry = (InstanceRegistry) event.getSource(); com.netflix.appinfo.InstanceInfo instanceInfo = registry.getApplication(event.getAppName()).getByInstanceId(event.getServerId()); - sendNotice(instanceInfo, InstanceStatus.DOWN, "DOWN"); + InstanceStatus instanceStatus = EurekaInstatnceTransformer.toGrayInstanceStatus(instanceInfo.getStatus()); + sendNotice(instanceInfo, instanceStatus, "DOWN"); } @@ -46,7 +47,8 @@ public void listenDown(EurekaInstanceCanceledEvent event) { @EventListener public void listenRenew(EurekaInstanceRenewedEvent event) { com.netflix.appinfo.InstanceInfo instanceInfo = event.getInstanceInfo(); - sendNotice(instanceInfo, InstanceStatus.UP, "REGISTERED"); + InstanceStatus instanceStatus = EurekaInstatnceTransformer.toGrayInstanceStatus(instanceInfo.getStatus()); + sendNotice(instanceInfo, instanceStatus, "RENEW"); } From 5025d2991d7621a3545de9a18e93447e93ab3955 Mon Sep 17 00:00:00 2001 From: saleson Date: Sat, 25 May 2019 22:19:47 +0800 Subject: [PATCH 12/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HystrixGrayAutoConfiguration.java | 43 ++++++++++++++----- .../HystrixGrayTrackWebConfiguration.java | 39 ----------------- .../springcloud/gray/DefaultGrayManager.java | 4 ++ .../config/GrayClientAutoConfiguration.java | 2 +- .../client/config/GrayTrackConfiguration.java | 11 +---- .../gray/event/DefaultGrayEventListener.java | 9 ++++ 6 files changed, 49 insertions(+), 59 deletions(-) delete mode 100644 spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayTrackWebConfiguration.java diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java index 1ae747eb..99d4023d 100644 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java +++ b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayAutoConfiguration.java @@ -5,28 +5,29 @@ import cn.springcloud.gray.client.netflix.connectionpoint.RibbonConnectionPoint; import cn.springcloud.gray.client.netflix.hystrix.HystrixRequestLocalStorage; import cn.springcloud.gray.request.RequestLocalStorage; +import cn.springcloud.gray.request.track.GrayTrackHolder; +import cn.springcloud.gray.web.GrayTrackFilter; import com.netflix.hystrix.HystrixCommand; +import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext; import feign.hystrix.HystrixFeign; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.IOException; @Configuration @ConditionalOnBean(GrayManager.class) @ConditionalOnClass({HystrixCommand.class, HystrixFeign.class}) -@Import(HystrixGrayTrackWebConfiguration.class) +//@Import(HystrixGrayTrackWebConfiguration.class) public class HystrixGrayAutoConfiguration { - @Autowired - private GrayManager grayManager; - @Autowired - private RequestLocalStorage requestLocalStorage; - - @Bean public RequestLocalStorage requestLocalStorage() { return new HystrixRequestLocalStorage(); @@ -39,8 +40,30 @@ public RequestLocalStorage requestLocalStorage() { * @return DefaultHystrixRibbonConnectionPoint */ @Bean - public RibbonConnectionPoint hystrixRibbonConnectionPoint() { + public RibbonConnectionPoint hystrixRibbonConnectionPoint( + GrayManager grayManager, RequestLocalStorage requestLocalStorage) { return new DefaultHystrixRibbonConnectionPoint(grayManager, requestLocalStorage); } + + @Bean + public GrayTrackFilter grayTrackFilter( + GrayTrackHolder grayTrackHolder, + RequestLocalStorage requestLocalStorage) { + return new GrayTrackFilter(grayTrackHolder, requestLocalStorage) { + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + if (!HystrixRequestContext.isCurrentThreadInitialized()) { + HystrixRequestContext.initializeContext(); + } + try { + super.doFilter(request, response, chain); + } finally { + if (HystrixRequestContext.isCurrentThreadInitialized()) { + HystrixRequestContext.getContextForCurrentThread().shutdown(); + } + } + } + }; + } } diff --git a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayTrackWebConfiguration.java b/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayTrackWebConfiguration.java deleted file mode 100644 index b8d756de..00000000 --- a/spring-cloud-gray-client-netflix/src/main/java/cn/springcloud/gray/client/netflix/configuration/HystrixGrayTrackWebConfiguration.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.springcloud.gray.client.netflix.configuration; - -import cn.springcloud.gray.request.RequestLocalStorage; -import cn.springcloud.gray.request.track.GrayTrackHolder; -import cn.springcloud.gray.web.GrayTrackFilter; -import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import java.io.IOException; - -@Configuration -public class HystrixGrayTrackWebConfiguration { - - @Bean - public GrayTrackFilter grayTrackFilter( - GrayTrackHolder grayTrackHolder, - RequestLocalStorage requestLocalStorage) { - return new GrayTrackFilter(grayTrackHolder, requestLocalStorage) { - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - if (!HystrixRequestContext.isCurrentThreadInitialized()) { - HystrixRequestContext.initializeContext(); - } - try { - super.doFilter(request, response, chain); - } finally { - if (HystrixRequestContext.isCurrentThreadInitialized()) { - HystrixRequestContext.getContextForCurrentThread().shutdown(); - } - } - } - }; - } -} diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/DefaultGrayManager.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/DefaultGrayManager.java index d1d74fa7..9e6c14a4 100644 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/DefaultGrayManager.java +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/DefaultGrayManager.java @@ -5,6 +5,7 @@ import cn.springcloud.gray.decision.GrayDecisionFactoryKeeper; import cn.springcloud.gray.model.GrayInstance; import cn.springcloud.gray.model.GrayService; +import cn.springcloud.gray.model.GrayStatus; import lombok.extern.slf4j.Slf4j; import java.util.List; @@ -83,6 +84,9 @@ private void joinLoadedGrays(Map grayServices) { if (grayServices.containsKey(instance.getServiceId()) || grayServices.get(instance.getServiceId()) .getGrayInstance(instance.getInstanceId()) != null) { + if (instance.getGrayStatus() == null) { + instance.setGrayStatus(GrayStatus.OPEN); + } updateGrayInstance(grayServices, instance); } }); 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 5ea13836..2c9f7c23 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 @@ -23,7 +23,7 @@ import java.util.List; @Configuration -@EnableConfigurationProperties({GrayClientProperties.class, GrayRequestProperties.class}) +@EnableConfigurationProperties({GrayClientProperties.class, GrayRequestProperties.class, GrayLoadProperties.class}) //@ConditionalOnBean(GrayClientMarkerConfiguration.GrayClientMarker.class) @ConditionalOnProperty(value = "gray.enabled") @Import({GrayDecisionFactoryConfiguration.class, GrayTrackConfiguration.class}) diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayTrackConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayTrackConfiguration.java index c4dd0660..24c0d69b 100644 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayTrackConfiguration.java +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayTrackConfiguration.java @@ -3,7 +3,6 @@ import cn.springcloud.gray.client.config.properties.GrayTrackProperties; import cn.springcloud.gray.communication.InformationClient; -import cn.springcloud.gray.request.GrayHttpTrackInfo; import cn.springcloud.gray.request.GrayInfoTracker; import cn.springcloud.gray.request.GrayTrackInfo; import cn.springcloud.gray.request.RequestLocalStorage; @@ -20,7 +19,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import javax.servlet.http.HttpServletRequest; import java.util.List; @Configuration @@ -46,15 +44,10 @@ public static class GrayClientWebConfiguration { @Autowired private GrayTrackProperties grayTrackProperties; - @Autowired - private List> trackors; - - @Autowired - private RequestLocalStorage requestLocalStorage; - @Bean @ConditionalOnMissingBean - public GrayTrackFilter grayTrackFilter(GrayTrackHolder grayTrackHolder) { + public GrayTrackFilter grayTrackFilter( + GrayTrackHolder grayTrackHolder, RequestLocalStorage requestLocalStorage) { return new GrayTrackFilter(grayTrackHolder, requestLocalStorage); } diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/event/DefaultGrayEventListener.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/event/DefaultGrayEventListener.java index 171324f7..8d8f44e8 100644 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/event/DefaultGrayEventListener.java +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/event/DefaultGrayEventListener.java @@ -15,6 +15,11 @@ import java.util.Optional; import java.util.function.Consumer; +/** + * 灰度事件监听器,处理灰度管控端发来的事件消息。 + * 事件源分两种:灰度实例的,或灰度追踪的。 + * 事件类型分两种:更新、删除 + */ public class DefaultGrayEventListener implements GrayEventListener, InstanceLocalInfoAware { private CommunicableGrayManager grayManager; @@ -58,6 +63,10 @@ private DefaultGrayEventListener putHandler(SourceType sourceType, Consumer Date: Sat, 25 May 2019 22:53:16 +0800 Subject: [PATCH 13/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/springcloud/gray/GrayClientConfig.java | 22 -------- .../config/GrayClientAutoConfiguration.java | 42 ++++----------- .../config/GrayLoadAutoConfigration.java | 38 ------------- .../InformationClientConfiguration.java | 54 +++++++++++++++++++ .../properties/GrayClientProperties.java | 46 ---------------- .../properties/GrayServerProperties.java | 19 +++++++ .../src/main/resources/config/application.yml | 3 +- .../src/main/resources/config/application.yml | 3 +- .../src/main/resources/config/application.yml | 4 +- .../src/main/resources/config/application.yml | 3 +- .../main/resources/META-INF/spring.factories | 1 - 11 files changed, 90 insertions(+), 145 deletions(-) delete mode 100644 spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayLoadAutoConfigration.java create mode 100644 spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/InformationClientConfiguration.java create mode 100644 spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/properties/GrayServerProperties.java diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayClientConfig.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayClientConfig.java index 323a8caf..7cd9a08e 100644 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayClientConfig.java +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/GrayClientConfig.java @@ -25,14 +25,6 @@ public interface GrayClientConfig { int grayEnrollDealyTimeInMs(); - /** - * 灰度服务器的url - * - * @return 返回gray-server的url - */ - String getServerUrl(); - - /** * 更新灰度列表的时间间隔(ms),小于等于0将不会开启定时轮询 * @@ -41,18 +33,4 @@ public interface GrayClientConfig { int getServiceUpdateIntervalTimerInMs(); - /** - * 在和灰度服务器通信时,如果交互失败,是否重试。 - * - * @return 返回是否重试 - */ - boolean isRetryable(); - - /** - * 重试次数 - * - * @return 返回重试次数 - */ - int getRetryNumberOfRetries(); - } 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 2c9f7c23..266de43c 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 @@ -5,9 +5,8 @@ import cn.springcloud.gray.client.config.properties.GrayClientProperties; import cn.springcloud.gray.client.config.properties.GrayLoadProperties; import cn.springcloud.gray.client.config.properties.GrayRequestProperties; -import cn.springcloud.gray.communication.HttpInformationClient; +import cn.springcloud.gray.client.config.properties.GrayServerProperties; import cn.springcloud.gray.communication.InformationClient; -import cn.springcloud.gray.communication.RetryableInformationClient; import cn.springcloud.gray.decision.GrayDecisionFactoryKeeper; import cn.springcloud.gray.request.RequestLocalStorage; import cn.springcloud.gray.request.ThreadLocalRequestStorage; @@ -18,15 +17,19 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.springframework.web.client.RestTemplate; import java.util.List; @Configuration -@EnableConfigurationProperties({GrayClientProperties.class, GrayRequestProperties.class, GrayLoadProperties.class}) -//@ConditionalOnBean(GrayClientMarkerConfiguration.GrayClientMarker.class) +@EnableConfigurationProperties( + {GrayClientProperties.class, + GrayServerProperties.class, + GrayRequestProperties.class, + GrayLoadProperties.class}) @ConditionalOnProperty(value = "gray.enabled") -@Import({GrayDecisionFactoryConfiguration.class, GrayTrackConfiguration.class}) +@Import({InformationClientConfiguration.class, + GrayDecisionFactoryConfiguration.class, + GrayTrackConfiguration.class}) public class GrayClientAutoConfiguration { @@ -61,31 +64,4 @@ public RequestLocalStorage requestLocalStorage() { return new ThreadLocalRequestStorage(); } - - @Configuration - public static class InformationClientConfiguration { - - - @Bean("grayInformationRestTemplate") - @ConditionalOnMissingBean(name = {"grayInformationRestTemplate"}) - public RestTemplate grayInformationRestTemplate() { - return new RestTemplate(); - } - - - @Bean - @ConditionalOnMissingBean - @ConditionalOnProperty(value = "gray.client.serverUrl") - public InformationClient informationClient( - @Autowired(required = false) RestTemplate grayInformationRestTemplate, - GrayClientProperties grayClientProperties) { - InformationClient httpClient = new HttpInformationClient(grayClientProperties.getServerUrl(), grayInformationRestTemplate); - if (grayClientProperties.isRetryable()) { - return new RetryableInformationClient(Math.max(3, grayClientProperties.getRetryNumberOfRetries()), httpClient); - } else { - return httpClient; - } - } - } - } diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayLoadAutoConfigration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayLoadAutoConfigration.java deleted file mode 100644 index 06e728a7..00000000 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayLoadAutoConfigration.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.springcloud.gray.client.config; - -import cn.springcloud.gray.GrayManager; -import cn.springcloud.gray.client.config.properties.GrayLoadProperties; -import cn.springcloud.gray.model.GrayStatus; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ConditionalOnProperty(value = "gray.load.enabled", havingValue = "true") -@ConditionalOnBean(GrayManager.class) -@EnableConfigurationProperties({GrayLoadProperties.class}) -public class GrayLoadAutoConfigration { - - @Autowired - private GrayLoadProperties grayLoadProperties; - @Autowired - private GrayManager grayManager; - - - @Bean - public InitializingBean loadGrayInfoInitializing() { - return () -> { - grayLoadProperties.getGrayInstances().forEach(instance -> { - if (instance.getGrayStatus() == null) { - instance.setGrayStatus(GrayStatus.OPEN); - } - grayManager.updateGrayInstance(instance); - }); - }; - } - -} diff --git a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/InformationClientConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/InformationClientConfiguration.java new file mode 100644 index 00000000..616daa57 --- /dev/null +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/InformationClientConfiguration.java @@ -0,0 +1,54 @@ +package cn.springcloud.gray.client.config; + +import cn.springcloud.gray.client.config.properties.GrayServerProperties; +import cn.springcloud.gray.communication.HttpInformationClient; +import cn.springcloud.gray.communication.InformationClient; +import cn.springcloud.gray.communication.RetryableInformationClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +@ConditionalOnProperty(value = "gray.server.url") +public class InformationClientConfiguration { + + + @Configuration + @ConditionalOnProperty(value = "gray.server.loadbalanced", havingValue = "false", matchIfMissing = true) + public static class DefaultGrayInformationRestTemplate { + @Bean("grayInformationRestTemplate") + @ConditionalOnMissingBean(name = {"grayInformationRestTemplate"}) + public RestTemplate grayInformationRestTemplate() { + return new RestTemplate(); + } + } + + @Configuration + @ConditionalOnProperty(value = "gray.server.loadbalanced") + public static class LoadBalancedGrayInformationRestTemplate { + @Bean("grayInformationRestTemplate") + @LoadBalanced + @ConditionalOnMissingBean(name = {"grayInformationRestTemplate"}) + public RestTemplate grayInformationRestTemplate() { + return new RestTemplate(); + } + } + + + @Bean + @ConditionalOnMissingBean + public InformationClient informationClient( + @Autowired(required = false) RestTemplate grayInformationRestTemplate, + GrayServerProperties grayServerProperties) { + InformationClient httpClient = new HttpInformationClient(grayServerProperties.getUrl(), grayInformationRestTemplate); + if (grayServerProperties.isRetryable()) { + return new RetryableInformationClient(Math.max(3, grayServerProperties.getRetryNumberOfRetries()), httpClient); + } else { + return httpClient; + } + } +} 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 139835e7..538badb2 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 @@ -1,7 +1,6 @@ package cn.springcloud.gray.client.config.properties; import cn.springcloud.gray.GrayClientConfig; -import cn.springcloud.gray.communication.RetryableInformationClient; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties("gray.client") @@ -11,24 +10,9 @@ public class GrayClientProperties implements GrayClientConfig { private int serviceUpdateIntervalTimerInMs = 60000; - private String informationClient = "http"; - - private String serverUrl = ""; - - private boolean retryable = true; - private int retryNumberOfRetries = RetryableInformationClient.DEFAULT_NUMBER_OF_RETRIES; - private InstanceConfig instance = new InstanceConfig(); - public String getInformationClient() { - return informationClient; - } - - public void setInformationClient(String informationClient) { - this.informationClient = informationClient; - } - @Override public String runenv() { return runenv; @@ -44,19 +28,12 @@ public int grayEnrollDealyTimeInMs() { return instance.getGrayEnrollDealyTimeInMs(); } - public String getServerUrl() { - return serverUrl; - } @Override public int getServiceUpdateIntervalTimerInMs() { return serviceUpdateIntervalTimerInMs; } - public void setServerUrl(String serverUrl) { - this.serverUrl = serverUrl; - } - public void setServiceUpdateIntervalTimerInMs(int serviceUpdateIntervalTimerInMs) { this.serviceUpdateIntervalTimerInMs = serviceUpdateIntervalTimerInMs; @@ -71,22 +48,6 @@ public void setInstance(InstanceConfig instance) { } - public boolean isRetryable() { - return retryable; - } - - public void setRetryable(boolean retryable) { - this.retryable = retryable; - } - - public int getRetryNumberOfRetries() { - return retryNumberOfRetries; - } - - public void setRetryNumberOfRetries(int retryNumberOfRetries) { - this.retryNumberOfRetries = retryNumberOfRetries; - } - /** * 实例 */ @@ -95,7 +56,6 @@ public class InstanceConfig { private boolean grayEnroll = false; private int grayEnrollDealyTimeInMs = 40000; private boolean useMultiVersion = false; - private String instanceId; public boolean isGrayEnroll() { return grayEnroll; @@ -126,12 +86,6 @@ 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/client/config/properties/GrayServerProperties.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/properties/GrayServerProperties.java new file mode 100644 index 00000000..73af0aa8 --- /dev/null +++ b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/properties/GrayServerProperties.java @@ -0,0 +1,19 @@ +package cn.springcloud.gray.client.config.properties; + +import cn.springcloud.gray.communication.RetryableInformationClient; +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@Setter +@Getter +@ConfigurationProperties("gray.server") +public class GrayServerProperties { + + private String url; + private boolean loadbalanced; + //在和灰度服务器通信时,如果交互失败,是否重试。 + private boolean retryable = true; + //重试次数 + private int retryNumberOfRetries = RetryableInformationClient.DEFAULT_NUMBER_OF_RETRIES; +} 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 545b6f41..8071640d 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 @@ -18,4 +18,5 @@ gray: client: instance: grayEnroll: false #是否在启动后自动注册成灰度实例 - serverUrl: http://localhost:20202 #灰度服务端的url \ No newline at end of file + server: + url: http://localhost:20202 #灰度服务端的url \ No newline at end of file diff --git a/spring-cloud-gray-samples/spring-cloud-gray-service-a1-sample/src/main/resources/config/application.yml b/spring-cloud-gray-samples/spring-cloud-gray-service-a1-sample/src/main/resources/config/application.yml index ced10038..b924b76f 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-service-a1-sample/src/main/resources/config/application.yml +++ b/spring-cloud-gray-samples/spring-cloud-gray-service-a1-sample/src/main/resources/config/application.yml @@ -19,4 +19,5 @@ gray: client: instance: grayEnroll: true #是否在启动后自动注册成灰度实例 - serverUrl: http://localhost:20202 #灰度服务端的url \ No newline at end of file + server: + url: http://localhost:20202 #灰度服务端的url \ No newline at end of file diff --git a/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml index 97930721..edc5ca71 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml +++ b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/src/main/resources/config/application.yml @@ -45,8 +45,8 @@ feign: gray: enabled: true - client: - server-url: http://localhost:20202 + server: + url: http://localhost:20202 request: track: web: diff --git a/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml b/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml index af5e5a8a..0d28bf8d 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml +++ b/spring-cloud-gray-samples/spring-cloud-gray-zuul-sample/src/main/resources/config/application.yml @@ -50,8 +50,9 @@ zuul: # serviceId: eureka-client #指定路由到的serviceId gray: # enabled: true + server: + url: http://localhost:20202 client: - server-url: http://localhost:20202 serviceUpdateIntervalTimerInMs: 0 request: track: diff --git a/spring-cloud-starter-gray-client/src/main/resources/META-INF/spring.factories b/spring-cloud-starter-gray-client/src/main/resources/META-INF/spring.factories index 562c9f39..0b2ea614 100644 --- a/spring-cloud-starter-gray-client/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-starter-gray-client/src/main/resources/META-INF/spring.factories @@ -4,7 +4,6 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ cn.springcloud.gray.client.config.GrayClientAutoConfiguration,\ cn.springcloud.gray.client.config.GrayClientWebConfiguration,\ - cn.springcloud.gray.client.config.GrayLoadAutoConfigration,\ cn.springcloud.gray.client.netflix.configuration.NetflixGrayAutoConfiguration,\ cn.springcloud.gray.client.netflix.configuration.GrayClientEurekaAutoConfiguration,\ cn.springcloud.gray.client.netflix.feign.configuration.GrayFeignAutoConfiguration,\ From ee393218437b2e6394a894a6f716f64b2d8f6c5d Mon Sep 17 00:00:00 2001 From: saleson Date: Sun, 26 May 2019 20:54:16 +0800 Subject: [PATCH 14/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=20?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=AE=9A=E6=97=B6=E6=B8=85=E9=99=A4=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E7=9A=84=E7=81=B0=E5=BA=A6=E6=9C=8D=E5=8A=A1=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/config/application.yml | 5 +- .../test/GrayInstanceRecordEvictionTest.java | 47 +++++++++++++++ .../service/test/GrayInstanceServiceTest.java | 13 +++- spring-cloud-gray-server/pom.xml | 4 ++ .../GrayServerInitializingDestroyBean.java | 60 +++++++++++++++++-- .../configuration/DBStorageConfiguration.java | 31 ++++++++-- .../GrayServerAutoConfiguration.java | 7 +-- .../properties/GrayServerProperties.java | 46 +++++++++++++- .../gray/server/dao/model/GrayInstanceDO.java | 3 + .../repository/GrayInstanceRepository.java | 4 ++ .../evictor/DefaultGrayServiceEvictor.java | 2 +- .../manager/DefaultGrayServiceManager.java | 2 +- .../module/GrayInstanceRecordEvictor.java | 12 ++++ .../gray/server/module/SimpleGrayModule.java | 3 +- .../server/module/domain/GrayInstance.java | 4 ++ .../jpa/JPAGrayInstanceRecordEvictor.java | 41 +++++++++++++ .../JPAGrayServerModule.java} | 9 +-- .../JPAGrayServerTrackModule.java} | 7 ++- .../server/service/GrayInstanceService.java | 21 +++++++ .../gray/concurrent/DefaultThreadFactory.java | 28 +++++++++ 20 files changed, 322 insertions(+), 27 deletions(-) create mode 100644 spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/test/java/cn/springcloud/gray/service/test/GrayInstanceRecordEvictionTest.java create mode 100644 spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/GrayInstanceRecordEvictor.java create mode 100644 spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/jpa/JPAGrayInstanceRecordEvictor.java rename spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/{SimpleGrayServerModule.java => jpa/JPAGrayServerModule.java} (96%) rename spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/{SimpleGrayServerTrackModule.java => jpa/JPAGrayServerTrackModule.java} (91%) create mode 100644 spring-cloud-gray-utils/src/main/java/cn/springcloud/gray/concurrent/DefaultThreadFactory.java diff --git a/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/main/resources/config/application.yml b/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/main/resources/config/application.yml index f08392ab..ac2a1c97 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/main/resources/config/application.yml +++ b/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/main/resources/config/application.yml @@ -54,4 +54,7 @@ eureka: gray: server: - evictionIntervalTimerInMs: 30000 \ No newline at end of file + evictionIntervalTimerInMs: 30000 + instance: + eviction: + enabled: true \ No newline at end of file diff --git a/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/test/java/cn/springcloud/gray/service/test/GrayInstanceRecordEvictionTest.java b/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/test/java/cn/springcloud/gray/service/test/GrayInstanceRecordEvictionTest.java new file mode 100644 index 00000000..95080a0d --- /dev/null +++ b/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/test/java/cn/springcloud/gray/service/test/GrayInstanceRecordEvictionTest.java @@ -0,0 +1,47 @@ +package cn.springcloud.gray.service.test; + +import cn.springcloud.gray.server.app.GrayServerApplication; +import cn.springcloud.gray.server.configuration.properties.GrayServerProperties; +import cn.springcloud.gray.server.module.GrayInstanceRecordEvictor; +import cn.springcloud.gray.server.module.domain.GrayInstance; +import cn.springcloud.gray.server.service.GrayInstanceService; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +@ActiveProfiles({"dev"}) +@RunWith(SpringRunner.class) +@SpringBootTest(classes = GrayServerApplication.class) +@Slf4j +public class GrayInstanceRecordEvictionTest { + + @Autowired + private GrayServerProperties grayServerProperties; + @Autowired + private GrayInstanceRecordEvictor grayInstanceRecordEvictor; + @Autowired + private GrayInstanceService grayInstanceService; + + @Test + public void testEvictGrayInstance() { + GrayServerProperties.InstanceRecordEvictProperties evictProperties = + grayServerProperties.getInstance().getEviction(); + List befores = grayInstanceService.findAllByEvictableRecords( + evictProperties.getLastUpdateDateExpireDays(), evictProperties.getEvictionInstanceStatus()); + + if (befores.size() > 0) { + grayInstanceRecordEvictor.evict(); + List afters = grayInstanceService.findAllByEvictableRecords( + evictProperties.getLastUpdateDateExpireDays(), evictProperties.getEvictionInstanceStatus()); + log.info("before:{}, after:{}", befores.size(), afters.size()); + Assert.assertTrue("清理失败的灰度服务实例失败", afters.size() == 0); + } + } +} diff --git a/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/test/java/cn/springcloud/gray/service/test/GrayInstanceServiceTest.java b/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/test/java/cn/springcloud/gray/service/test/GrayInstanceServiceTest.java index 4ca66d02..90ebc021 100644 --- a/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/test/java/cn/springcloud/gray/service/test/GrayInstanceServiceTest.java +++ b/spring-cloud-gray-samples/spring-cloud-gray-server-sample/src/test/java/cn/springcloud/gray/service/test/GrayInstanceServiceTest.java @@ -2,6 +2,7 @@ import cn.springcloud.gray.model.GrayStatus; +import cn.springcloud.gray.model.InstanceStatus; import cn.springcloud.gray.server.app.GrayServerApplication; import cn.springcloud.gray.server.configuration.properties.GrayServerProperties; import cn.springcloud.gray.server.module.domain.GrayInstance; @@ -16,6 +17,7 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; +import java.util.Arrays; import java.util.List; @ActiveProfiles({"dev"}) @@ -36,8 +38,17 @@ public class GrayInstanceServiceTest { @Test public void test() throws JsonProcessingException { List grayInstances = grayInstanceService.findAllByStatus( - GrayStatus.OPEN, grayServerProperties.getNormalInstanceStatus()); + GrayStatus.OPEN, grayServerProperties.getInstance().getNormalInstanceStatus()); log.info("{}", objectMapper.writeValueAsString(grayInstances)); } + + + @Test + public void testFindAllByEvictableRecords() throws JsonProcessingException { + List grayInstances = grayInstanceService.findAllByEvictableRecords(1, + Arrays.asList(InstanceStatus.DOWN, InstanceStatus.UNKNOWN)); + System.out.println(objectMapper.writeValueAsString(grayInstances)); + } + } diff --git a/spring-cloud-gray-server/pom.xml b/spring-cloud-gray-server/pom.xml index 00aec0b4..00808586 100644 --- a/spring-cloud-gray-server/pom.xml +++ b/spring-cloud-gray-server/pom.xml @@ -13,6 +13,10 @@ + + cn.springcloud.gray + spring-cloud-gray-utils + cn.springcloud.gray spring-cloud-gray-core diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/GrayServerInitializingDestroyBean.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/GrayServerInitializingDestroyBean.java index 635f1da9..cc8af317 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/GrayServerInitializingDestroyBean.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/GrayServerInitializingDestroyBean.java @@ -1,15 +1,33 @@ package cn.springcloud.gray.server; +import cn.springcloud.gray.concurrent.DefaultThreadFactory; +import cn.springcloud.gray.server.configuration.properties.GrayServerProperties; import cn.springcloud.gray.server.manager.GrayServiceManager; +import cn.springcloud.gray.server.module.GrayInstanceRecordEvictor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; import javax.annotation.PreDestroy; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; -public class GrayServerInitializingDestroyBean implements InitializingBean { +@Slf4j +public class GrayServerInitializingDestroyBean + implements InitializingBean, ApplicationContextAware { private GrayServiceManager grayServiceManager; + private GrayServerProperties grayServerProperties; + private ScheduledExecutorService scheduledExecutorService = + new ScheduledThreadPoolExecutor(1, new DefaultThreadFactory("initDestory")); + private ApplicationContext appCxt; - public GrayServerInitializingDestroyBean(GrayServiceManager grayServiceManager) { + public GrayServerInitializingDestroyBean( + GrayServiceManager grayServiceManager, GrayServerProperties grayServerProperties) { this.grayServiceManager = grayServiceManager; + this.grayServerProperties = grayServerProperties; } @Override @@ -17,14 +35,48 @@ public void afterPropertiesSet() { initToWork(); } - private void initToWork() { grayServiceManager.openForWork(); - } + // 初始化灰度实例的回收任务 + initGrayInstanceRecordEvictionTask(); + } @PreDestroy public void shutdown() { grayServiceManager.shutdown(); + scheduledExecutorService.shutdown(); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + appCxt = applicationContext; + } + + private void initGrayInstanceRecordEvictionTask() { + GrayServerProperties.InstanceRecordEvictProperties evictProperties = + grayServerProperties.getInstance().getEviction(); + if (!evictProperties.isEnabled()) { + return; + } + String beanName = "grayInstanceRecordEvictor"; + GrayInstanceRecordEvictor instanceRecordEvictor = + getBean(beanName, GrayInstanceRecordEvictor.class); + if (instanceRecordEvictor == null) { + log.error("没有找到名为{}的GrayInstanceRecordEvictor类型或者为GrayInstanceRecordEvictor类型的实例", beanName); + throw new NullPointerException("没有找到GrayInstanceRecordEvictor类型的实例"); + } + scheduledExecutorService.schedule( + () -> instanceRecordEvictor.evict(), + evictProperties.getEvictionIntervalTimerInMs(), + TimeUnit.MILLISECONDS); + } + + private T getBean(String beanName, Class cls) { + T t = appCxt.getBean(beanName, cls); + if (t == null) { + t = appCxt.getBean(cls); + } + return t; } } diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/DBStorageConfiguration.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/DBStorageConfiguration.java index 606cc5a5..7f147050 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/DBStorageConfiguration.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/DBStorageConfiguration.java @@ -2,13 +2,17 @@ import cn.springcloud.gray.event.GrayEventPublisher; import cn.springcloud.gray.server.configuration.properties.GrayServerProperties; +import cn.springcloud.gray.server.module.GrayInstanceRecordEvictor; import cn.springcloud.gray.server.module.GrayServerModule; import cn.springcloud.gray.server.module.GrayServerTrackModule; -import cn.springcloud.gray.server.module.SimpleGrayServerModule; -import cn.springcloud.gray.server.module.SimpleGrayServerTrackModule; +import cn.springcloud.gray.server.module.jpa.JPAGrayInstanceRecordEvictor; +import cn.springcloud.gray.server.module.jpa.JPAGrayServerModule; +import cn.springcloud.gray.server.module.jpa.JPAGrayServerTrackModule; import cn.springcloud.gray.server.service.*; 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.autoconfigure.domain.EntityScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -39,7 +43,7 @@ public GrayServerModule grayServerModule( GrayEventPublisher grayEventPublisher, GrayServiceService grayServiceService, GrayInstanceService grayInstanceService, GrayDecisionService grayDecisionService, GrayPolicyService grayPolicyService) { - return new SimpleGrayServerModule( + return new JPAGrayServerModule( grayServerProperties, grayEventPublisher, grayServiceService, grayInstanceService, grayDecisionService, grayPolicyService); } @@ -47,11 +51,30 @@ public GrayServerModule grayServerModule( @Bean public GrayServerTrackModule grayServerTrackModule(GrayEventPublisher grayEventPublisher, GrayTrackService grayTrackService) { - return new SimpleGrayServerTrackModule(grayEventPublisher, grayTrackService); + return new JPAGrayServerTrackModule(grayEventPublisher, grayTrackService); } } + + @Configuration + @ConditionalOnProperty("gray.server.instance.eviction.enabled") + public static class JPAGrayInstanceRecordEvictionConfiguration { + + @Bean + @ConditionalOnMissingBean + public GrayInstanceRecordEvictor grayInstanceRecordEvictor( + GrayInstanceService grayInstanceService, GrayServerProperties grayServerProperties) { + GrayServerProperties.InstanceRecordEvictProperties evictProperties = + grayServerProperties.getInstance().getEviction(); + return new JPAGrayInstanceRecordEvictor(grayInstanceService, + evictProperties.getEvictionInstanceStatus(), + evictProperties.getLastUpdateDateExpireDays()); + } + + + } + @Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/GrayServerAutoConfiguration.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/GrayServerAutoConfiguration.java index be02b414..7b31a1a9 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/GrayServerAutoConfiguration.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/GrayServerAutoConfiguration.java @@ -33,8 +33,6 @@ public class GrayServerAutoConfiguration { @Autowired private GrayServerProperties grayServerConfig; - @Autowired - private GrayServerModule grayServerModule; @Bean @ConditionalOnMissingBean @@ -44,14 +42,15 @@ public RestTemplate restTemplate() { @Bean @ConditionalOnMissingBean - public DefaultGrayServiceManager defaultGrayServiceManager(GrayServerEvictor grayServerEvictor) { + public DefaultGrayServiceManager defaultGrayServiceManager( + GrayServerEvictor grayServerEvictor, GrayServerModule grayServerModule) { return new DefaultGrayServiceManager(grayServerConfig, grayServerModule, grayServerEvictor); } @Bean public GrayServerInitializingDestroyBean grayServerInitializingBean(GrayServiceManager grayServiceManager) { - return new GrayServerInitializingDestroyBean(grayServiceManager); + return new GrayServerInitializingDestroyBean(grayServiceManager, grayServerConfig); } diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/properties/GrayServerProperties.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/properties/GrayServerProperties.java index fb94759d..e6195c7e 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/properties/GrayServerProperties.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/configuration/properties/GrayServerProperties.java @@ -8,16 +8,56 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Set; +import java.util.concurrent.TimeUnit; @Setter @Getter @ConfigurationProperties(prefix = "gray.server") public class GrayServerProperties { - private int evictionIntervalTimerInMs = 60000; + private long evictionIntervalTimerInMs = TimeUnit.SECONDS.toMillis(60); - private Set normalInstanceStatus = - new HashSet<>(Arrays.asList(InstanceStatus.STARTING, InstanceStatus.UP)); + private InstanceProperties instance = new InstanceProperties(); + @Setter + @Getter + public static class InstanceProperties { + private Set normalInstanceStatus = + new HashSet<>(Arrays.asList(InstanceStatus.STARTING, InstanceStatus.UP)); + + + private InstanceRecordEvictProperties eviction = new InstanceRecordEvictProperties(); + + + } + + + /** + * 灰度实例的清理配置参数 + */ + @Setter + @Getter + public static class InstanceRecordEvictProperties { + + private boolean enabled; + + /** + * 定时执行的时间周期 + */ + private long evictionIntervalTimerInMs = TimeUnit.DAYS.toMillis(1l); + + + /** + * 将被清理的状态 + */ + private Set evictionInstanceStatus = + new HashSet<>(Arrays.asList(InstanceStatus.DOWN, InstanceStatus.UNKNOWN)); + + + /** + * 最后更新时间过期天数 + */ + private int lastUpdateDateExpireDays = 1; + } } diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/model/GrayInstanceDO.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/model/GrayInstanceDO.java index ca6682d1..94846810 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/model/GrayInstanceDO.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/model/GrayInstanceDO.java @@ -3,6 +3,7 @@ import lombok.*; import javax.persistence.*; +import java.util.Date; @Setter @Getter @@ -21,6 +22,8 @@ public class GrayInstanceDO { private String host; @Column(length = 5) private Integer port; + @Column + private Date lastUpdateDate; /** * 实例状态 diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/repository/GrayInstanceRepository.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/repository/GrayInstanceRepository.java index dfbbf371..2e0381af 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/repository/GrayInstanceRepository.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/dao/repository/GrayInstanceRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Date; import java.util.List; @Repository @@ -21,4 +22,7 @@ public interface GrayInstanceRepository extends JpaRepository findAllByServiceIdAndInstanceStatusIn(String serviceId, String[] instanceStatus); List findAllByGrayStatusAndInstanceStatusIn(String grayStatus, String[] instanceStatus); + + + List findAllByLastUpdateDateBeforeAndInstanceStatusIn(Date lastUpdateDate, String[] instanceStatus); } diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/evictor/DefaultGrayServiceEvictor.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/evictor/DefaultGrayServiceEvictor.java index cd388d9b..85d37299 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/evictor/DefaultGrayServiceEvictor.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/evictor/DefaultGrayServiceEvictor.java @@ -49,7 +49,7 @@ private void updateInstanceStatus(GrayServerModule grayServerModule, GrayInstanc private void downAllInstance(GrayServerModule grayServerModule, GrayService grayService) { List grayInstances = grayServerModule.listGrayInstancesByServiceId(grayService.getServiceId(), - grayServerProperties.getNormalInstanceStatus()); + grayServerProperties.getInstance().getNormalInstanceStatus()); grayInstances.forEach(i -> grayServerModule.instanceShutdown(i.getInstanceId())); } diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/manager/DefaultGrayServiceManager.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/manager/DefaultGrayServiceManager.java index 0ef3f279..cb884960 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/manager/DefaultGrayServiceManager.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/manager/DefaultGrayServiceManager.java @@ -34,7 +34,7 @@ public GrayServerModule getGrayServerModule() { @Override public void openForWork() { - int times = grayServerProperties.getEvictionIntervalTimerInMs(); + long times = grayServerProperties.getEvictionIntervalTimerInMs(); if (times > 0) { evictionTimer.schedule(new EvictionTask(), times, times); } diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/GrayInstanceRecordEvictor.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/GrayInstanceRecordEvictor.java new file mode 100644 index 00000000..7ccfbf43 --- /dev/null +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/GrayInstanceRecordEvictor.java @@ -0,0 +1,12 @@ +package cn.springcloud.gray.server.module; + + +/** + * + */ +public interface GrayInstanceRecordEvictor { + + + void evict(); + +} diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayModule.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayModule.java index 155ad334..176344fe 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayModule.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayModule.java @@ -78,7 +78,8 @@ private GrayTrackDefinition ofGrayTrack(GrayTrack grayTrack) { @Override public List allOpenInstances() { List instances = - grayServerModule.listGrayInstancesByNormalInstanceStatus(grayServerProperties.getNormalInstanceStatus()); + grayServerModule.listGrayInstancesByNormalInstanceStatus( + grayServerProperties.getInstance().getNormalInstanceStatus()); List grayInstances = new ArrayList<>(instances.size()); instances.forEach(instance -> { diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/domain/GrayInstance.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/domain/GrayInstance.java index ccfd9f49..130c0716 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/domain/GrayInstance.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/domain/GrayInstance.java @@ -6,6 +6,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.*; +import java.util.Date; + @ApiModel("实例的灰度信息") @Setter @@ -23,6 +25,8 @@ public class GrayInstance { private String host; @ApiModelProperty("服务实例端口") private Integer port; + @ApiModelProperty("最后更新时间") + private Date lastUpdateDate; /** * 实例状态 diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/jpa/JPAGrayInstanceRecordEvictor.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/jpa/JPAGrayInstanceRecordEvictor.java new file mode 100644 index 00000000..baf475f3 --- /dev/null +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/jpa/JPAGrayInstanceRecordEvictor.java @@ -0,0 +1,41 @@ +package cn.springcloud.gray.server.module.jpa; + +import cn.springcloud.gray.model.InstanceStatus; +import cn.springcloud.gray.server.module.GrayInstanceRecordEvictor; +import cn.springcloud.gray.server.module.domain.GrayInstance; +import cn.springcloud.gray.server.service.GrayInstanceService; + +import java.util.List; +import java.util.Set; + +public class JPAGrayInstanceRecordEvictor implements GrayInstanceRecordEvictor { + + private GrayInstanceService grayInstanceService; + /** + * 将被清理的状态 + */ + private Set evictionInstanceStatus; + + + /** + * 最后更新时间过期天数 + */ + private int lastUpdateDateExpireDays; + + + public JPAGrayInstanceRecordEvictor( + GrayInstanceService grayInstanceService, + Set evictionInstanceStatus, + int lastUpdateDateExpireDays) { + this.grayInstanceService = grayInstanceService; + this.evictionInstanceStatus = evictionInstanceStatus; + this.lastUpdateDateExpireDays = lastUpdateDateExpireDays; + } + + @Override + public void evict() { + List grayInstances = + grayInstanceService.findAllByEvictableRecords(lastUpdateDateExpireDays, evictionInstanceStatus); + grayInstances.forEach(grayInstance -> grayInstanceService.deleteReactById(grayInstance.getInstanceId())); + } +} diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayServerModule.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/jpa/JPAGrayServerModule.java similarity index 96% rename from spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayServerModule.java rename to spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/jpa/JPAGrayServerModule.java index 7e6da582..ac258f88 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayServerModule.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/jpa/JPAGrayServerModule.java @@ -1,4 +1,4 @@ -package cn.springcloud.gray.server.module; +package cn.springcloud.gray.server.module.jpa; import cn.springcloud.gray.event.EventType; import cn.springcloud.gray.event.GrayEventMsg; @@ -7,6 +7,7 @@ import cn.springcloud.gray.model.GrayStatus; import cn.springcloud.gray.model.InstanceStatus; import cn.springcloud.gray.server.configuration.properties.GrayServerProperties; +import cn.springcloud.gray.server.module.GrayServerModule; import cn.springcloud.gray.server.module.domain.GrayDecision; import cn.springcloud.gray.server.module.domain.GrayInstance; import cn.springcloud.gray.server.module.domain.GrayPolicy; @@ -24,7 +25,7 @@ import java.util.Objects; @Slf4j -public class SimpleGrayServerModule implements GrayServerModule { +public class JPAGrayServerModule implements GrayServerModule { private GrayServiceService grayServiceService; private GrayInstanceService grayInstanceService; @@ -33,7 +34,7 @@ public class SimpleGrayServerModule implements GrayServerModule { private GrayEventPublisher grayEventPublisher; private GrayServerProperties grayServerProperties; - public SimpleGrayServerModule( + public JPAGrayServerModule( GrayServerProperties grayServerProperties, GrayEventPublisher grayEventPublisher, GrayServiceService grayServiceService, GrayInstanceService grayInstanceService, @@ -103,7 +104,7 @@ public void updateInstanceStatus(GrayInstance instance, InstanceStatus instanceS instance.setInstanceStatus(instanceStatus); grayInstanceService.saveModel(instance); if (instance.getGrayStatus() == GrayStatus.OPEN) { - if (grayServerProperties.getNormalInstanceStatus().contains(instanceStatus)) { + if (grayServerProperties.getInstance().getNormalInstanceStatus().contains(instanceStatus)) { publishUpdateIntanceEvent(instance); } else { publishDownIntanceEvent(instance); diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayServerTrackModule.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/jpa/JPAGrayServerTrackModule.java similarity index 91% rename from spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayServerTrackModule.java rename to spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/jpa/JPAGrayServerTrackModule.java index 4e827c73..7f9af8d6 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/SimpleGrayServerTrackModule.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/module/jpa/JPAGrayServerTrackModule.java @@ -1,10 +1,11 @@ -package cn.springcloud.gray.server.module; +package cn.springcloud.gray.server.module.jpa; import cn.springcloud.gray.event.EventType; import cn.springcloud.gray.event.GrayEventMsg; import cn.springcloud.gray.event.GrayEventPublisher; import cn.springcloud.gray.event.SourceType; import cn.springcloud.gray.model.GrayTrackDefinition; +import cn.springcloud.gray.server.module.GrayServerTrackModule; import cn.springcloud.gray.server.module.domain.GrayTrack; import cn.springcloud.gray.server.service.GrayTrackService; import org.apache.commons.lang.StringUtils; @@ -13,12 +14,12 @@ import java.util.List; -public class SimpleGrayServerTrackModule implements GrayServerTrackModule { +public class JPAGrayServerTrackModule implements GrayServerTrackModule { private GrayEventPublisher grayEventPublisher; private GrayTrackService grayTrackService; - public SimpleGrayServerTrackModule(GrayEventPublisher grayEventPublisher, GrayTrackService grayTrackService) { + public JPAGrayServerTrackModule(GrayEventPublisher grayEventPublisher, GrayTrackService grayTrackService) { this.grayEventPublisher = grayEventPublisher; this.grayTrackService = grayTrackService; } diff --git a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/GrayInstanceService.java b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/GrayInstanceService.java index 872536d6..52acbcaa 100644 --- a/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/GrayInstanceService.java +++ b/spring-cloud-gray-server/src/main/java/cn/springcloud/gray/server/service/GrayInstanceService.java @@ -14,7 +14,10 @@ import org.springframework.stereotype.Service; import javax.transaction.Transactional; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -60,6 +63,12 @@ public void deleteReactById(String id) { }); } + @Override + public void saveModel(GrayInstance grayInstance) { + grayInstance.setLastUpdateDate(new Date()); + super.saveModel(grayInstance); + } + public List findAllByStatus(GrayStatus grayStatus, Collection instanceStatusList) { String[] instanceStatusAry = toArray(instanceStatusList); return grayInstanceMapper.dos2models( @@ -90,4 +99,16 @@ private String[] toArray(Collection instanceStatusList) { .collect(Collectors.toList()) .toArray(new String[instanceStatusList.size()]); } + + public List findAllByEvictableRecords( + int lastUpdateDateExpireDays, Collection evictionInstanceStatus) { + Date lastUpdateDate = Date.from( + LocalDateTime + .now() + .minusDays(lastUpdateDateExpireDays) + .atZone(ZoneId.systemDefault()) + .toInstant()); + String[] instanceStatusAry = toArray(evictionInstanceStatus); + return dos2models(repository.findAllByLastUpdateDateBeforeAndInstanceStatusIn(lastUpdateDate, instanceStatusAry)); + } } diff --git a/spring-cloud-gray-utils/src/main/java/cn/springcloud/gray/concurrent/DefaultThreadFactory.java b/spring-cloud-gray-utils/src/main/java/cn/springcloud/gray/concurrent/DefaultThreadFactory.java new file mode 100644 index 00000000..466e21e8 --- /dev/null +++ b/spring-cloud-gray-utils/src/main/java/cn/springcloud/gray/concurrent/DefaultThreadFactory.java @@ -0,0 +1,28 @@ +package cn.springcloud.gray.concurrent; + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +public class DefaultThreadFactory implements ThreadFactory { + + private static final AtomicInteger poolNumber = new AtomicInteger(1); + private final ThreadGroup group; + private final AtomicInteger threadNumber = new AtomicInteger(1); + private final String namePrefix; + + public DefaultThreadFactory(String threadPrefix) { + SecurityManager s = System.getSecurityManager(); + group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); + namePrefix = threadPrefix + "-" + poolNumber.getAndIncrement() + "-thread-"; + } + + public Thread newThread(Runnable r) { + Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0); + if (t.isDaemon()) + t.setDaemon(false); + if (t.getPriority() != Thread.NORM_PRIORITY) + t.setPriority(Thread.NORM_PRIORITY); + return t; + } + +} \ No newline at end of file