diff --git a/pom.xml b/pom.xml index 988e65cb..4be8cd75 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,11 @@ + + org.springframework.platform + spring-platform-netflix-core + 1.0.0.BUILD-SNAPSHOT + com.netflix.archaius archaius-core @@ -36,6 +41,11 @@ eureka-client ${eureka.version} + + com.netflix.eureka + eureka-core + ${eureka.version} + com.netflix.feign feign-core diff --git a/spring-platform-netflix-core/pom.xml b/spring-platform-netflix-core/pom.xml index 8d5e37e9..b8f27db1 100644 --- a/spring-platform-netflix-core/pom.xml +++ b/spring-platform-netflix-core/pom.xml @@ -3,9 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.springframework.platform spring-platform-netflix-core - 1.0.0.BUILD-SNAPSHOT jar spring-platform-netflix-core Spring Platform Netflix Core @@ -29,19 +27,28 @@ com.netflix.archaius archaius-core - - - com.netflix.eureka - eureka-client + true com.netflix.eureka eureka-client true + + com.netflix.eureka + eureka-core + true + + + net.java.dev.rome + rome + 1.0.0 + true + com.netflix.feign feign-core + true com.netflix.feign @@ -54,22 +61,27 @@ com.netflix.hystrix hystrix-core + true com.netflix.hystrix hystrix-metrics-event-stream + true com.netflix.hystrix hystrix-javanica + true com.netflix.ribbon ribbon-core + true com.netflix.ribbon ribbon-eureka + true org.projectlombok diff --git a/spring-platform-netflix-core/src/main/java/org/springframework/platform/netflix/eureka/EurekaServerAutoConfiguration.java b/spring-platform-netflix-core/src/main/java/org/springframework/platform/netflix/eureka/EurekaServerAutoConfiguration.java new file mode 100644 index 00000000..53604821 --- /dev/null +++ b/spring-platform-netflix-core/src/main/java/org/springframework/platform/netflix/eureka/EurekaServerAutoConfiguration.java @@ -0,0 +1,104 @@ +/* + * 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.platform.netflix.eureka; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.ApplicationContext; +import org.springframework.context.SmartLifecycle; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.context.ServletContextAware; + +import com.netflix.blitz4j.LoggingConfiguration; +import com.netflix.eureka.EurekaBootStrap; +import com.netflix.eureka.EurekaServerConfig; +import com.netflix.eureka.EurekaServerConfigurationManager; + +/** + * @author Dave Syer + * + */ +@Configuration +@EnableConfigurationProperties(EurekaServerConfigBean.class) +@ConditionalOnClass(EurekaServerConfig.class) +@ConditionalOnExpression("${eureka.server.enabled:true}") +public class EurekaServerAutoConfiguration implements ServletContextAware, + SmartLifecycle { + + @Autowired + private EurekaServerConfig eurekaServerConfig; + + private ServletContext servletContext; + + @Autowired + private ApplicationContext applicationContext; + + private boolean running; + + @Override + public void setServletContext(ServletContext servletContext) { + this.servletContext = servletContext; + } + + @Override + public void start() { + new Thread(new Runnable() { + @Override + public void run() { + new EurekaBootStrap() { + @Override + protected void initEurekaEnvironment() { + LoggingConfiguration.getInstance().configure(); + EurekaServerConfigurationManager.getInstance() + .setConfiguration(eurekaServerConfig); + } + }.contextInitialized(new ServletContextEvent(servletContext)); + running = true; + } + }).start(); + } + + @Override + public void stop() { + running = false; + } + + @Override + public boolean isRunning() { + return running; + } + + @Override + public int getPhase() { + return 0; + } + + @Override + public boolean isAutoStartup() { + return true; + } + + @Override + public void stop(Runnable callback) { + callback.run(); + } + +} diff --git a/spring-platform-netflix-core/src/main/java/org/springframework/platform/netflix/eureka/EurekaServerConfigBean.java b/spring-platform-netflix-core/src/main/java/org/springframework/platform/netflix/eureka/EurekaServerConfigBean.java new file mode 100644 index 00000000..95e7708e --- /dev/null +++ b/spring-platform-netflix-core/src/main/java/org/springframework/platform/netflix/eureka/EurekaServerConfigBean.java @@ -0,0 +1,182 @@ +/* + * 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.platform.netflix.eureka; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +import lombok.Data; + +import com.netflix.eureka.EurekaServerConfig; + +/** + * @author Dave Syer + * + */ +@Data +@ConfigurationProperties("eureka.server") +public class EurekaServerConfigBean implements EurekaServerConfig { + + private static final int MINUTES = 60 * 1000; + + private String aWSAccessId; + + private String aWSSecretKey; + + private int eIPBindRebindRetries = 3; + + private int eIPBindingRetryIntervalMs = 5 * MINUTES; + + private boolean enableSelfPreservation = true; + @Override + public boolean shouldEnableSelfPreservation() { + return enableSelfPreservation; + } + + private double renewalPercentThreshold = 0.85; + + private int renewalThresholdUpdateIntervalMs = 10 * MINUTES; + + private int peerEurekaNodesUpdateIntervalMs = 15 * MINUTES; + + private int numberOfReplicationRetries = 5; + + private int peerEurekaStatusRefreshTimeIntervalMs = 30 * 1000; + + private int waitTimeInMsWhenSyncEmpty = 5 * MINUTES; + + private int peerNodeConnectTimeoutMs = 200; + + private int peerNodeReadTimeoutMs = 200; + + private int peerNodeTotalConnections = 1000; + + private int peerNodeTotalConnectionsPerHost = 500; + + private int peerNodeConnectionIdleTimeoutSeconds = 30; + + private long retentionTimeInMSInDeltaQueue = 3 * MINUTES; + + private long deltaRetentionTimerIntervalInMs = 30 * 1000; + + private long evictionIntervalTimerInMs = 60 * 1000; + + private int aSGQueryTimeoutMs = 300; + + private long aSGUpdateIntervalMs = 5 * MINUTES; + + private long responseCacheAutoExpirationInSeconds = 180; + + private long responseCacheUpdateIntervalMs = 30 * 1000; + + private boolean disableDelta; + @Override + public boolean shouldDisableDelta() { + return disableDelta; + } + + private long maxIdleThreadInMinutesAgeForStatusReplication = 10; + + private int minThreadsForStatusReplication = 1; + + private int maxThreadsForStatusReplication = 1; + + private int maxElementsInStatusReplicationPool = 10000; + + private boolean syncWhenTimestampDiffers = true; + @Override + public boolean shouldSyncWhenTimestampDiffers() { + return syncWhenTimestampDiffers; + } + + private int registrySyncRetries = 5; + + private int maxElementsInPeerReplicationPool = 10000; + + private long maxIdleThreadAgeInMinutesForPeerReplication = 15; + + private int minThreadsForPeerReplication = 5; + + private int maxThreadsForPeerReplication = 20; + + private int maxTimeForReplication = 30000; + + private boolean primeAwsReplicaConnections = true; + @Override + public boolean shouldPrimeAwsReplicaConnections() { + return primeAwsReplicaConnections; + } + + private boolean disableDeltaForRemoteRegions; + @Override + public boolean shouldDisableDeltaForRemoteRegions() { + return disableDeltaForRemoteRegions; + } + + private int remoteRegionConnectTimeoutMs = 1000; + + private int remoteRegionReadTimeoutMs = 1000; + + private int remoteRegionTotalConnections = 1000; + + private int remoteRegionTotalConnectionsPerHost = 500; + + private int remoteRegionConnectionIdleTimeoutSeconds = 30; + + private boolean gZipContentFromRemoteRegion = true; + @Override + public boolean shouldGZipContentFromRemoteRegion() { + return gZipContentFromRemoteRegion; + } + + private Map remoteRegionUrlsWithName = new HashMap(); + + private String[] remoteRegionUrls; + + private Map> remoteRegionAppWhitelist; + @Override + public Set getRemoteRegionAppWhitelist(String regionName) { + if (null == regionName) { + regionName = "global"; + } else { + regionName = regionName.trim().toLowerCase(); + } + return remoteRegionAppWhitelist.get(regionName); + } + + private int remoteRegionRegistryFetchInterval = 30; + + private String remoteRegionTrustStore = ""; + + private String remoteRegionTrustStorePassword = "changeit"; + + private boolean disableTransparentFallbackToOtherRegion; + @Override + public boolean disableTransparentFallbackToOtherRegion() { + return disableTransparentFallbackToOtherRegion; + } + + private boolean batchReplication; + + @Override + public boolean shouldBatchReplication() { + return batchReplication; + } + +} diff --git a/spring-platform-netflix-core/src/main/resources/META-INF/spring.factories b/spring-platform-netflix-core/src/main/resources/META-INF/spring.factories index ef517201..8014696b 100644 --- a/spring-platform-netflix-core/src/main/resources/META-INF/spring.factories +++ b/spring-platform-netflix-core/src/main/resources/META-INF/spring.factories @@ -1,4 +1,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.platform.netflix.archaius.ArchaiusAutoConfiguration,\ org.springframework.platform.netflix.eureka.EurekaClientAutoConfiguration,\ +org.springframework.platform.netflix.eureka.EurekaServerAutoConfiguration,\ org.springframework.platform.netflix.feign.FeignAutoConfiguration \ No newline at end of file