From 03a005033d5abb61dc220528076949e6e4d3416e Mon Sep 17 00:00:00 2001 From: Micheal Swiggs Date: Sun, 22 Nov 2015 08:47:43 +0000 Subject: [PATCH] Enables hystrix monitoring of multiple services on a single server. --- .../turbine/EurekaInstanceDiscovery.java | 11 ++++- .../netflix/turbine/SpringClusterMonitor.java | 4 ++ .../netflix/turbine/TurbineProperties.java | 2 + .../turbine/EurekaInstanceDiscoveryTest.java | 46 +++++++++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) diff --git a/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/EurekaInstanceDiscovery.java b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/EurekaInstanceDiscovery.java index f388ef831c..32d7b53bb3 100644 --- a/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/EurekaInstanceDiscovery.java +++ b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/EurekaInstanceDiscovery.java @@ -49,10 +49,12 @@ public class EurekaInstanceDiscovery extends CommonsInstanceDiscovery { private static final String EUREKA_DEFAULT_CLUSTER_NAME_EXPRESSION = "appName"; private final EurekaClient eurekaClient; + private final boolean combineHostPort; public EurekaInstanceDiscovery(TurbineProperties turbineProperties, EurekaClient eurekaClient) { super(turbineProperties, EUREKA_DEFAULT_CLUSTER_NAME_EXPRESSION); this.eurekaClient = eurekaClient; + this.combineHostPort = turbineProperties.isCombineHostPort(); } /** @@ -98,10 +100,12 @@ protected List getInstancesForApp(String serviceId) throws Exception { */ Instance marshall(InstanceInfo instanceInfo) { String hostname = instanceInfo.getHostName(); + String port = String.valueOf(instanceInfo.getPort()); String cluster = getClusterName(instanceInfo); Boolean status = parseInstanceStatus(instanceInfo.getStatus()); if (hostname != null && cluster != null && status != null) { - Instance instance = new Instance(hostname, cluster, status); + String hostPart = combineHostPort ? hostname+":"+port : hostname; + Instance instance = new Instance(hostPart, cluster, status); // add metadata Map metadata = instanceInfo.getMetadata(); @@ -126,6 +130,11 @@ Instance marshall(InstanceInfo instanceInfo) { if (securePortEnabled) { instance.getAttributes().put("securePort", String.valueOf(instanceInfo.getSecurePort())); } + + if (combineHostPort) { + String fusedHostPort = securePortEnabled ? hostname+":"+String.valueOf(instanceInfo.getSecurePort()) : hostPart ; + instance.getAttributes().put("fusedHostPort", fusedHostPort); + } return instance; } else { diff --git a/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/SpringClusterMonitor.java b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/SpringClusterMonitor.java index 2013495de1..0b680900cd 100644 --- a/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/SpringClusterMonitor.java +++ b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/SpringClusterMonitor.java @@ -87,6 +87,10 @@ public String getUrlPath(Instance host) { scheme = "http"; } + if (host.getAttributes().containsKey("fusedHostPort")) { + return String.format("%s://%s/%s", scheme, host.getAttributes().get("fusedHostPort"), url); + } + // determine if to insert port String insertPortKey = "turbine.instanceInsertPort." + host.getCluster(); DynamicStringProperty insertPortProp = DynamicPropertyFactory.getInstance() diff --git a/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/TurbineProperties.java b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/TurbineProperties.java index d830145cb7..e2c2eb374e 100644 --- a/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/TurbineProperties.java +++ b/spring-cloud-netflix-turbine/src/main/java/org/springframework/cloud/netflix/turbine/TurbineProperties.java @@ -35,6 +35,8 @@ public class TurbineProperties { private String appConfig; + private boolean combineHostPort = false; + public List getAppConfigList() { if (!StringUtils.hasText(appConfig)) { return null; diff --git a/spring-cloud-netflix-turbine/src/test/java/org/springframework/cloud/netflix/turbine/EurekaInstanceDiscoveryTest.java b/spring-cloud-netflix-turbine/src/test/java/org/springframework/cloud/netflix/turbine/EurekaInstanceDiscoveryTest.java index bf95eb4ba1..5c6772957e 100644 --- a/spring-cloud-netflix-turbine/src/test/java/org/springframework/cloud/netflix/turbine/EurekaInstanceDiscoveryTest.java +++ b/spring-cloud-netflix-turbine/src/test/java/org/springframework/cloud/netflix/turbine/EurekaInstanceDiscoveryTest.java @@ -42,6 +42,52 @@ public void setUp() throws Exception { builder = InstanceInfo.Builder.newBuilder(); } + @Test + public void testSecureCombineHostPort() { + turbineProperties.setCombineHostPort(true); + EurekaInstanceDiscovery discovery = new EurekaInstanceDiscovery( + turbineProperties, eurekaClient); + String appName = "testAppName"; + int port = 8080; + int securePort = 8443; + String hostName = "myhost"; + InstanceInfo instanceInfo = builder.setAppName(appName) + .setHostName(hostName) + .setPort(port) + .setSecurePort(securePort) + .enablePort(InstanceInfo.PortType.SECURE, true) + .build(); + Instance instance = discovery.marshall(instanceInfo); + assertEquals("port is wrong", String.valueOf(port), instance.getAttributes().get("port")); + assertEquals("securePort is wrong", String.valueOf(securePort), instance.getAttributes().get("securePort")); + + String urlPath = SpringClusterMonitor.ClusterConfigBasedUrlClosure.getUrlPath(instance); + assertEquals("url is wrong", "https://"+hostName+":"+securePort+"/hystrix.stream", urlPath); + } + + @Test + public void testCombineHostPort() { + turbineProperties.setCombineHostPort(true); + EurekaInstanceDiscovery discovery = new EurekaInstanceDiscovery( + turbineProperties, eurekaClient); + String appName = "testAppName"; + int port = 8080; + String hostName = "myhost"; + InstanceInfo instanceInfo = builder.setAppName(appName) + .setHostName(hostName) + .setPort(port) + .build(); + Instance instance = discovery.marshall(instanceInfo); + assertEquals("hostname is wrong", hostName+":"+port, instance.getHostname()); + assertEquals("port is wrong", String.valueOf(port), instance.getAttributes().get("port")); + + String urlPath = SpringClusterMonitor.ClusterConfigBasedUrlClosure.getUrlPath(instance); + assertEquals("url is wrong", "http://"+hostName+":"+port+"/hystrix.stream", urlPath); + + String clusterName = discovery.getClusterName(instanceInfo); + assertEquals("clusterName is wrong", appName.toUpperCase(), clusterName); + } + @Test public void testGetClusterName() { EurekaInstanceDiscovery discovery = new EurekaInstanceDiscovery(