Skip to content

Commit

Permalink
more fixes for karyon3 server
Browse files Browse the repository at this point in the history
  • Loading branch information
qiangdavidliu committed Sep 21, 2015
1 parent fe98f31 commit cc9afc2
Show file tree
Hide file tree
Showing 17 changed files with 194 additions and 108 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package com.netflix.eureka;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.Date;
Expand Down Expand Up @@ -88,11 +89,14 @@ public class EurekaBootStrap implements ServletContextListener {
* @see
* javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
*/
@Override
public void contextInitialized(ServletContextEvent event) {
try {
initEurekaEnvironment();
initEurekaServerContext();

ServletContext sc = event.getServletContext();
sc.setAttribute(EurekaServerContext.class.getName(), serverContext);
} catch (Throwable e) {
logger.error("Cannot bootstrap eureka server :", e);
throw new RuntimeException("Cannot bootstrap eureka server :", e);
Expand Down Expand Up @@ -196,9 +200,13 @@ protected void initEurekaServerContext() throws Exception {
*
* @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
*/
@Override
public void contextDestroyed(ServletContextEvent event) {
try {
logger.info("{} Shutting down Eureka Server..", new Date().toString());
ServletContext sc = event.getServletContext();
sc.removeAttribute(EurekaServerContext.class.getName());

destroyEurekaServerContext();
destroyEurekaEnvironment();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,19 +107,24 @@ enum Target {FullFetch, DeltaFetch, Application, Other}
*/
private static final RateLimiter registryFullFetchRateLimiter = new RateLimiter(TimeUnit.SECONDS);

private final EurekaServerConfig serverConfig;
private EurekaServerConfig serverConfig;

@Inject
public RateLimitingFilter(EurekaServerContext server) {
this.serverConfig = server.getServerConfig();
}

// for non-DI use
public RateLimitingFilter() {
this(EurekaServerContextHolder.getInstance().getServerContext());
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
if (serverConfig == null) {
EurekaServerContext serverContext = (EurekaServerContext) filterConfig.getServletContext()
.getAttribute(EurekaServerContext.class.getName());
serverConfig = serverContext.getServerConfig();
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,24 @@ public class ServerRequestAuthFilter implements Filter {

private static final String NAME_PREFIX = "DiscoveryServerRequestAuth_Name_";

private final EurekaServerConfig serverConfig;
private EurekaServerConfig serverConfig;

@Inject
public ServerRequestAuthFilter(EurekaServerContext server) {
this.serverConfig = server.getServerConfig();
}

// for non-DI use
public ServerRequestAuthFilter() {
this(EurekaServerContextHolder.getInstance().getServerContext());
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// nothing to do here
if (serverConfig == null) {
EurekaServerContext serverContext = (EurekaServerContext) filterConfig.getServletContext()
.getAttribute(EurekaServerContext.class.getName());
serverConfig = serverContext.getServerConfig();
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -685,8 +685,8 @@ public Applications getApplicationsFromMultipleRegions(String[] remoteRegions) {

boolean includeRemoteRegion = null != remoteRegions && remoteRegions.length != 0;

logger.info("Fetching applications registry with remote regions: {}, Regions argument {}", includeRemoteRegion,
Arrays.toString(remoteRegions));
logger.debug("Fetching applications registry with remote regions: {}, Regions argument {}",
includeRemoteRegion, Arrays.toString(remoteRegions));

if (includeRemoteRegion) {
GET_ALL_WITH_REMOTE_REGIONS_CACHE_MISS.increment();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,8 @@ private void primeAwsReplicas(ApplicationInfoManager applicationInfoManager) {
Application eurekaApps = this.getApplication(applicationInfoManager.getInfo().getAppName(), false);
if (eurekaApps == null) {
areAllPeerNodesPrimed = true;
logger.info("No peers needed to prime.");
return;
}
for (PeerEurekaNode node : peerEurekaNodes.getPeerEurekaNodes()) {
for (InstanceInfo peerInstanceInfo : eurekaApps.getInstances()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@
package com.netflix.eureka.registry;

import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;
Expand Down Expand Up @@ -75,7 +73,6 @@
*
* @author Karthik Ranganathan, Greg Kim
*/
@Singleton
public class ResponseCacheImpl implements ResponseCache {

private static final Logger logger = LoggerFactory.getLogger(ResponseCacheImpl.class);
Expand Down Expand Up @@ -123,8 +120,7 @@ public List<Key> get() {
private final EurekaServerConfig serverConfig;
private final ServerCodecs serverCodecs;

@Inject
public ResponseCacheImpl(EurekaServerConfig serverConfig, ServerCodecs serverCodecs, AbstractInstanceRegistry registry) {
ResponseCacheImpl(EurekaServerConfig serverConfig, ServerCodecs serverCodecs, AbstractInstanceRegistry registry) {
this.serverConfig = serverConfig;
this.serverCodecs = serverCodecs;
this.shouldUseReadOnlyResponseCache = serverConfig.shouldUseReadOnlyResponseCache();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,13 @@
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.shared.Application;
import com.netflix.eureka.EurekaServerContext;
import com.netflix.eureka.EurekaServerContextHolder;
import com.netflix.eureka.cluster.PeerEurekaNodes;
import com.netflix.eureka.registry.PeerAwareInstanceRegistry;
import com.netflix.eureka.cluster.PeerEurekaNode;
import com.netflix.eureka.util.StatusInfo;
import com.netflix.eureka.util.StatusInfo.Builder;
import com.netflix.eureka.util.StatusUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -47,15 +41,11 @@ public class StatusResource {
private static final Logger logger = LoggerFactory.getLogger(StatusResource.class);
private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss Z";

private final String myAppName;
private final PeerAwareInstanceRegistry registry;
private final PeerEurekaNodes peerEurekaNodes;
private final StatusUtil statusUtil;

@Inject
StatusResource(EurekaServerContext server) {
this.myAppName = server.getApplicationInfoManager().getInfo().getAppName();
this.registry = server.getRegistry();
this.peerEurekaNodes = server.getPeerEurekaNodes();
this.statusUtil = new StatusUtil(server);
}

public StatusResource() {
Expand All @@ -64,47 +54,7 @@ public StatusResource() {

@GET
public StatusInfo getStatusInfo() {
Builder builder = Builder.newBuilder();
// Add application level status
StringBuilder upReplicas = new StringBuilder();
StringBuilder downReplicas = new StringBuilder();

StringBuilder replicaHostNames = new StringBuilder();

for (PeerEurekaNode node : peerEurekaNodes.getPeerEurekaNodes()) {
if (replicaHostNames.length() > 0) {
replicaHostNames.append(", ");
}
replicaHostNames.append(node.getServiceUrl());
if (isReplicaAvailable(myAppName, node.getServiceUrl())) {
upReplicas.append(node.getServiceUrl()).append(',');
} else {
downReplicas.append(node.getServiceUrl()).append(',');
}
}

builder.add("registered-replicas", replicaHostNames.toString());
builder.add("available-replicas", upReplicas.toString());
builder.add("unavailable-replicas", downReplicas.toString());

return builder.build();
}

private boolean isReplicaAvailable(String myAppName, String url) {

try {
String givenHostName = new URI(url).getHost();
Application app = registry.getApplication(myAppName, false);
for (InstanceInfo info : app.getInstances()) {
if (info.getHostName().equals(givenHostName)) {
return true;
}
}
givenHostName = new URI(url).getHost();
} catch (Throwable e) {
logger.error("Could not determine if the replica is available ", e);
}
return false;
return statusUtil.getStatusInfo();
}

public static String getCurrentTimeAsString() {
Expand Down
73 changes: 73 additions & 0 deletions eureka-core/src/main/java/com/netflix/eureka/util/StatusUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.netflix.eureka.util;

import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.shared.Application;
import com.netflix.eureka.EurekaServerContext;
import com.netflix.eureka.cluster.PeerEurekaNode;
import com.netflix.eureka.cluster.PeerEurekaNodes;
import com.netflix.eureka.registry.PeerAwareInstanceRegistry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.URI;

/**
* @author David Liu
*/
public class StatusUtil {
private static final Logger logger = LoggerFactory.getLogger(StatusUtil.class);

private final String myAppName;
private final PeerAwareInstanceRegistry registry;
private final PeerEurekaNodes peerEurekaNodes;

public StatusUtil(EurekaServerContext server) {
this.myAppName = server.getApplicationInfoManager().getInfo().getAppName();
this.registry = server.getRegistry();
this.peerEurekaNodes = server.getPeerEurekaNodes();
}

public StatusInfo getStatusInfo() {
StatusInfo.Builder builder = StatusInfo.Builder.newBuilder();
// Add application level status
StringBuilder upReplicas = new StringBuilder();
StringBuilder downReplicas = new StringBuilder();

StringBuilder replicaHostNames = new StringBuilder();

for (PeerEurekaNode node : peerEurekaNodes.getPeerEurekaNodes()) {
if (replicaHostNames.length() > 0) {
replicaHostNames.append(", ");
}
replicaHostNames.append(node.getServiceUrl());
if (isReplicaAvailable(myAppName, node.getServiceUrl())) {
upReplicas.append(node.getServiceUrl()).append(',');
} else {
downReplicas.append(node.getServiceUrl()).append(',');
}
}

builder.add("registered-replicas", replicaHostNames.toString());
builder.add("available-replicas", upReplicas.toString());
builder.add("unavailable-replicas", downReplicas.toString());

return builder.build();
}

private boolean isReplicaAvailable(String myAppName, String url) {

try {
String givenHostName = new URI(url).getHost();
Application app = registry.getApplication(myAppName, false);
for (InstanceInfo info : app.getInstances()) {
if (info.getHostName().equals(givenHostName)) {
return true;
}
}
givenHostName = new URI(url).getHost();
} catch (Throwable e) {
logger.error("Could not determine if the replica is available ", e);
}
return false;
}
}
6 changes: 4 additions & 2 deletions eureka-resources/src/main/resources/jsp/header.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
<%@page import="com.netflix.appinfo.AmazonInfo.MetaDataKey"%>
<div id="header">
<%
InstanceInfo selfInstanceInfo = EurekaServerContextHolder.getInstance().getServerContext().getApplicationInfoManager().getInfo();
EurekaServerContext serverContext = (EurekaServerContext) pageContext.getServletContext()
.getAttribute(EurekaServerContext.class.getName());
InstanceInfo selfInstanceInfo = serverContext.getApplicationInfoManager().getInfo();
DataCenterInfo info = selfInstanceInfo.getDataCenterInfo();
PeerAwareInstanceRegistry registry = EurekaServerContextHolder.getInstance().getServerContext().getRegistry();
PeerAwareInstanceRegistry registry =serverContext.getRegistry();
AmazonInfo amazonInfo = null;
if(info.getName() == DataCenterInfo.Name.Amazon) {
amazonInfo = (AmazonInfo)info;
Expand Down
4 changes: 3 additions & 1 deletion eureka-resources/src/main/resources/jsp/lastN.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@
</ul>
<div id="tabs-1">
<%
PeerAwareInstanceRegistry registry = EurekaServerContextHolder.getInstance().getServerContext().getRegistry();
EurekaServerContext serverContext = (EurekaServerContext) pageContext.getServletContext()
.getAttribute(EurekaServerContext.class.getName());
PeerAwareInstanceRegistry registry = serverContext.getRegistry();
List<Pair<Long, String>> list = registry.getLastNCanceledInstances();
out.print("<table id=\'lastNCanceled\' class=\"stripeable\">");
out.print("<tr><th>Timestamp</th><th>Lease</th></tr>");
Expand Down
4 changes: 3 additions & 1 deletion eureka-resources/src/main/resources/jsp/navbar.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
<dt> &nbsp;</dt>
<dd><b>DS Replicas: <b>
<%
List<PeerEurekaNode> list = EurekaServerContextHolder.getInstance().getServerContext().getPeerEurekaNodes().getPeerNodesView();
EurekaServerContext serverContext = (EurekaServerContext) pageContext.getServletContext()
.getAttribute(EurekaServerContext.class.getName());
List<PeerEurekaNode> list = serverContext.getPeerEurekaNodes().getPeerNodesView();
int i=0;
for(PeerEurekaNode node : list){
try{
Expand Down
11 changes: 8 additions & 3 deletions eureka-resources/src/main/resources/jsp/status.jsp
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
<%@ page language="java" import="java.util.*,java.util.Map.Entry,com.netflix.discovery.shared.Pair,com.netflix.discovery.shared.*, com.netflix.eureka.util.*,com.netflix.appinfo.InstanceInfo.*, com.netflix.appinfo.DataCenterInfo.*,com.netflix.appinfo.AmazonInfo.MetaDataKey,com.netflix.eureka.resources.*,com.netflix.eureka.*,com.netflix.appinfo.*" pageEncoding="UTF-8" %>
<%@ page language="java" import="java.util.*,java.util.Map.Entry,com.netflix.discovery.shared.Pair,
com.netflix.discovery.shared.*,com.netflix.eureka.util.*,com.netflix.appinfo.InstanceInfo.*,
com.netflix.appinfo.DataCenterInfo.*,com.netflix.appinfo.AmazonInfo.MetaDataKey,com.netflix.eureka.resources.*,
com.netflix.eureka.*,com.netflix.appinfo.*,com.netflix.eureka.util.StatusUtil" pageEncoding="UTF-8" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
Expand Down Expand Up @@ -44,7 +47,9 @@ String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.
<tfoot><tr><th>Application</th><th>AMIs</th><th>Availability Zones</th><th>Status</th></tr></tfoot>
<tbody>
<%
for(Application app : EurekaServerContextHolder.getInstance().getServerContext().getRegistry().getSortedApplications()) {
EurekaServerContext serverContext = (EurekaServerContext) pageContext.getServletContext()
.getAttribute(EurekaServerContext.class.getName());
for(Application app : serverContext.getRegistry().getSortedApplications()) {
out.print("<tr><td><b>" + app.getName() + "</b></td>");
Map<String, Integer> amiCounts = new HashMap<String, Integer>();
Map<InstanceStatus,List<Pair<String, String>>> instancesByStatus =
Expand Down Expand Up @@ -138,7 +143,7 @@ String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.
<table id='generalInfo' class="stripeable">
<tr><th>Name</th><th>Value</th></tr>
<%
StatusInfo statusInfo = (new StatusResource()).getStatusInfo();
StatusInfo statusInfo = (new StatusUtil(serverContext)).getStatusInfo();
Map<String,String> genMap = statusInfo.getGeneralStats();
for (Map.Entry<String,String> entry : genMap.entrySet()) {
out.print("<tr>");
Expand Down
2 changes: 0 additions & 2 deletions eureka-server-karyon3/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ apply plugin: 'war'
apply plugin: 'jetty'

dependencies {
compile project(':eureka-client')
compile project(':eureka-core')
runtime 'xerces:xercesImpl:2.4.0'
compile "com.netflix.governator:governator:1.10.0"
Expand All @@ -29,7 +28,6 @@ task copyLibs(type: Copy) {
}

war {
archiveName 'eureka.war'
from (project(':eureka-resources').file('build/resources/main'))
}

Expand Down
Loading

0 comments on commit cc9afc2

Please sign in to comment.