Upgrade to Eureka 1.2.0

Implements forwarding of eureka CacheRefreshedEvent as HeartbeatEvent,
rather thank serialization hack.  Uses new Eureka DI functionality
(mostly there, some issues). Updates EurekaJacksonCodec to be
"DataCenterAware". Reference EurekaClient interface rather than
DiscoveryClient class.

fixes gh-349
This commit is contained in:
Spencer Gibb
2015-06-16 23:23:45 -06:00
parent e7a767e042
commit 246830c9d3
28 changed files with 574 additions and 315 deletions

View File

@@ -39,7 +39,7 @@ import com.netflix.appinfo.InstanceInfo;
import com.netflix.config.ConfigurationManager;
import com.netflix.discovery.shared.Application;
import com.netflix.discovery.shared.Pair;
import com.netflix.eureka.PeerAwareInstanceRegistry;
import com.netflix.eureka.PeerAwareInstanceRegistryImpl;
import com.netflix.eureka.cluster.PeerEurekaNode;
import com.netflix.eureka.resources.StatusResource;
import com.netflix.eureka.util.StatusInfo;
@@ -53,6 +53,11 @@ public class EurekaController {
@Value("${eureka.dashboard.path:/}")
private String dashboardPath = "";
private ApplicationInfoManager applicationInfoManager;
public EurekaController(ApplicationInfoManager applicationInfoManager) {
this.applicationInfoManager = applicationInfoManager;
}
@RequestMapping(method = RequestMethod.GET)
public String status(HttpServletRequest request, Map<String, Object> model) {
@@ -73,7 +78,7 @@ public class EurekaController {
@RequestMapping(value = "/lastn", method = RequestMethod.GET)
public String lastn(HttpServletRequest request, Map<String, Object> model) {
populateBase(request, model);
PeerAwareInstanceRegistry registery = PeerAwareInstanceRegistry.getInstance();
PeerAwareInstanceRegistryImpl registery = PeerAwareInstanceRegistryImpl.getInstance();
ArrayList<Map<String, Object>> lastNCanceled = new ArrayList<>();
List<Pair<Long, String>> list = registery.getLastNCanceledInstances();
for (Pair<Long, String> entry : list) {
@@ -114,11 +119,10 @@ public class EurekaController {
.getDeploymentEnvironment());
model.put("datacenter", ConfigurationManager.getDeploymentContext()
.getDeploymentDatacenter());
model.put("registry", PeerAwareInstanceRegistry.getInstance());
model.put("isBelowRenewThresold", PeerAwareInstanceRegistry.getInstance()
model.put("registry", PeerAwareInstanceRegistryImpl.getInstance());
model.put("isBelowRenewThresold", PeerAwareInstanceRegistryImpl.getInstance()
.isBelowRenewThresold() == 1);
DataCenterInfo info = ApplicationInfoManager.getInstance().getInfo()
.getDataCenterInfo();
DataCenterInfo info = applicationInfoManager.getInfo().getDataCenterInfo();
if (info.getName() == DataCenterInfo.Name.Amazon) {
AmazonInfo amazonInfo = (AmazonInfo) info;
model.put("amazonInfo", amazonInfo);
@@ -131,7 +135,7 @@ public class EurekaController {
private void populateNavbar(HttpServletRequest request, Map<String, Object> model) {
Map<String, String> replicas = new LinkedHashMap<>();
List<PeerEurekaNode> list = PeerAwareInstanceRegistry.getInstance()
List<PeerEurekaNode> list = PeerAwareInstanceRegistryImpl.getInstance()
.getReplicaNodes();
for (PeerEurekaNode node : list) {
try {
@@ -147,7 +151,7 @@ public class EurekaController {
}
private void populateApps(Map<String, Object> model) {
List<com.netflix.discovery.shared.Application> sortedApplications = PeerAwareInstanceRegistry
List<com.netflix.discovery.shared.Application> sortedApplications = PeerAwareInstanceRegistryImpl
.getInstance().getSortedApplications();
ArrayList<Map<String, Object>> apps = new ArrayList<>();
for (Application app : sortedApplications) {

View File

@@ -26,6 +26,7 @@ import javax.servlet.Filter;
import javax.ws.rs.Path;
import javax.ws.rs.ext.Provider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -44,6 +45,7 @@ import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.util.ClassUtils;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.netflix.appinfo.ApplicationInfoManager;
import com.sun.jersey.api.core.DefaultResourceConfig;
import com.sun.jersey.spi.container.servlet.ServletContainer;
@@ -58,13 +60,17 @@ public class EurekaServerConfiguration extends WebMvcConfigurerAdapter {
/**
* List of packages containing Jersey resources required by the Eureka server
*/
private static String[] EUREKA_PACKAGES = new String[] { "com.netflix.discovery",
"com.netflix.eureka" };
private static String[] EUREKA_PACKAGES = new String[] {
"com.netflix.discovery",
"com.netflix.eureka"};
@Autowired
private ApplicationInfoManager applicationInfoManager;
@Bean
@ConditionalOnProperty(prefix = "eureka.dashboard", name = "enabled", matchIfMissing = true)
public EurekaController eurekaController() {
return new EurekaController();
return new EurekaController(applicationInfoManager);
}
/**

View File

@@ -33,12 +33,11 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.logging.LoggingSystem;
import org.springframework.boot.logging.log4j.Log4JLoggingSystem;
import org.springframework.cloud.netflix.eureka.DataCenterAwareJacksonCodec;
import org.springframework.cloud.netflix.eureka.DataCenterAwareMarshallingStrategy;
import org.springframework.cloud.netflix.eureka.DiscoveryManagerInitializer;
import org.springframework.cloud.netflix.eureka.EurekaServerConfigBean;
import org.springframework.cloud.netflix.eureka.server.advice.LeaseManagerLite;
import org.springframework.cloud.netflix.eureka.server.advice.PiggybackMethodInterceptor;
@@ -59,13 +58,13 @@ import org.springframework.web.context.ServletContextAware;
import com.netflix.blitz4j.DefaultBlitz4jConfig;
import com.netflix.blitz4j.LoggingConfiguration;
import com.netflix.discovery.converters.JsonXStream;
import com.netflix.discovery.converters.XmlXStream;
import com.netflix.eureka.AbstractInstanceRegistry;
import com.netflix.eureka.EurekaBootStrap;
import com.netflix.eureka.EurekaServerConfig;
import com.netflix.eureka.EurekaServerConfigurationManager;
import com.netflix.eureka.InstanceRegistry;
import com.netflix.eureka.PeerAwareInstanceRegistry;
import com.netflix.eureka.PeerAwareInstanceRegistryImpl;
/**
* @author Dave Syer
@@ -125,15 +124,8 @@ public class EurekaServerInitializerConfiguration implements ServletContextAware
}
}
@Bean
@ConditionalOnMissingBean(DiscoveryManagerInitializer.class)
public DiscoveryManagerInitializer discoveryManagerIntitializer() {
return new DiscoveryManagerInitializer();
}
@Override
public void start() {
discoveryManagerIntitializer().init();
new Thread(new Runnable() {
@Override
public void run() {
@@ -160,14 +152,8 @@ public class EurekaServerInitializerConfiguration implements ServletContextAware
XmlXStream
.getInstance()
.setMarshallingStrategy(
new DataCenterAwareMarshallingStrategy(
EurekaServerInitializerConfiguration.this.applicationContext));
JsonXStream
.getInstance()
.setMarshallingStrategy(
new DataCenterAwareMarshallingStrategy(
EurekaServerInitializerConfiguration.this.applicationContext));
// PeerAwareInstanceRegistry.getInstance();
new DataCenterAwareMarshallingStrategy());
DataCenterAwareJacksonCodec.init();
EurekaServerInitializerConfiguration.this.applicationContext
.publishEvent(new EurekaRegistryAvailableEvent(
EurekaServerInitializerConfiguration.this.eurekaServerConfig));
@@ -226,7 +212,7 @@ public class EurekaServerInitializerConfiguration implements ServletContextAware
@Autowired
private ApplicationContext applicationContext;
private PeerAwareInstanceRegistry instance;
private PeerAwareInstanceRegistryImpl instance;
@Bean
public LeaseManagerMessageBroker leaseManagerMessageBroker() {
@@ -236,7 +222,7 @@ public class EurekaServerInitializerConfiguration implements ServletContextAware
@Override
public void onApplicationEvent(EurekaRegistryAvailableEvent event) {
if (this.instance == null) {
this.instance = PeerAwareInstanceRegistry.getInstance();
this.instance = PeerAwareInstanceRegistryImpl.getInstance();
safeInit();
replaceInstance(getProxyForInstance());
expectRegistrations(1);
@@ -245,13 +231,13 @@ public class EurekaServerInitializerConfiguration implements ServletContextAware
private void safeInit() {
Method method = ReflectionUtils
.findMethod(InstanceRegistry.class, "postInit");
.findMethod(AbstractInstanceRegistry.class, "postInit");
ReflectionUtils.makeAccessible(method);
ReflectionUtils.invokeMethod(method, this.instance);
}
private void replaceInstance(Object proxy) {
Field field = ReflectionUtils.findField(PeerAwareInstanceRegistry.class,
Field field = ReflectionUtils.findField(PeerAwareInstanceRegistryImpl.class,
"instance");
try {
// Awful ugly hack to work around lack of DI in eureka
@@ -285,7 +271,7 @@ public class EurekaServerInitializerConfiguration implements ServletContextAware
* registrations (when it's zero, even a successful registration won't reset
* the rate threshold in InstanceRegistry.register()).
*/
Field field = ReflectionUtils.findField(PeerAwareInstanceRegistry.class,
Field field = ReflectionUtils.findField(AbstractInstanceRegistry.class,
"expectedNumberOfRenewsPerMin");
try {
// Awful ugly hack to work around lack of DI in eureka
@@ -304,7 +290,7 @@ public class EurekaServerInitializerConfiguration implements ServletContextAware
/**
* Additional aspect for intercepting method invocations on
* PeerAwareInstanceRegistry. If
* {@link PeerAwareInstanceRegistry#openForTraffic(int)} is called with a zero
* {@link PeerAwareInstanceRegistryImpl#openForTraffic(int)} is called with a zero
* argument, it means that leases are not automatically cancelled if the instance
* hasn't sent any renewals recently. This happens for a standalone server. It
* seems like a bad default, so we set it to the smallest non-zero value we can,

View File

@@ -26,7 +26,7 @@ import org.springframework.context.ApplicationContext;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.shared.Application;
import com.netflix.eureka.PeerAwareInstanceRegistry;
import com.netflix.eureka.PeerAwareInstanceRegistryImpl;
import com.netflix.eureka.lease.Lease;
/**
@@ -66,7 +66,7 @@ public class LeaseManagerMessageBroker implements LeaseManagerLite<InstanceInfo>
boolean isReplication) {
log.debug("renew " + appName + " serverId " + serverId + ", isReplication {}"
+ isReplication);
List<Application> applications = PeerAwareInstanceRegistry.getInstance()
List<Application> applications = PeerAwareInstanceRegistryImpl.getInstance()
.getSortedApplications();
for (Application input : applications) {
if (input.getName().equals(appName)) {