From 28de82e63cf0f09b55a90e27746b6f028024fe8c Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Wed, 18 Oct 2017 11:34:38 -0400 Subject: [PATCH] Use updated Registration rather than getLocalServiceInstance() See https://github.com/spring-cloud/spring-cloud-commons/issues/265 --- .../zuul/ZuulProxyAutoConfiguration.java | 6 ++- .../DiscoveryClientRouteLocator.java | 33 +++++++------ .../DiscoveryClientRouteLocatorTests.java | 47 +++++++++++++++---- .../serviceregistry/EurekaRegistration.java | 31 ++++++++++++ .../sample/EurekaSampleApplication.java | 2 +- .../doc/AbstractDocumentationTests.java | 2 +- spring-cloud-netflix-hystrix-stream/pom.xml | 5 ++ .../HystrixStreamAutoConfiguration.java | 13 +++-- .../hystrix/stream/HystrixStreamTask.java | 18 ++++--- .../stream/HystrixStreamTaskTests.java | 18 ++++--- .../hystrix/stream/HystrixStreamTests.java | 32 ++++++------- .../hystrix/stream/StreamSourceTestBase.java | 2 +- 12 files changed, 140 insertions(+), 69 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java index 95f1350d..40dee955 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java @@ -33,6 +33,7 @@ import org.springframework.cloud.client.discovery.event.HeartbeatEvent; import org.springframework.cloud.client.discovery.event.HeartbeatMonitor; import org.springframework.cloud.client.discovery.event.InstanceRegisteredEvent; import org.springframework.cloud.client.discovery.event.ParentHeartbeatEvent; +import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.commons.httpclient.ApacheHttpClientConnectionManagerFactory; import org.springframework.cloud.commons.httpclient.ApacheHttpClientFactory; import org.springframework.cloud.commons.httpclient.HttpClientConfiguration; @@ -72,6 +73,9 @@ public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { @Autowired(required = false) private List requestCustomizers = Collections.emptyList(); + @Autowired(required = false) + private Registration registration; + @Autowired private DiscoveryClient discovery; @@ -88,7 +92,7 @@ public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { @ConditionalOnMissingBean(DiscoveryClientRouteLocator.class) public DiscoveryClientRouteLocator discoveryRouteLocator() { return new DiscoveryClientRouteLocator(this.server.getServletPrefix(), - this.discovery, this.zuulProperties, this.serviceRouteMapper); + this.discovery, this.zuulProperties, this.serviceRouteMapper, this.registration); } // pre filters diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/discovery/DiscoveryClientRouteLocator.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/discovery/DiscoveryClientRouteLocator.java index ac45a22e..ad0d92a9 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/discovery/DiscoveryClientRouteLocator.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/discovery/DiscoveryClientRouteLocator.java @@ -53,22 +53,20 @@ public class DiscoveryClientRouteLocator extends SimpleRouteLocator private ServiceRouteMapper serviceRouteMapper; + @Deprecated public DiscoveryClientRouteLocator(String servletPath, DiscoveryClient discovery, - ZuulProperties properties) { + ZuulProperties properties) { + this(servletPath, discovery, properties, (ServiceInstance)null); + } + + public DiscoveryClientRouteLocator(String servletPath, DiscoveryClient discovery, + ZuulProperties properties, ServiceInstance localServiceInstance) { super(servletPath, properties); - if (properties.isIgnoreLocalService()) { - ServiceInstance instance = null; - try { - instance = discovery.getLocalServiceInstance(); - } catch (Exception e) { - log.warn("Error locating local service instance", e); - } - if (instance != null) { - String localServiceId = instance.getServiceId(); - if (!properties.getIgnoredServices().contains(localServiceId)) { - properties.getIgnoredServices().add(localServiceId); - } + if (properties.isIgnoreLocalService() && localServiceInstance != null) { + String localServiceId = localServiceInstance.getServiceId(); + if (!properties.getIgnoredServices().contains(localServiceId)) { + properties.getIgnoredServices().add(localServiceId); } } this.serviceRouteMapper = new SimpleServiceRouteMapper(); @@ -76,9 +74,16 @@ public class DiscoveryClientRouteLocator extends SimpleRouteLocator this.properties = properties; } + @Deprecated public DiscoveryClientRouteLocator(String servletPath, DiscoveryClient discovery, ZuulProperties properties, ServiceRouteMapper serviceRouteMapper) { - this(servletPath, discovery, properties); + this(servletPath, discovery, properties, (ServiceInstance)null); + this.serviceRouteMapper = serviceRouteMapper; + } + + public DiscoveryClientRouteLocator(String servletPath, DiscoveryClient discovery, + ZuulProperties properties, ServiceRouteMapper serviceRouteMapper, ServiceInstance localServiceInstance) { + this(servletPath, discovery, properties, localServiceInstance); this.serviceRouteMapper = serviceRouteMapper; } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/discovery/DiscoveryClientRouteLocatorTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/discovery/DiscoveryClientRouteLocatorTests.java index 98d80bfd..0b07485b 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/discovery/DiscoveryClientRouteLocatorTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/discovery/DiscoveryClientRouteLocatorTests.java @@ -16,25 +16,26 @@ package org.springframework.cloud.netflix.zuul.filters.discovery; +import java.net.URI; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; - -import com.netflix.zuul.context.RequestContext; +import java.util.Map; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; - -import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.netflix.zuul.filters.Route; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.ZuulRoute; import org.springframework.cloud.netflix.zuul.util.RequestUtils; import org.springframework.core.env.ConfigurableEnvironment; +import com.netflix.zuul.context.RequestContext; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -603,11 +604,40 @@ public class DiscoveryClientRouteLocatorTests { public void testIgnoredLocalServiceByDefault() { given(this.discovery.getServices()) .willReturn(Collections.singletonList(MYSERVICE)); - given(this.discovery.getLocalServiceInstance()).willReturn( - new DefaultServiceInstance(MYSERVICE, "localhost", 80, false)); + Registration registration = new Registration() { + @Override + public String getServiceId() { + return MYSERVICE; + } + + @Override + public String getHost() { + return "localhost"; + } + + @Override + public int getPort() { + return 80; + } + + @Override + public boolean isSecure() { + return false; + } + + @Override + public URI getUri() { + return null; + } + + @Override + public Map getMetadata() { + return null; + } + }; DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", - this.discovery, this.properties); + this.discovery, this.properties, registration); LinkedHashMap routes = routeLocator.locateRoutes(); ZuulRoute actual = routes.get("/**"); @@ -637,10 +667,9 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testLocalServiceExceptionIgnored() { given(this.discovery.getServices()).willReturn(Collections.emptyList()); - given(this.discovery.getLocalServiceInstance()).willThrow(new RuntimeException()); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", - this.discovery, this.properties); + this.discovery, this.properties, (Registration)null); // if no exception is thrown in constructor, this is a success routeLocator.locateRoutes(); diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaRegistration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaRegistration.java index e0afab9c..7f2adc55 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaRegistration.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaRegistration.java @@ -19,12 +19,15 @@ package org.springframework.cloud.netflix.eureka.serviceregistry; import java.io.Closeable; import java.io.IOException; +import java.net.URI; +import java.util.Map; import java.util.concurrent.atomic.AtomicReference; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.aop.framework.Advised; import org.springframework.aop.support.AopUtils; +import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.netflix.eureka.CloudEurekaClient; import org.springframework.cloud.netflix.eureka.CloudEurekaInstanceConfig; @@ -118,6 +121,34 @@ public class EurekaRegistration implements Registration, Closeable { return this.instanceConfig.getAppname(); } + @Override + public String getHost() { + return this.instanceConfig.getHostName(false); + } + + @Override + public int getPort() { + if (this.instanceConfig.getSecurePortEnabled()) { + return this.instanceConfig.getSecurePort(); + } + return this.instanceConfig.getNonSecurePort(); + } + + @Override + public boolean isSecure() { + return this.instanceConfig.getSecurePortEnabled(); + } + + @Override + public URI getUri() { + return DefaultServiceInstance.getUri(this); + } + + @Override + public Map getMetadata() { + return this.instanceConfig.getMetadataMap(); + } + public CloudEurekaClient getEurekaClient() { if (this.cloudEurekaClient.get() == null) { try { diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/sample/EurekaSampleApplication.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/sample/EurekaSampleApplication.java index 67f4be9b..53d90d97 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/sample/EurekaSampleApplication.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/sample/EurekaSampleApplication.java @@ -83,7 +83,7 @@ public class EurekaSampleApplication implements ApplicationContextAware, Closeab @RequestMapping("/") public String home() { - return "Hello world "+discoveryClient.getLocalServiceInstance().getUri(); + return "Hello world "+ registration.getUri(); } @Override diff --git a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/doc/AbstractDocumentationTests.java b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/doc/AbstractDocumentationTests.java index 76860c20..e3d8290e 100644 --- a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/doc/AbstractDocumentationTests.java +++ b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/doc/AbstractDocumentationTests.java @@ -56,7 +56,7 @@ import static org.springframework.restdocs.restassured.operation.preprocess.Rest @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { - "spring.jmx.enabled=true", "management.security.enabled=false" }) + "spring.jmx.enabled=false", "management.security.enabled=false" }) @DirtiesContext public abstract class AbstractDocumentationTests { diff --git a/spring-cloud-netflix-hystrix-stream/pom.xml b/spring-cloud-netflix-hystrix-stream/pom.xml index 8fb84f8d..9f183c40 100644 --- a/spring-cloud-netflix-hystrix-stream/pom.xml +++ b/spring-cloud-netflix-hystrix-stream/pom.xml @@ -85,6 +85,11 @@ spring-cloud-contract-verifier test + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + test + diff --git a/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfiguration.java b/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfiguration.java index 7e030102..98b17113 100644 --- a/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfiguration.java +++ b/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfiguration.java @@ -18,14 +18,12 @@ package org.springframework.cloud.netflix.hystrix.stream; import javax.annotation.PostConstruct; -import com.netflix.hystrix.HystrixCircuitBreaker; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.actuator.HasFeatures; -import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.annotation.Output; import org.springframework.cloud.stream.config.BindingProperties; @@ -35,6 +33,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.messaging.MessageChannel; import org.springframework.scheduling.annotation.EnableScheduling; +import com.netflix.hystrix.HystrixCircuitBreaker; + /** * Autoconfiguration for a Spring Cloud Hystrix on Spring Cloud Stream. Enabled by default * if spring-cloud-stream is on the classpath, and can be switched off with @@ -64,6 +64,9 @@ public class HystrixStreamAutoConfiguration { @Output(HystrixStreamClient.OUTPUT) private MessageChannel outboundChannel; + @Autowired(required = false) + private Registration registration; + @Bean public HasFeatures hystrixStreamQueueFeature() { return HasFeatures.namedFeature("Hystrix Stream (Queue)", @@ -94,8 +97,8 @@ public class HystrixStreamAutoConfiguration { } @Bean - public HystrixStreamTask hystrixStreamTask(DiscoveryClient discoveryClient) { - return new HystrixStreamTask(this.outboundChannel, discoveryClient, + public HystrixStreamTask hystrixStreamTask() { + return new HystrixStreamTask(this.outboundChannel, this.registration, this.properties); } diff --git a/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTask.java b/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTask.java index 3092162e..bd2e23fa 100644 --- a/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTask.java +++ b/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTask.java @@ -37,7 +37,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.messaging.MessageChannel; @@ -57,7 +57,7 @@ public class HystrixStreamTask implements ApplicationContextAware { private MessageChannel outboundChannel; - private DiscoveryClient discoveryClient; + private Registration registration; private HystrixStreamProperties properties; @@ -69,9 +69,9 @@ public class HystrixStreamTask implements ApplicationContextAware { private final JsonFactory jsonFactory = new JsonFactory(); public HystrixStreamTask(MessageChannel outboundChannel, - DiscoveryClient discoveryClient, HystrixStreamProperties properties) { + Registration registration, HystrixStreamProperties properties) { this.outboundChannel = outboundChannel; - this.discoveryClient = discoveryClient; + this.registration = registration; this.properties = properties; this.jsonMetrics = new LinkedBlockingQueue<>(properties.getSize()); } @@ -121,8 +121,6 @@ public class HystrixStreamTask implements ApplicationContextAware { log.trace("gathering metrics size: " + instances.size()); } - ServiceInstance localService = this.discoveryClient.getLocalServiceInstance(); - for (HystrixCommandMetrics commandMetrics : instances) { HystrixCommandKey key = commandMetrics.getCommandKey(); HystrixCircuitBreaker circuitBreaker = HystrixCircuitBreaker.Factory @@ -133,13 +131,13 @@ public class HystrixStreamTask implements ApplicationContextAware { json.writeStartObject(); - addServiceData(json, localService); + addServiceData(json, registration); json.writeObjectFieldStart("data"); json.writeStringField("type", "HystrixCommand"); String name = key.name(); - if (this.properties.isPrefixMetricName()) { - name = localService.getServiceId() + "." + name; + if (this.properties.isPrefixMetricName() && registration != null) { + name = registration.getServiceId() + "." + name; } json.writeStringField("name", name); @@ -322,7 +320,7 @@ public class HystrixStreamTask implements ApplicationContextAware { JsonGenerator json = this.jsonFactory.createGenerator(jsonString); json.writeStartObject(); - addServiceData(json, localService); + addServiceData(json, this.registration); json.writeObjectFieldStart("data"); json.writeStringField("type", "HystrixThreadPool"); diff --git a/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTaskTests.java b/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTaskTests.java index fc3dfabb..7a98c4ec 100644 --- a/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTaskTests.java +++ b/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTaskTests.java @@ -1,26 +1,25 @@ package org.springframework.cloud.netflix.hystrix.stream; -import com.netflix.hystrix.HystrixCommandGroupKey; -import com.netflix.hystrix.HystrixCommandKey; -import com.netflix.hystrix.HystrixCommandMetrics; -import com.netflix.hystrix.HystrixCommandProperties; -import com.netflix.hystrix.strategy.properties.HystrixPropertiesCommandDefault; - import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; -import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.context.ApplicationContext; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; +import com.netflix.hystrix.HystrixCommandGroupKey; +import com.netflix.hystrix.HystrixCommandKey; +import com.netflix.hystrix.HystrixCommandMetrics; +import com.netflix.hystrix.HystrixCommandProperties; +import com.netflix.hystrix.strategy.properties.HystrixPropertiesCommandDefault; + import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verifyZeroInteractions; @@ -34,7 +33,7 @@ public class HystrixStreamTaskTests { @Mock DiscoveryClient discoveryClient; @Mock ApplicationContext context; @Spy HystrixStreamProperties properties; - @Mock ServiceInstance serviceInstance; + @Mock Registration registration; @InjectMocks HystrixStreamTask hystrixStreamTask; @Test @@ -59,7 +58,6 @@ public class HystrixStreamTaskTests { HystrixCommandMetrics.getInstance(hystrixCommandKey, HystrixCommandGroupKey.Factory.asKey("commandGroupKey"), new HystrixPropertiesCommandDefault(hystrixCommandKey, HystrixCommandProperties.defaultSetter())); - given(this.discoveryClient.getLocalServiceInstance()).willReturn(this.serviceInstance); this.hystrixStreamTask.setApplicationContext(this.context); this.hystrixStreamTask.gatherMetrics(); diff --git a/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTests.java b/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTests.java index 5d25202c..543669f4 100644 --- a/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTests.java +++ b/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTests.java @@ -16,38 +16,37 @@ package org.springframework.cloud.netflix.hystrix.stream; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; - import org.junit.Test; import org.junit.runner.RunWith; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; -import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.stream.test.binder.MessageCollector; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; + import static org.assertj.core.api.Assertions.assertThat; /** * @author Spencer Gibb */ -@RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = HystrixStreamTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { - "server.port=0", "spring.jmx.enabled=true", "spring.application.name=mytestapp" }) +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = { + "debug=true", "spring.jmx.enabled=true", "spring.application.name=mytestapp" }) @DirtiesContext public class HystrixStreamTests { @@ -57,8 +56,8 @@ public class HystrixStreamTests { @Autowired private Application application; - @Autowired - private DiscoveryClient discoveryClient; + @Autowired(required = false) + private Registration registration; @Autowired private ObjectMapper mapper; @@ -73,7 +72,7 @@ public class HystrixStreamTests { @EnableAutoConfiguration @EnableCircuitBreaker @RestController - @Configuration + @SpringBootConfiguration public static class Application { @HystrixCommand @@ -88,9 +87,8 @@ public class HystrixStreamTests { this.application.hello(); // It is important that local service instance resolves for metrics // origin details to be populated - ServiceInstance localServiceInstance = discoveryClient.getLocalServiceInstance(); - assertThat(localServiceInstance).isNotNull(); - assertThat(localServiceInstance.getServiceId()).isEqualTo("mytestapp"); + assertThat(this.registration).isNotNull(); + assertThat(this.registration.getServiceId()).isEqualTo("mytestapp"); this.task.gatherMetrics(); Message message = this.collector.forChannel(output).take(); assertThat(message.getPayload()).isInstanceOf(String.class); diff --git a/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/StreamSourceTestBase.java b/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/StreamSourceTestBase.java index 8d9b5b46..8f5324aa 100644 --- a/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/StreamSourceTestBase.java +++ b/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/StreamSourceTestBase.java @@ -42,7 +42,7 @@ import org.springframework.web.bind.annotation.RestController; * @author Marius Bogoevici */ @RunWith(SpringRunner.class) -@SpringBootTest(classes = TestApplication.class) +@SpringBootTest(classes = TestApplication.class, properties = "spring.application.name=application") @AutoConfigureMessageVerifier public abstract class StreamSourceTestBase {