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:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user