From a9213f2416b3877472fb7bf3aed3d188320a32b5 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Fri, 2 Jan 2015 09:47:46 +0000 Subject: [PATCH] Allow @RibbonClient("foo") as a short cut --- .../cloud/netflix/ribbon/RibbonClient.java | 3 +- .../RibbonClientConfigurationRegistrar.java | 25 +++++-- ...bonClientPreprocessorIntegrationTests.java | 61 +++++++++++++++++ ...bonClientPreprocessorIntegrationTests.java | 26 ++++---- ...onClientsPreprocessorIntegrationTests.java | 7 +- ...bonClientPreprocessorIntegrationTests.java | 66 +++++++++++++++++++ 6 files changed, 170 insertions(+), 18 deletions(-) create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/PlainRibbonClientPreprocessorIntegrationTests.java rename spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/{eureka => }/RibbonClientPreprocessorIntegrationTests.java (78%) rename spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/{eureka => }/RibbonClientsPreprocessorIntegrationTests.java (89%) create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPreprocessorIntegrationTests.java diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClient.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClient.java index 1b11d7c8..0ee35f81 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClient.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClient.java @@ -34,6 +34,7 @@ import org.springframework.context.annotation.Import; @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RibbonClient { - String name(); + String value() default ""; + String name() default ""; Class[] configuration() default {}; } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationRegistrar.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationRegistrar.java index 7b9e86f8..f0c7f519 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationRegistrar.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationRegistrar.java @@ -22,6 +22,7 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.type.AnnotationMetadata; +import org.springframework.util.StringUtils; /** * @author Dave Syer @@ -42,17 +43,33 @@ public class RibbonClientConfigurationRegistrar implements ImportBeanDefinitionR } } if (attrs != null && attrs.containsKey("defaultConfiguration")) { - registerClientConfiguration(registry, "default." + metadata.getEnclosingClassName(), + registerClientConfiguration(registry, + "default." + metadata.getEnclosingClassName(), attrs.get("defaultConfiguration")); } Map client = metadata.getAnnotationAttributes( RibbonClient.class.getName(), true); - if (client != null && client.containsKey("name")) { - registerClientConfiguration(registry, client.get("name"), - client.get("configuration")); + String name = getClientName(client); + if (name != null) { + registerClientConfiguration(registry, name, client.get("configuration")); } } + private String getClientName(Map client) { + if (client==null) { + return null; + } + String value = (String) client.get("value"); + if (value != null && StringUtils.hasText(value)) { + return value; + } + value = (String) client.get("name"); + if (value != null && StringUtils.hasText(value)) { + return value; + } + throw new IllegalStateException("Either 'name' or 'value' must be provided in @RibbonClient"); + } + private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object configuration) { BeanDefinitionBuilder builder = BeanDefinitionBuilder diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/PlainRibbonClientPreprocessorIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/PlainRibbonClientPreprocessorIntegrationTests.java new file mode 100644 index 00000000..ce9db950 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/PlainRibbonClientPreprocessorIntegrationTests.java @@ -0,0 +1,61 @@ +/* + * Copyright 2013-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.cloud.netflix.ribbon; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; +import org.springframework.cloud.netflix.ribbon.PlainRibbonClientPreprocessorIntegrationTests.TestConfiguration; +import org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.netflix.loadbalancer.Server; +import com.netflix.loadbalancer.ZoneAwareLoadBalancer; + +/** + * @author Dave Syer + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = TestConfiguration.class) +@DirtiesContext +public class PlainRibbonClientPreprocessorIntegrationTests { + + @Autowired + private SpringClientFactory factory; + + @Test + public void serverListIsWrapped() throws Exception { + @SuppressWarnings("unchecked") + ZoneAwareLoadBalancer loadBalancer = (ZoneAwareLoadBalancer) factory + .getLoadBalancer("foo"); + DomainExtractingServerList.class.cast(loadBalancer.getServerListImpl()); + } + + @Configuration + @RibbonClient("foo") + @Import({ PropertyPlaceholderAutoConfiguration.class, + ArchaiusAutoConfiguration.class, RibbonAutoConfiguration.class }) + protected static class TestConfiguration { + } + +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/RibbonClientPreprocessorIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorIntegrationTests.java similarity index 78% rename from spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/RibbonClientPreprocessorIntegrationTests.java rename to spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorIntegrationTests.java index 7bf6aed6..753169ea 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/RibbonClientPreprocessorIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorIntegrationTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.cloud.netflix.ribbon.eureka; +package org.springframework.cloud.netflix.ribbon; import static org.junit.Assert.assertEquals; @@ -23,19 +23,17 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; -import org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration; -import org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration; -import org.springframework.cloud.netflix.ribbon.RibbonClient; -import org.springframework.cloud.netflix.ribbon.SpringClientFactory; -import org.springframework.cloud.netflix.ribbon.eureka.RibbonClientPreprocessorIntegrationTests.TestConfiguration; +import org.springframework.cloud.netflix.ribbon.RibbonClientPreprocessorIntegrationTests.TestConfiguration; +import org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList; +import org.springframework.cloud.netflix.ribbon.eureka.ZonePreferenceServerListFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import com.netflix.loadbalancer.AvailabilityFilteringRule; import com.netflix.loadbalancer.Server; -import com.netflix.loadbalancer.ZoneAvoidanceRule; import com.netflix.loadbalancer.ZoneAwareLoadBalancer; /** @@ -59,11 +57,11 @@ public class RibbonClientPreprocessorIntegrationTests { } @Test - public void ruleDefaultsToZoneAvoidance() throws Exception { + public void ruleDefaultsToAvailability() throws Exception { @SuppressWarnings("unchecked") ZoneAwareLoadBalancer loadBalancer = (ZoneAwareLoadBalancer) factory .getLoadBalancer("foo"); - ZoneAvoidanceRule.class.cast(loadBalancer.getRule()); + AvailabilityFilteringRule.class.cast(loadBalancer.getRule()); } @Test @@ -76,11 +74,17 @@ public class RibbonClientPreprocessorIntegrationTests { .getZone()); } + @Configuration + @RibbonClient("foo") + @Import({ PropertyPlaceholderAutoConfiguration.class, + ArchaiusAutoConfiguration.class, RibbonAutoConfiguration.class }) + protected static class PlainConfiguration { + } + @Configuration @RibbonClient(name = "foo", configuration = FooConfiguration.class) @Import({ PropertyPlaceholderAutoConfiguration.class, - ArchaiusAutoConfiguration.class, EurekaClientAutoConfiguration.class, - RibbonAutoConfiguration.class, RibbonEurekaAutoConfiguration.class }) + ArchaiusAutoConfiguration.class, RibbonAutoConfiguration.class }) protected static class TestConfiguration { } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/RibbonClientsPreprocessorIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientsPreprocessorIntegrationTests.java similarity index 89% rename from spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/RibbonClientsPreprocessorIntegrationTests.java rename to spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientsPreprocessorIntegrationTests.java index fc9cb671..73e40c78 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/RibbonClientsPreprocessorIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientsPreprocessorIntegrationTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.cloud.netflix.ribbon.eureka; +package org.springframework.cloud.netflix.ribbon; import static org.junit.Assert.assertEquals; @@ -28,7 +28,10 @@ import org.springframework.cloud.netflix.ribbon.RibbonClients; import org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; -import org.springframework.cloud.netflix.ribbon.eureka.RibbonClientsPreprocessorIntegrationTests.TestConfiguration; +import org.springframework.cloud.netflix.ribbon.RibbonClientsPreprocessorIntegrationTests.TestConfiguration; +import org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList; +import org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration; +import org.springframework.cloud.netflix.ribbon.eureka.ZonePreferenceServerListFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPreprocessorIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPreprocessorIntegrationTests.java new file mode 100644 index 00000000..1a36d610 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPreprocessorIntegrationTests.java @@ -0,0 +1,66 @@ +/* + * Copyright 2013-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.cloud.netflix.ribbon.eureka; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; +import org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration; +import org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration; +import org.springframework.cloud.netflix.ribbon.RibbonClient; +import org.springframework.cloud.netflix.ribbon.SpringClientFactory; +import org.springframework.cloud.netflix.ribbon.eureka.EurekaRibbonClientPreprocessorIntegrationTests.TestConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.netflix.loadbalancer.Server; +import com.netflix.loadbalancer.ZoneAvoidanceRule; +import com.netflix.loadbalancer.ZoneAwareLoadBalancer; + +/** + * @author Dave Syer + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = TestConfiguration.class) +@DirtiesContext +public class EurekaRibbonClientPreprocessorIntegrationTests { + + @Autowired + private SpringClientFactory factory; + + @Test + public void ruleDefaultsToZoneAvoidance() throws Exception { + @SuppressWarnings("unchecked") + ZoneAwareLoadBalancer loadBalancer = (ZoneAwareLoadBalancer) factory + .getLoadBalancer("foo"); + ZoneAvoidanceRule.class.cast(loadBalancer.getRule()); + } + + @Configuration + @RibbonClient("foo") + @Import({ PropertyPlaceholderAutoConfiguration.class, + ArchaiusAutoConfiguration.class, RibbonAutoConfiguration.class, + EurekaClientAutoConfiguration.class, RibbonEurekaAutoConfiguration.class }) + protected static class TestConfiguration { + } + +}