diff --git a/pom.xml b/pom.xml index b99a1c30..65e65cb9 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ cn.springcloud.gray spring-cloud-gray pom - 2.1.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 76b842d0..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 - 2.1.0 + A.1.0.1 4.0.0 @@ -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-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 a274db50..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 @@ -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; @@ -8,7 +10,7 @@ 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; @@ -20,20 +22,30 @@ import java.io.IOException; @Configuration +@ConditionalOnBean(GrayManager.class) @ConditionalOnClass({HystrixCommand.class, HystrixFeign.class}) +//@Import(HystrixGrayTrackWebConfiguration.class) public class HystrixGrayAutoConfiguration { - @Autowired - private GrayManager grayManager; - - @Bean public RequestLocalStorage requestLocalStorage() { return new HystrixRequestLocalStorage(); } + /** + * 支持hystrix使用线程隔离时依然能够进行跑线程传递GrayRequest + * + * @return DefaultHystrixRibbonConnectionPoint + */ + @Bean + public RibbonConnectionPoint hystrixRibbonConnectionPoint( + GrayManager grayManager, RequestLocalStorage requestLocalStorage) { + return new DefaultHystrixRibbonConnectionPoint(grayManager, requestLocalStorage); + } + + @Bean public GrayTrackFilter grayTrackFilter( GrayTrackHolder grayTrackHolder, @@ -54,5 +66,4 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha } }; } - } 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/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(); } 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 2138843f..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,12 +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.ConditionalOnProperty; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; @@ -16,7 +17,8 @@ import java.util.List; @Configuration -@ConditionalOnClass(value = RestTemplate.class) +@ConditionalOnBean({GrayManager.class, RestTemplate.class}) +@ConditionalOnClass(value = {RestTemplate.class, LoadBalanced.class}) public class GrayRestTemplateAutoConfiguration { @Autowired @@ -26,20 +28,13 @@ public class GrayRestTemplateAutoConfiguration { @Bean - @LoadBalanced - @ConditionalOnMissingBean - public RestTemplate restTemplate() { - RestTemplate restTemplate = new RestTemplate(); -// restTemplate.getInterceptors().add(grayClientHttpRequestIntercptor); - return restTemplate; - } - - - @Bean - public GrayClientHttpRequestIntercptor grayClientHttpRequestIntercptor(@LoadBalanced List restTemplates) { + public GrayClientHttpRequestIntercptor grayClientHttpRequestIntercptor( + @Autowired(required = false) @LoadBalanced List restTemplates) { GrayClientHttpRequestIntercptor intercptor = new GrayClientHttpRequestIntercptor( grayRequestProperties, ribbonConnectionPoint); - restTemplates.forEach(restTemplate -> restTemplate.getInterceptors().add(intercptor)); + if (restTemplates != null) { + restTemplates.forEach(restTemplate -> restTemplate.getInterceptors().add(intercptor)); + } return intercptor; } @@ -48,7 +43,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-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..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 @@ -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.*; @@ -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); @@ -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-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 0e32020c..b0945dec 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.1 4.0.0 @@ -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/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/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/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/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 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/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 699193f2..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 @@ -1,18 +1,16 @@ 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; -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; 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; @@ -23,9 +21,15 @@ import java.util.List; @Configuration -@EnableConfigurationProperties({GrayClientProperties.class, GrayRequestProperties.class}) -@ConditionalOnBean(GrayClientMarkerConfiguration.GrayClientMarker.class) -@Import({GrayDecisionFactoryConfiguration.class, GrayTrackConfiguration.class}) +@EnableConfigurationProperties( + {GrayClientProperties.class, + GrayServerProperties.class, + GrayRequestProperties.class, + GrayLoadProperties.class}) +@ConditionalOnProperty(value = "gray.enabled") +@Import({InformationClientConfiguration.class, + GrayDecisionFactoryConfiguration.class, + GrayTrackConfiguration.class}) public class GrayClientAutoConfiguration { @@ -33,19 +37,6 @@ public class GrayClientAutoConfiguration { private GrayClientProperties grayClientProperties; - @Bean - @ConditionalOnMissingBean - @ConditionalOnProperty(value = "gray.client.serverUrl") - public InformationClient informationClient() { - InformationClient httpClient = new HttpInformationClient(grayClientProperties.getServerUrl()); - if (grayClientProperties.isRetryable()) { - return new RetryableInformationClient(Math.max(3, grayClientProperties.getRetryNumberOfRetries()), httpClient); - } else { - return httpClient; - } - } - - @Bean @ConditionalOnMissingBean public GrayManager grayManager( @@ -60,10 +51,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); } @@ -73,5 +64,4 @@ public RequestLocalStorage requestLocalStorage() { return new ThreadLocalRequestStorage(); } - } 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 deleted file mode 100644 index 3da51f44..00000000 --- a/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayLoadAutoConfigration.java +++ /dev/null @@ -1,36 +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.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") -@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/GrayTrackConfiguration.java b/spring-cloud-gray-client/src/main/java/cn/springcloud/gray/client/config/GrayTrackConfiguration.java index bd16c3d6..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; @@ -19,9 +18,7 @@ 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; @Configuration @@ -42,26 +39,21 @@ 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; - @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); } @Bean - public FilterRegistrationBean companyUrlFilterRegister(GrayTrackFilter filter) { + public FilterRegistrationBean grayTrackFilter(GrayTrackFilter filter) { GrayTrackProperties.Web webProperties = grayTrackProperties.getWeb(); FilterRegistrationBean registration = new FilterRegistrationBean(); //注入过滤器 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-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 spring-cloud-gray cn.springcloud.gray - 2.1.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 24f2b676..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 - 2.1.0 + A.1.0.1 @@ -17,7 +17,7 @@ cn.springcloud.gray spring-cloud-gray-dependencies - 2.1.0 + A.1.0.1 pom diff --git a/spring-cloud-gray-samples/pom.xml b/spring-cloud-gray-samples/pom.xml index 63664fdf..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 - 2.1.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 9e3d32c0..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 - 2.1.0 + A.1.0.1 4.0.0 @@ -20,7 +20,7 @@ spring-cloud-gray-utils cn.springcloud.gray - 2.1.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 f02f4881..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 - 2.1.0 + A.1.0.1 4.0.0 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..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 @@ -35,7 +35,7 @@ spring: # max-attempts: 1 GrayEventOutput: destination: gray_event - # rabbit: + # rabbit: # bindings: # GrayEventInput: # consumer: @@ -54,4 +54,7 @@ eureka: gray: server: - evictionIntervalTimerInMs: 60000 \ 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-samples/spring-cloud-gray-service-a-sample/pom.xml b/spring-cloud-gray-samples/spring-cloud-gray-service-a-sample/pom.xml index 7d6a0317..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 - 2.1.0 + A.1.0.1 4.0.0 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 07621a45..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 @@ -14,7 +14,9 @@ eureka: lease-renewal-interval-in-seconds: 10 lease-expiration-duration-in-seconds: 30 gray: + enabled: true client: instance: - grayEnroll: true #是否在启动后自动注册成灰度实例 - serverUrl: http://localhost:20202 #灰度服务端的url \ No newline at end of file + grayEnroll: false #是否在启动后自动注册成灰度实例 + 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/pom.xml b/spring-cloud-gray-samples/spring-cloud-gray-service-a1-sample/pom.xml index 5972f88a..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 - 2.1.0 + A.1.0.1 4.0.0 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/pom.xml b/spring-cloud-gray-samples/spring-cloud-gray-service-b-sample/pom.xml index 347c01f1..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 - 2.1.0 + A.1.0.1 4.0.0 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 8bd22265..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 @@ -36,16 +36,17 @@ 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 - initial-status: starting + lease-renewal-interval-in-seconds: 5 + lease-expiration-duration-in-seconds: 15 +# initial-status: starting feign: hystrix: enabled: true gray: - client: - server-url: http://localhost:20202 + enabled: true + server: + url: http://localhost:20202 request: track: web: @@ -60,7 +61,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-stream-sample/pom.xml b/spring-cloud-gray-samples/spring-cloud-gray-stream-sample/pom.xml index cc96b623..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 - 2.1.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 dbf75869..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 - 2.1.0 + A.1.0.1 4.0.0 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 8491329d..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 @@ -32,9 +32,9 @@ eureka: serviceUrl: defaultZone: http://localhost:20001/eureka/ instance: - lease-renewal-interval-in-seconds: 10 - lease-expiration-duration-in-seconds: 30 - initial-status: starting + lease-renewal-interval-in-seconds: 5 + lease-expiration-duration-in-seconds: 15 +# initial-status: starting ribbon: # ReadTimeout: 30000 @@ -49,8 +49,10 @@ zuul: # path: /client/** #匹配/techouse/usersystem/** 均路由到cloud-client # 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-gray-server/pom.xml b/spring-cloud-gray-server/pom.xml index a1af1066..00808586 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.1 4.0.0 @@ -13,6 +13,10 @@ + + cn.springcloud.gray + spring-cloud-gray-utils + cn.springcloud.gray spring-cloud-gray-core @@ -28,6 +32,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/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 6e1c0bf3..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 @@ -14,7 +15,6 @@ public class GrayInstanceDO { @Id @Column(length = 64) - @GeneratedValue(strategy = GenerationType.IDENTITY) private String instanceId; @Column(length = 32) private String serviceId; @@ -22,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/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; 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/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/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 94% 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 ea9b46a5..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, @@ -94,11 +95,16 @@ 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); 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-starter-dependencies/pom.xml b/spring-cloud-gray-starter-dependencies/pom.xml index a9fb6975..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 - 2.1.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 c57924e2..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 - 2.1.0 + A.1.0.1 4.0.0 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 diff --git a/spring-cloud-gray-webui/pom.xml b/spring-cloud-gray-webui/pom.xml index a16291d1..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 - 2.1.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 823d6925..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 - 2.1.0 + A.1.0.1 4.0.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..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 @@ -1,8 +1,9 @@ # 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,\ - 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,\ diff --git a/spring-cloud-starter-gray-eureka-server/pom.xml b/spring-cloud-starter-gray-eureka-server/pom.xml index 16fd2a23..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 - 2.1.0 + A.1.0.1 4.0.0 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"); } diff --git a/spring-cloud-starter-gray-server/pom.xml b/spring-cloud-starter-gray-server/pom.xml index 95b5f717..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 - 2.1.0 + A.1.0.1 4.0.0