From 5bded8aa8589f692eaf4139acdec6bd95765391a Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Tue, 14 Oct 2014 17:03:46 +0100 Subject: [PATCH] Make Eureka into a CF service broker --- .../eureka/EurekaClientConfiguration.java | 3 +- .../eureka/advice/LeaseManagerLite.java | 29 +++++++++++++++++++ .../advice/PiggybackMethodInterceptor.java | 5 +--- .../event/LeaseManagerMessageBroker.java | 10 +++++-- .../servo/ServoMetricsAutoConfiguration.java | 6 ++-- .../server/EurekaServerConfiguration.java | 1 + .../EurekaServerInitializerConfiguration.java | 4 +-- 7 files changed, 46 insertions(+), 12 deletions(-) create mode 100644 spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/advice/LeaseManagerLite.java diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java index bf4d3e5d..9a55f2af 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java @@ -21,7 +21,6 @@ import javax.management.MBeanServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -146,7 +145,7 @@ public class EurekaClientConfiguration implements SmartLifecycle, Ordered { @Bean @ConditionalOnMissingBean - @ConditionalOnBean(MBeanServer.class) + @ConditionalOnExpression("${spring.jmx.enabled:true}") public EurekaHealthIndicator eurekaHealthIndicator(MBeanServer server, EurekaInstanceConfig config) { return new EurekaHealthIndicator(eurekaDiscoveryClient(), diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/advice/LeaseManagerLite.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/advice/LeaseManagerLite.java new file mode 100644 index 00000000..fd1a09bd --- /dev/null +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/advice/LeaseManagerLite.java @@ -0,0 +1,29 @@ +/* + * 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.eureka.advice; + +import com.netflix.appinfo.InstanceInfo; +import com.netflix.eureka.lease.LeaseManager; + +/** + * @author Dave Syer + * + */ +public interface LeaseManagerLite extends LeaseManager { + + void register(InstanceInfo info, boolean isReplication); + +} diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/advice/PiggybackMethodInterceptor.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/advice/PiggybackMethodInterceptor.java index 65a4a078..67a33497 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/advice/PiggybackMethodInterceptor.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/advice/PiggybackMethodInterceptor.java @@ -55,10 +55,7 @@ public class PiggybackMethodInterceptor implements MethodInterceptor { private Method getTarget(Class type, Method method) { Method target = ReflectionUtils.findMethod(type, method.getName(), method.getParameterTypes()); - if (target != null) { - return target; - } - return null; + return target; } } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/event/LeaseManagerMessageBroker.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/event/LeaseManagerMessageBroker.java index 8e44da89..c1017de0 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/event/LeaseManagerMessageBroker.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/event/LeaseManagerMessageBroker.java @@ -9,6 +9,7 @@ import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.netflix.eureka.advice.LeaseManagerLite; import org.springframework.context.ApplicationContext; import com.google.common.base.Optional; @@ -16,16 +17,21 @@ import com.google.common.base.Predicate; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.shared.Application; import com.netflix.eureka.PeerAwareInstanceRegistry; -import com.netflix.eureka.lease.LeaseManager; +import com.netflix.eureka.lease.Lease; /** * @author Spencer Gibb */ -public class LeaseManagerMessageBroker implements LeaseManager { +public class LeaseManagerMessageBroker implements LeaseManagerLite { private static final Logger logger = LoggerFactory.getLogger(LeaseManagerMessageBroker.class); @Autowired private ApplicationContext ctxt; + + @Override + public void register(InstanceInfo info, boolean isReplication) { + register(info, Lease.DEFAULT_DURATION_IN_SECS, isReplication); + } @Override public void register(InstanceInfo info, int leaseDuration, boolean isReplication) { diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/servo/ServoMetricsAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/servo/ServoMetricsAutoConfiguration.java index d3f82d52..eae0df05 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/servo/ServoMetricsAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/servo/ServoMetricsAutoConfiguration.java @@ -24,7 +24,9 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -38,12 +40,12 @@ import com.netflix.servo.monitor.Monitors; @ConditionalOnClass({ Monitors.class, MetricReader.class }) @ConditionalOnBean(MetricReader.class) @AutoConfigureBefore(EndpointAutoConfiguration.class) -@AutoConfigureAfter(MetricRepositoryAutoConfiguration.class) +@AutoConfigureAfter({MetricRepositoryAutoConfiguration.class, JmxAutoConfiguration.class}) +@ConditionalOnExpression("${spring.jmx.enabled:true}") public class ServoMetricsAutoConfiguration { @Bean @ConditionalOnMissingBean - @ConditionalOnBean(MBeanServer.class) public ServoPublicMetrics servoPublicMetrics(MetricReader reader, MBeanServer server) { return new ServoPublicMetrics(reader, server); } diff --git a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerConfiguration.java b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerConfiguration.java index d6481165..db838012 100644 --- a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerConfiguration.java +++ b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerConfiguration.java @@ -36,6 +36,7 @@ public class EurekaServerConfiguration extends WebMvcConfigurerAdapter { bean.setOrder(Ordered.LOWEST_PRECEDENCE); bean.addInitParameter("com.sun.jersey.config.property.packages", "com.netflix.discovery;com.netflix.eureka"); + bean.addInitParameter(ServletContainer.FEATURE_FILTER_FORWARD_ON_404, "true"); bean.setUrlPatterns(Lists.newArrayList("/v2/*")); return bean; } diff --git a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerInitializerConfiguration.java b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerInitializerConfiguration.java index 9017a70d..b51459d9 100644 --- a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerInitializerConfiguration.java +++ b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerInitializerConfiguration.java @@ -32,6 +32,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.netflix.eureka.DiscoveryManagerIntitializer; import org.springframework.cloud.netflix.eureka.EurekaServerConfigBean; +import org.springframework.cloud.netflix.eureka.advice.LeaseManagerLite; import org.springframework.cloud.netflix.eureka.advice.PiggybackMethodInterceptor; import org.springframework.cloud.netflix.eureka.event.EurekaRegistryAvailableEvent; import org.springframework.cloud.netflix.eureka.event.EurekaServerStartedEvent; @@ -50,7 +51,6 @@ import com.netflix.eureka.EurekaBootStrap; import com.netflix.eureka.EurekaServerConfig; import com.netflix.eureka.EurekaServerConfigurationManager; import com.netflix.eureka.PeerAwareInstanceRegistry; -import com.netflix.eureka.lease.LeaseManager; /** * @author Dave Syer @@ -193,7 +193,7 @@ public class EurekaServerInitializerConfiguration implements ServletContextAware ProxyFactory factory = new ProxyFactory(instance); // ...with the LeaseManagerMessageBroker factory.addAdvice(new PiggybackMethodInterceptor(leaseManagerMessageBroker(), - LeaseManager.class)); + LeaseManagerLite.class)); factory.addAdvice(new TrafficOpener()); factory.setProxyTargetClass(true);