From 7fd83dc8420e746f3e4400a724f73f8bd261330f Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Wed, 3 Sep 2014 12:37:56 -0600 Subject: [PATCH] add @EnableTurbine to allow boot apps to embed the turbine server --- pom.xml | 2 +- spring-cloud-netflix-core/pom.xml | 2 +- spring-cloud-netflix-turbine/pom.xml | 36 ++++------------- .../cloud/netflix/turbine/EnableTurbine.java | 32 +++++++++++++++ .../turbine/EurekaInstanceDiscovery.java | 19 ++++----- .../turbine/SpringAggregatorFactory.java | 4 +- .../netflix/turbine/SpringClusterMonitor.java | 7 ++-- .../turbine/TurbineConfiguration.java} | 36 +++++++++-------- .../main/resources/META-INF/spring.factories | 8 ---- .../src/main/resources/application.yml | 40 ------------------- .../src/main/resources/bootstrap.yml | 6 --- 11 files changed, 77 insertions(+), 115 deletions(-) create mode 100644 spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/EnableTurbine.java rename spring-cloud-netflix-turbine/src/main/java/{io/spring => org/springframework}/cloud/netflix/turbine/EurekaInstanceDiscovery.java (90%) rename spring-cloud-netflix-turbine/src/main/java/{io/spring => org/springframework}/cloud/netflix/turbine/SpringAggregatorFactory.java (95%) rename spring-cloud-netflix-turbine/src/main/java/{io/spring => org/springframework}/cloud/netflix/turbine/SpringClusterMonitor.java (94%) rename spring-cloud-netflix-turbine/src/main/java/{io/spring/cloud/netflix/turbine/Application.java => org/springframework/cloud/netflix/turbine/TurbineConfiguration.java} (60%) delete mode 100644 spring-cloud-netflix-turbine/src/main/resources/META-INF/spring.factories delete mode 100644 spring-cloud-netflix-turbine/src/main/resources/application.yml delete mode 100644 spring-cloud-netflix-turbine/src/main/resources/bootstrap.yml diff --git a/pom.xml b/pom.xml index d6d73164..bcd71c87 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ spring-cloud-netflix 1.0.0.BUILD-SNAPSHOT pom - spring-cloud-netflix + Spring Cloud Netflix Spring Cloud Netflix diff --git a/spring-cloud-netflix-core/pom.xml b/spring-cloud-netflix-core/pom.xml index b7b012a5..e04889a5 100644 --- a/spring-cloud-netflix-core/pom.xml +++ b/spring-cloud-netflix-core/pom.xml @@ -5,7 +5,7 @@ spring-cloud-netflix-core jar - spring-cloud-netflix-core + Spring Cloud Netflix Core Spring Cloud Netflix Core diff --git a/spring-cloud-netflix-turbine/pom.xml b/spring-cloud-netflix-turbine/pom.xml index bb6c84fe..e0ac325a 100644 --- a/spring-cloud-netflix-turbine/pom.xml +++ b/spring-cloud-netflix-turbine/pom.xml @@ -2,7 +2,7 @@ 4.0.0 spring-cloud-netflix-turbine - war + jar Spring Cloud Netflix Turbine http://projects.spring.io/spring-cloud/ @@ -14,30 +14,18 @@ - - org.springframework.boot - spring-boot-maven-plugin - - - - maven-deploy-plugin - - true - - - 1.0.0.BUILD-SNAPSHOT org.springframework.cloud - spring-cloud-config - ${spring-cloud-config.version} + spring-cloud-starters + 1.0.0.BUILD-SNAPSHOT pom import @@ -45,24 +33,16 @@ - org.springframework.boot - spring-boot-starter-web + org.springframework.cloud + spring-cloud-starter org.springframework.cloud - spring-cloud-netflix-core + spring-cloud-starter-eureka - org.apache.httpcomponents - httpclient - - - org.springframework.cloud - spring-cloud-config-client - - - com.netflix.eureka - eureka-client + org.apache.httpcomponents + httpclient com.netflix.turbine diff --git a/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/EnableTurbine.java b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/EnableTurbine.java new file mode 100644 index 00000000..576cc25d --- /dev/null +++ b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/EnableTurbine.java @@ -0,0 +1,32 @@ +/* + * Copyright 2013-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.cloud.netflix.turbine; + +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +/** + * @author Spencer Gibb + * + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Import(TurbineConfiguration.class) +public @interface EnableTurbine { + +} diff --git a/spring-cloud-netflix-turbine/src/main/java/io/spring/cloud/netflix/turbine/EurekaInstanceDiscovery.java b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/EurekaInstanceDiscovery.java similarity index 90% rename from spring-cloud-netflix-turbine/src/main/java/io/spring/cloud/netflix/turbine/EurekaInstanceDiscovery.java rename to spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/EurekaInstanceDiscovery.java index e86f21e5..cd610b1d 100644 --- a/spring-cloud-netflix-turbine/src/main/java/io/spring/cloud/netflix/turbine/EurekaInstanceDiscovery.java +++ b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/EurekaInstanceDiscovery.java @@ -1,4 +1,4 @@ -package io.spring.cloud.netflix.turbine; +package org.springframework.cloud.netflix.turbine; import com.netflix.appinfo.AmazonInfo; import com.netflix.appinfo.DataCenterInfo; @@ -16,9 +16,9 @@ import org.slf4j.LoggerFactory; import java.util.*; /** - * Class that encapsulates an {@link InstanceDiscovery} implementation that uses Eureka (see https://github.com/Netflix/eureka) - * The plugin requires a list of applications configured. It then queries the set of instances for each application. - * Instance information retrieved from Eureka must be translated to something that Turbine can understand i.e the {@link Instance} class. + * Class that encapsulates an {@link com.netflix.turbine.discovery.InstanceDiscovery} implementation that uses Eureka (see https://github.com/Netflix/eureka) + * The plugin requires a list of applications configured. It then queries the set of instances for each application. + * Instance information retrieved from Eureka must be translated to something that Turbine can understand i.e the {@link com.netflix.turbine.discovery.Instance} class. * * All the logic to perform this translation can be overriden here, so that you can provide your own implementation if needed. */ @@ -31,7 +31,7 @@ public class EurekaInstanceDiscovery implements InstanceDiscovery { public EurekaInstanceDiscovery() { // Eureka client should already be configured by spring-platform-netflix-core - // initialize eureka client. make sure eureka properties are properly configured in config.properties + // initialize eureka client. //DiscoveryManager.getInstance().initComponent(new MyDataCenterInstanceConfig(), new DefaultEurekaClientConfig()); } @@ -42,7 +42,7 @@ public class EurekaInstanceDiscovery implements InstanceDiscovery { @Override public Collection getInstanceList() throws Exception { - List instances = new ArrayList<>(); + List instances = new ArrayList(); List appNames = parseApps(); if (appNames == null || appNames.size() == 0) { @@ -75,7 +75,7 @@ public class EurekaInstanceDiscovery implements InstanceDiscovery { */ private List getInstancesForApp(String appName) throws Exception { - List instances = new ArrayList<>(); + List instances = new ArrayList(); logger.info("Fetching instances for app: {}", appName); Application app = DiscoveryManager.getInstance().getDiscoveryClient().getApplication(appName); @@ -162,9 +162,10 @@ public class EurekaInstanceDiscovery implements InstanceDiscovery { * @return */ protected String getClusterName(InstanceInfo iInfo) { - //TODO: make ASG configurable return iInfo.getASGName(); + //TODO: make ASG configurable using app name for demo. //return iInfo.getASGName(); //AppGroupName is UPPERCASE from eureka - return iInfo.getAppGroupName(); + //return iInfo.getAppGroupName(); + return iInfo.getAppName(); } /** diff --git a/spring-cloud-netflix-turbine/src/main/java/io/spring/cloud/netflix/turbine/SpringAggregatorFactory.java b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/SpringAggregatorFactory.java similarity index 95% rename from spring-cloud-netflix-turbine/src/main/java/io/spring/cloud/netflix/turbine/SpringAggregatorFactory.java rename to spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/SpringAggregatorFactory.java index 9e774596..8b1cf8ed 100644 --- a/spring-cloud-netflix-turbine/src/main/java/io/spring/cloud/netflix/turbine/SpringAggregatorFactory.java +++ b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/SpringAggregatorFactory.java @@ -1,4 +1,4 @@ -package io.spring.cloud.netflix.turbine; +package org.springframework.cloud.netflix.turbine; import com.netflix.config.DynamicPropertyFactory; import com.netflix.config.DynamicStringProperty; @@ -28,7 +28,7 @@ public class SpringAggregatorFactory implements ClusterMonitorFactory + * @return {@link com.netflix.turbine.monitor.cluster.ClusterMonitor}<{@link com.netflix.turbine.data.AggDataFromCluster}> */ @Override public ClusterMonitor getClusterMonitor(String name) { diff --git a/spring-cloud-netflix-turbine/src/main/java/io/spring/cloud/netflix/turbine/SpringClusterMonitor.java b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/SpringClusterMonitor.java similarity index 94% rename from spring-cloud-netflix-turbine/src/main/java/io/spring/cloud/netflix/turbine/SpringClusterMonitor.java rename to spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/SpringClusterMonitor.java index 13918bdf..1dfd665c 100644 --- a/spring-cloud-netflix-turbine/src/main/java/io/spring/cloud/netflix/turbine/SpringClusterMonitor.java +++ b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/SpringClusterMonitor.java @@ -1,4 +1,4 @@ -package io.spring.cloud.netflix.turbine; +package org.springframework.cloud.netflix.turbine; import com.netflix.config.DynamicBooleanProperty; import com.netflix.config.DynamicPropertyFactory; @@ -13,6 +13,7 @@ import com.netflix.turbine.monitor.instance.InstanceUrlClosure; /** * Created by sgibb on 7/14/14. + * TODO: convert to ConfigurationProperties (how to do per-cluster configuration?) */ public class SpringClusterMonitor extends AggregateClusterMonitor { @@ -32,8 +33,8 @@ public class SpringClusterMonitor extends AggregateClusterMonitor { */ public static InstanceUrlClosure ClusterConfigBasedUrlClosure = new InstanceUrlClosure() { - private final DynamicStringProperty defaultUrlClosureConfig = DynamicPropertyFactory.getInstance().getStringProperty("turbine.instanceUrlSuffix", null); - private final DynamicBooleanProperty instanceInsertPort = DynamicPropertyFactory.getInstance().getBooleanProperty("turbine.instanceInsertPort", false); + private final DynamicStringProperty defaultUrlClosureConfig = DynamicPropertyFactory.getInstance().getStringProperty("turbine.instanceUrlSuffix", "hystrix.stream"); + private final DynamicBooleanProperty instanceInsertPort = DynamicPropertyFactory.getInstance().getBooleanProperty("turbine.instanceInsertPort", true); @Override public String getUrlPath(Instance host) { diff --git a/spring-cloud-netflix-turbine/src/main/java/io/spring/cloud/netflix/turbine/Application.java b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/TurbineConfiguration.java similarity index 60% rename from spring-cloud-netflix-turbine/src/main/java/io/spring/cloud/netflix/turbine/Application.java rename to spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/TurbineConfiguration.java index 5ce44a42..c94e8eee 100644 --- a/spring-cloud-netflix-turbine/src/main/java/io/spring/cloud/netflix/turbine/Application.java +++ b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/TurbineConfiguration.java @@ -1,37 +1,31 @@ -package io.spring.cloud.netflix.turbine; +package org.springframework.cloud.netflix.turbine; +import com.netflix.turbine.discovery.InstanceDiscovery; import com.netflix.turbine.init.TurbineInit; import com.netflix.turbine.plugins.PluginsFactory; import com.netflix.turbine.streaming.servlet.TurbineStreamServlet; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.embedded.ServletRegistrationBean; -import org.springframework.boot.context.web.SpringBootServletInitializer; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.SmartLifecycle; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; /** * Created by sgibb on 7/11/14. */ @Configuration -@ComponentScan -@EnableAutoConfiguration -public class Application extends SpringBootServletInitializer implements SmartLifecycle { +@EnableEurekaClient +public class TurbineConfiguration implements SmartLifecycle, Ordered { - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - return application.sources(Application.class).web(true); - } - - public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).web(true).run(args); + @Bean + public ServletRegistrationBean turbineStreamServlet() { + return new ServletRegistrationBean(new TurbineStreamServlet(), "/turbine.stream"); } @Bean - public ServletRegistrationBean mockStreamServlet() { - return new ServletRegistrationBean(new TurbineStreamServlet(), "/turbine.stream"); + public InstanceDiscovery instanceDiscovery() { + return new EurekaInstanceDiscovery(); } private boolean running; @@ -48,7 +42,10 @@ public class Application extends SpringBootServletInitializer implements SmartLi @Override public void start() { + //TODO: figure out ordering, so this is already run by EurekaClientConfiguration + //DiscoveryManager.getInstance().initComponent(instanceConfig, clientConfig); PluginsFactory.setClusterMonitorFactory(new SpringAggregatorFactory()); + PluginsFactory.setInstanceDiscovery(instanceDiscovery()); TurbineInit.init(); } @@ -66,4 +63,9 @@ public class Application extends SpringBootServletInitializer implements SmartLi public int getPhase() { return 0; } + + @Override + public int getOrder() { + return -1; + } } diff --git a/spring-cloud-netflix-turbine/src/main/resources/META-INF/spring.factories b/spring-cloud-netflix-turbine/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 28c1089f..00000000 --- a/spring-cloud-netflix-turbine/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,8 +0,0 @@ -#org.springframework.context.ApplicationListener=\ -#org.springframework.cloud.netflix.eureka.EurekaStartingListener,\ -#org.springframework.cloud.netflix.eureka.EurekaUpListener,\ -#org.springframework.cloud.netflix.eureka.EurekaOutOfServiceListener - -#org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -#org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration,\ -#org.springframework.cloud.netflix.feign.FeignAutoConfiguration diff --git a/spring-cloud-netflix-turbine/src/main/resources/application.yml b/spring-cloud-netflix-turbine/src/main/resources/application.yml deleted file mode 100644 index a32aa64a..00000000 --- a/spring-cloud-netflix-turbine/src/main/resources/application.yml +++ /dev/null @@ -1,40 +0,0 @@ -info: - component: Turbine - -endpoints: - restart: - enabled: true - shutdown: - enabled: true - -server: - port: 8989 - context-path: /turbine - -logging: - level: INFO - -eureka: - client: - #Region where eureka is deployed -For AWS specify one of the AWS regions, for other datacenters specify a arbitrary string - #indicating the region.This is normally specified as a -D option (eg) -Deureka.region=us-east-1 - region: default - - - #For eureka clients running in eureka server, it needs to connect to servers in other zones - preferSameZone: false - - #Change this if you want to use a DNS based lookup for determining other eureka servers. For example - #of specifying the DNS entries, check the eureka-client-test.properties, eureka-client-prod.properties - #shouldUseDns: false - - us-east-1: - availabilityZones: default - - serviceUrl: - default: http://localhost:8080/eureka/v2/ - defaultZone: http://localhost:8080/eureka/v2/ - - instance: - #Virtual host name by which the clients identifies this service - virtualHostName: ${spring.application.name} diff --git a/spring-cloud-netflix-turbine/src/main/resources/bootstrap.yml b/spring-cloud-netflix-turbine/src/main/resources/bootstrap.yml deleted file mode 100644 index 8cc15734..00000000 --- a/spring-cloud-netflix-turbine/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,6 +0,0 @@ -spring: - application: - name: turbine - platform: - config: - uri: http://localhost:${config.port:8888} \ No newline at end of file