You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2017/03/20 13:08:06 UTC

[2/2] camel git commit: Move cloud core feautres to camel-spring-boot

Move cloud core feautres to camel-spring-boot


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/61e50869
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/61e50869
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/61e50869

Branch: refs/heads/master
Commit: 61e50869e27b5ac4c7a08b9d3fa3175949eb25d0
Parents: 1735a5b
Author: lburgazzoli <lb...@gmail.com>
Authored: Mon Mar 20 14:06:53 2017 +0100
Committer: lburgazzoli <lb...@gmail.com>
Committed: Mon Mar 20 14:07:29 2017 +0100

----------------------------------------------------------------------
 components/camel-spring-boot/pom.xml            |   5 +
 .../boot/cloud/CamelCloudAutoConfiguration.java |  30 +++++
 .../CamelCloudConfigurationProperties.java      | 127 +++++++++++++++++++
 ...melCloudServiceChooserAutoConfiguration.java |  43 +++++++
 .../boot/cloud/CamelCloudServiceDiscovery.java  |  47 +++++++
 ...lCloudServiceDiscoveryAutoConfiguration.java |  79 ++++++++++++
 .../boot/cloud/CamelCloudServiceFilter.java     |  36 ++++++
 ...amelCloudServiceFilterAutoConfiguration.java |  70 ++++++++++
 .../main/resources/META-INF/spring.factories    |   4 +
 .../CamelCloudServiceCallConfigurationTest.java |  76 +++++++++++
 .../boot/cloud/CamelCloudServiceCallTest.java   |  89 +++++++++++++
 .../cloud/CamelCloudAutoConfiguration.java      |  30 -----
 .../CamelCloudConfigurationProperties.java      | 127 -------------------
 .../spring/cloud/CamelCloudDiscoveryClient.java |  70 ----------
 .../spring/cloud/CamelCloudLoadBalancer.java    |  85 -------------
 ...CamelCloudLoadBalancerAutoConfiguration.java |  60 ---------
 ...melCloudServiceChooserAutoConfiguration.java |  44 -------
 .../cloud/CamelCloudServiceDiscovery.java       |  47 -------
 ...lCloudServiceDiscoveryAutoConfiguration.java |  79 ------------
 .../spring/cloud/CamelCloudServiceFilter.java   |  36 ------
 ...amelCloudServiceFilterAutoConfiguration.java |  70 ----------
 .../cloud/CamelSpringCloudDiscoveryClient.java  |  65 ++++++++++
 .../cloud/CamelSpringCloudLoadBalancer.java     |  82 ++++++++++++
 ...pringCloudLoadBalancerAutoConfiguration.java |  64 ++++++++++
 .../main/resources/META-INF/spring.factories    |   6 +-
 .../CamelCloudServiceCallConfigurationTest.java |  76 -----------
 .../cloud/CamelCloudServiceCallRibbonTest.java  |  57 ---------
 ...CloudServiceCallRoutesAutoConfiguration.java |  47 -------
 .../spring/cloud/CamelCloudServiceCallTest.java |  58 ---------
 .../CamelSpringCloudServiceCallRibbonTest.java  |  90 +++++++++++++
 30 files changed, 908 insertions(+), 891 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-boot/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/pom.xml b/components/camel-spring-boot/pom.xml
index f17f90f..50cc2a4 100644
--- a/components/camel-spring-boot/pom.xml
+++ b/components/camel-spring-boot/pom.xml
@@ -104,6 +104,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
+      <artifactId>camel-http</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
       <artifactId>camel-netty4-http</artifactId>
       <scope>test</scope>
     </dependency>

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudAutoConfiguration.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudAutoConfiguration.java
new file mode 100644
index 0000000..f565769
--- /dev/null
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudAutoConfiguration.java
@@ -0,0 +1,30 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.spring.boot.cloud;
+
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConditionalOnBean(CamelAutoConfiguration.class)
+@AutoConfigureAfter(CamelAutoConfiguration.class)
+@ConditionalOnProperty(value = "camel.cloud.enabled", matchIfMissing = true)
+public class CamelCloudAutoConfiguration {
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudConfigurationProperties.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudConfigurationProperties.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudConfigurationProperties.java
new file mode 100644
index 0000000..6152547
--- /dev/null
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudConfigurationProperties.java
@@ -0,0 +1,127 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.spring.boot.cloud;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix = "camel.cloud")
+public class CamelCloudConfigurationProperties {
+    private boolean enabled = true;
+    private LoadBalancer loadBalancer = new LoadBalancer();
+    private ServiceDiscovery serviceDiscovery = new ServiceDiscovery();
+    private ServiceFilter serviceFilter = new ServiceFilter();
+    private ServiceChooser serviceChooser = new ServiceChooser();
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public LoadBalancer getLoadBalancer() {
+        return loadBalancer;
+    }
+
+    public ServiceDiscovery getServiceDiscovery() {
+        return serviceDiscovery;
+    }
+
+    public ServiceFilter getServiceFilter() {
+        return serviceFilter;
+    }
+
+    public ServiceChooser getServiceChooser() {
+        return serviceChooser;
+    }
+
+    // *****************************************
+    // Nested configurations
+    // *****************************************
+
+    public static class LoadBalancer {
+        private boolean enabled = true;
+
+        public boolean isEnabled() {
+            return enabled;
+        }
+
+        public void setEnabled(boolean enabled) {
+            this.enabled = enabled;
+        }
+    }
+
+    public static class ServiceDiscovery {
+        private boolean enabled = true;
+        private Map<String, List<String>> services = new HashMap<>();
+        private String cacheTimeout;
+
+        public boolean isEnabled() {
+            return enabled;
+        }
+
+        public void setEnabled(boolean enabled) {
+            this.enabled = enabled;
+        }
+
+        public Map<String, List<String>> getServices() {
+            return services;
+        }
+
+        public String getCacheTimeout() {
+            return cacheTimeout;
+        }
+
+        public void setCacheTimeout(String cacheTimeout) {
+            this.cacheTimeout = cacheTimeout;
+        }
+    }
+
+    public static class ServiceFilter {
+        private boolean enabled = true;
+        private Map<String, List<String>> blacklist = new HashMap<>();
+
+        public boolean isEnabled() {
+            return enabled;
+        }
+
+        public void setEnabled(boolean enabled) {
+            this.enabled = enabled;
+        }
+
+        public Map<String, List<String>> getBlacklist() {
+            return blacklist;
+        }
+    }
+
+    public static class ServiceChooser {
+        private boolean enabled = true;
+
+        public boolean isEnabled() {
+            return enabled;
+        }
+
+        public void setEnabled(boolean enabled) {
+            this.enabled = enabled;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceChooserAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceChooserAutoConfiguration.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceChooserAutoConfiguration.java
new file mode 100644
index 0000000..7214eb3
--- /dev/null
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceChooserAutoConfiguration.java
@@ -0,0 +1,43 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.spring.boot.cloud;
+
+import org.apache.camel.spring.boot.util.GroupCondition;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConditionalOnBean(CamelCloudAutoConfiguration.class)
+@EnableConfigurationProperties(CamelCloudConfigurationProperties.class)
+@Conditional(CamelCloudServiceChooserAutoConfiguration.ServiceChooserCondition.class)
+public class CamelCloudServiceChooserAutoConfiguration {
+
+    // *******************************
+    // Condition
+    // *******************************
+
+    public static class ServiceChooserCondition extends GroupCondition {
+        public ServiceChooserCondition() {
+            super(
+                "camel.cloud",
+                "camel.cloud.service-chooser"
+            );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceDiscovery.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceDiscovery.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceDiscovery.java
new file mode 100644
index 0000000..6428b63
--- /dev/null
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceDiscovery.java
@@ -0,0 +1,47 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.spring.boot.cloud;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.cloud.ServiceDefinition;
+import org.apache.camel.cloud.ServiceDiscovery;
+import org.apache.camel.impl.cloud.CachingServiceDiscovery;
+import org.apache.camel.impl.cloud.ChainedServiceDiscovery;
+
+public class CamelCloudServiceDiscovery implements ServiceDiscovery {
+    private ServiceDiscovery delegate;
+
+    public CamelCloudServiceDiscovery(Long timeout, List<ServiceDiscovery> serviceDiscoveryList) {
+        // Created a chained service discovery that collects services from multiple
+        // ServiceDiscovery
+        this.delegate = new ChainedServiceDiscovery(serviceDiscoveryList);
+
+        // If a timeout is provided, wrap the serviceDiscovery with a caching
+        // strategy so the discovery implementations are not queried for each
+        // discovery request
+        if (timeout != null && timeout > 0) {
+            this.delegate = CachingServiceDiscovery.wrap(this.delegate, timeout, TimeUnit.MILLISECONDS);
+        }
+    }
+
+    @Override
+    public List<ServiceDefinition> getServices(String name) {
+        return delegate.getServices(name);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceDiscoveryAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceDiscoveryAutoConfiguration.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceDiscoveryAutoConfiguration.java
new file mode 100644
index 0000000..9595063
--- /dev/null
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceDiscoveryAutoConfiguration.java
@@ -0,0 +1,79 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.spring.boot.cloud;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.NoTypeConversionAvailableException;
+import org.apache.camel.cloud.ServiceDiscovery;
+import org.apache.camel.impl.cloud.StaticServiceDiscovery;
+import org.apache.camel.spring.boot.util.GroupCondition;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+
+@Configuration
+@EnableConfigurationProperties(CamelCloudConfigurationProperties.class)
+@Conditional(CamelCloudServiceDiscoveryAutoConfiguration.Condition.class)
+public class CamelCloudServiceDiscoveryAutoConfiguration {
+
+    @Lazy
+    @Bean(name = "static-service-discovery")
+    public ServiceDiscovery staticServiceDiscovery(CamelCloudConfigurationProperties properties) {
+        StaticServiceDiscovery staticServiceDiscovery = new StaticServiceDiscovery();
+
+        Map<String, List<String>> services = properties.getServiceDiscovery().getServices();
+        for (Map.Entry<String, List<String>> entry : services.entrySet()) {
+            staticServiceDiscovery.addServers(entry.getKey(), entry.getValue());
+        }
+
+        return staticServiceDiscovery;
+    }
+
+    @Lazy
+    @Bean(name = "service-discovery")
+    public CamelCloudServiceDiscovery serviceDiscovery(
+            CamelContext camelContext, CamelCloudConfigurationProperties properties, List<ServiceDiscovery> serviceDiscoveryList) throws NoTypeConversionAvailableException {
+
+        String cacheTimeout = properties.getServiceDiscovery().getCacheTimeout();
+        Long timeout = null;
+
+        if (cacheTimeout != null) {
+            timeout = camelContext.getTypeConverter().mandatoryConvertTo(Long.class, timeout);
+        }
+
+        return new CamelCloudServiceDiscovery(timeout, serviceDiscoveryList);
+    }
+
+    // *******************************
+    // Condition
+    // *******************************
+
+    public static class Condition extends GroupCondition {
+        public Condition() {
+            super(
+                "camel.cloud",
+                "camel.cloud.service-discovery"
+            );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceFilter.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceFilter.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceFilter.java
new file mode 100644
index 0000000..3f8928b
--- /dev/null
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceFilter.java
@@ -0,0 +1,36 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.spring.boot.cloud;
+
+import java.util.List;
+
+import org.apache.camel.cloud.ServiceDefinition;
+import org.apache.camel.cloud.ServiceFilter;
+import org.apache.camel.impl.cloud.ChainedServiceFilter;
+
+public class CamelCloudServiceFilter implements ServiceFilter {
+    private final ChainedServiceFilter serviceFilter;
+
+    public CamelCloudServiceFilter(List<ServiceFilter> blacklistServiceFilter) {
+        this.serviceFilter = new ChainedServiceFilter(blacklistServiceFilter);
+    }
+
+    @Override
+    public List<ServiceDefinition> apply(List<ServiceDefinition> serviceDefinitions) {
+        return  this.serviceFilter.apply(serviceDefinitions);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceFilterAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceFilterAutoConfiguration.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceFilterAutoConfiguration.java
new file mode 100644
index 0000000..5a23d35
--- /dev/null
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceFilterAutoConfiguration.java
@@ -0,0 +1,70 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.spring.boot.cloud;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.impl.cloud.BlacklistServiceFilter;
+import org.apache.camel.impl.cloud.HealthyServiceFilter;
+import org.apache.camel.spring.boot.util.GroupCondition;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.StringHelper;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+
+@Configuration
+@EnableConfigurationProperties(CamelCloudConfigurationProperties.class)
+@Conditional(CamelCloudServiceFilterAutoConfiguration.Condition.class)
+public class CamelCloudServiceFilterAutoConfiguration {
+    @Lazy
+    @Bean(name = "service-filter")
+    public CamelCloudServiceFilter serviceFilter(CamelCloudConfigurationProperties properties) {
+        BlacklistServiceFilter blacklist = new BlacklistServiceFilter();
+
+        Map<String, List<String>> services = properties.getServiceFilter().getBlacklist();
+        for (Map.Entry<String, List<String>> entry : services.entrySet()) {
+            for (String part : entry.getValue()) {
+                String host = StringHelper.before(part, ":");
+                String port = StringHelper.after(part, ":");
+
+                if (ObjectHelper.isNotEmpty(host) && ObjectHelper.isNotEmpty(port)) {
+                    blacklist.addServer(entry.getKey(), host, Integer.parseInt(port));
+                }
+            }
+        }
+
+        return new CamelCloudServiceFilter(Arrays.asList(new HealthyServiceFilter(), blacklist));
+    }
+
+    // *******************************
+    // Condition
+    // *******************************
+
+    public static class Condition extends GroupCondition {
+        public Condition() {
+            super(
+                "camel.cloud",
+                "camel.cloud.service-filter"
+            );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-boot/src/main/resources/META-INF/spring.factories
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/resources/META-INF/spring.factories b/components/camel-spring-boot/src/main/resources/META-INF/spring.factories
index 361ef6b..d7ae56e 100644
--- a/components/camel-spring-boot/src/main/resources/META-INF/spring.factories
+++ b/components/camel-spring-boot/src/main/resources/META-INF/spring.factories
@@ -18,4 +18,8 @@
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
 org.apache.camel.spring.boot.CamelAutoConfiguration,\
 org.apache.camel.spring.boot.CamelRestAutoConfiguration,\
+org.apache.camel.spring.boot.cloud.CamelCloudAutoConfiguration,\
+org.apache.camel.spring.boot.cloud.CamelCloudServiceDiscoveryAutoConfiguration,\
+org.apache.camel.spring.boot.cloud.CamelCloudServiceFilterAutoConfiguration,\
+org.apache.camel.spring.boot.cloud.CamelCloudServiceChooserAutoConfiguration,\
 org.apache.camel.spring.boot.health.CamelHealthAutoConfiguration

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceCallConfigurationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceCallConfigurationTest.java b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceCallConfigurationTest.java
new file mode 100644
index 0000000..4ee24c5
--- /dev/null
+++ b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceCallConfigurationTest.java
@@ -0,0 +1,76 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.spring.boot.cloud;
+
+import org.apache.camel.cloud.LoadBalancer;
+import org.apache.camel.cloud.ServiceChooser;
+import org.apache.camel.cloud.ServiceDiscovery;
+import org.apache.camel.cloud.ServiceFilter;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.ApplicationContext;
+import org.springframework.core.env.Environment;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+@DirtiesContext
+@RunWith(SpringRunner.class)
+@SpringBootApplication()
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CamelCloudAutoConfiguration.class,
+        CamelCloudServiceChooserAutoConfiguration.class
+    },
+    properties = {
+        "camel.cloud.enabled=false",
+        "camel.cloud.service-discovery.enabled=false",
+        "camel.cloud.service-filter.enabled=false",
+        "camel.cloud.service-chooser.enabled=true",
+        "camel.cloud.load-balancer.enabled=false",
+        "debug=false"
+    }
+)
+public class CamelCloudServiceCallConfigurationTest {
+    @Autowired
+    private ApplicationContext ctx;
+
+    @Test
+    public void doTest() throws Exception {
+        Environment env = ctx.getEnvironment();
+
+        assertFalse(env.getProperty("camel.cloud.enabled", Boolean.class));
+        assertFalse(env.getProperty("camel.cloud.service-discovery.enabled", Boolean.class));
+        assertFalse(env.getProperty("camel.cloud.service-filter.enabled", Boolean.class));
+        assertTrue(env.getProperty("camel.cloud.service-chooser.enabled", Boolean.class));
+        assertFalse(env.getProperty("camel.cloud.load-balancer.enabled", Boolean.class));
+
+        assertTrue(ctx.getBeansOfType(ServiceDiscovery.class).isEmpty());
+        assertTrue(ctx.getBeansOfType(ServiceFilter.class).isEmpty());
+        assertTrue(ctx.getBeansOfType(ServiceChooser.class).isEmpty());
+        assertTrue(ctx.getBeansOfType(LoadBalancer.class).isEmpty());
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceCallTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceCallTest.java b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceCallTest.java
new file mode 100644
index 0000000..f5a9735
--- /dev/null
+++ b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceCallTest.java
@@ -0,0 +1,89 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.spring.boot.cloud;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@DirtiesContext
+@RunWith(SpringRunner.class)
+@SpringBootApplication
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CamelCloudServiceCallTest.TestConfiguration.class
+    },
+    properties = {
+        "camel.cloud.load-balancer.enabled=false",
+        "camel.cloud.service-discovery.services[custom-svc-list]=localhost:9090,localhost:9091,localhost:9092",
+        "camel.cloud.service-filter.blacklist[custom-svc-list]=localhost:9091",
+        "ribbon.enabled=false",
+        "debug=false"
+    }
+)
+public class CamelCloudServiceCallTest {
+    @Autowired
+    private ProducerTemplate template;
+
+    @Test
+    public void testServiceCall() throws Exception {
+        Assert.assertEquals("9090", template.requestBody("direct:start", null, String.class));
+        Assert.assertEquals("9092", template.requestBody("direct:start", null, String.class));
+    }
+
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public static class TestConfiguration {
+        @Bean
+        public RouteBuilder myRouteBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() throws Exception {
+                    from("direct:start")
+                        .serviceCall()
+                        .name("custom-svc-list/hello");
+
+                    from("netty4-http:http://localhost:9090/hello")
+                        .transform()
+                        .constant("9090");
+                    from("netty4-http:http://localhost:9091/hello")
+                        .transform()
+                        .constant("9091");
+                    from("netty4-http:http://localhost:9092/hello")
+                        .transform()
+                        .constant("9092");
+                }
+            };
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudAutoConfiguration.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudAutoConfiguration.java
deleted file mode 100644
index 0948436..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudAutoConfiguration.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.spring.cloud;
-
-import org.apache.camel.spring.boot.CamelAutoConfiguration;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@ConditionalOnBean(CamelAutoConfiguration.class)
-@AutoConfigureAfter(CamelAutoConfiguration.class)
-@ConditionalOnProperty(value = "camel.cloud.enabled", matchIfMissing = true)
-public class CamelCloudAutoConfiguration {
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudConfigurationProperties.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudConfigurationProperties.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudConfigurationProperties.java
deleted file mode 100644
index 97c1234..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudConfigurationProperties.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.spring.cloud;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-@ConfigurationProperties(prefix = "camel.cloud")
-public class CamelCloudConfigurationProperties {
-    private boolean enabled = true;
-    private LoadBalancer loadBalancer = new LoadBalancer();
-    private ServiceDiscovery serviceDiscovery = new ServiceDiscovery();
-    private ServiceFilter serviceFilter = new ServiceFilter();
-    private ServiceChooser serviceChooser = new ServiceChooser();
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public LoadBalancer getLoadBalancer() {
-        return loadBalancer;
-    }
-
-    public ServiceDiscovery getServiceDiscovery() {
-        return serviceDiscovery;
-    }
-
-    public ServiceFilter getServiceFilter() {
-        return serviceFilter;
-    }
-
-    public ServiceChooser getServiceChooser() {
-        return serviceChooser;
-    }
-
-    // *****************************************
-    // Nested configurations
-    // *****************************************
-
-    public static class LoadBalancer {
-        private boolean enabled = true;
-
-        public boolean isEnabled() {
-            return enabled;
-        }
-
-        public void setEnabled(boolean enabled) {
-            this.enabled = enabled;
-        }
-    }
-
-    public static class ServiceDiscovery {
-        private boolean enabled = true;
-        private Map<String, List<String>> services = new HashMap<>();
-        private String cacheTimeout;
-
-        public boolean isEnabled() {
-            return enabled;
-        }
-
-        public void setEnabled(boolean enabled) {
-            this.enabled = enabled;
-        }
-
-        public Map<String, List<String>> getServices() {
-            return services;
-        }
-
-        public String getCacheTimeout() {
-            return cacheTimeout;
-        }
-
-        public void setCacheTimeout(String cacheTimeout) {
-            this.cacheTimeout = cacheTimeout;
-        }
-    }
-
-    public static class ServiceFilter {
-        private boolean enabled = true;
-        private Map<String, List<String>> blacklist = new HashMap<>();
-
-        public boolean isEnabled() {
-            return enabled;
-        }
-
-        public void setEnabled(boolean enabled) {
-            this.enabled = enabled;
-        }
-
-        public Map<String, List<String>> getBlacklist() {
-            return blacklist;
-        }
-    }
-
-    public static class ServiceChooser {
-        private boolean enabled = true;
-
-        public boolean isEnabled() {
-            return enabled;
-        }
-
-        public void setEnabled(boolean enabled) {
-            this.enabled = enabled;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudDiscoveryClient.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudDiscoveryClient.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudDiscoveryClient.java
deleted file mode 100644
index 4f0b4f5..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudDiscoveryClient.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.spring.cloud;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.apache.camel.cloud.ServiceDiscovery;
-import org.springframework.cloud.client.DefaultServiceInstance;
-import org.springframework.cloud.client.ServiceInstance;
-import org.springframework.cloud.client.discovery.DiscoveryClient;
-
-public class CamelCloudDiscoveryClient implements DiscoveryClient {
-    private final String description;
-    private final ServiceDiscovery serviceDiscovery;
-    private ServiceInstance localInstance;
-
-    public CamelCloudDiscoveryClient(String description, ServiceDiscovery serviceDiscovery) {
-        this(description, null, serviceDiscovery);
-    }
-
-    public CamelCloudDiscoveryClient(String description, ServiceInstance localServiceDiscovery, ServiceDiscovery serviceDiscovery) {
-        this.description = description;
-        this.serviceDiscovery = serviceDiscovery;
-        this.localInstance = localServiceDiscovery;
-    }
-
-    @Override
-    public String description() {
-        return description;
-    }
-
-    @Override
-    public ServiceInstance getLocalServiceInstance() {
-        return this.localInstance;
-    }
-
-    public CamelCloudDiscoveryClient setLocalServiceInstance(ServiceInstance instance) {
-        this.localInstance = instance;
-        return this;
-    }
-
-    @Override
-    public List<ServiceInstance> getInstances(String serviceId) {
-        return serviceDiscovery.getServices(serviceId).stream()
-            .map(s -> new DefaultServiceInstance(s.getName(), s.getHost(), s.getPort(), false, s.getMetadata()))
-            .collect(Collectors.toList());
-    }
-
-    @Override
-    public List<String> getServices() {
-        return Collections.emptyList();
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudLoadBalancer.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudLoadBalancer.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudLoadBalancer.java
deleted file mode 100644
index c37a1eea..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudLoadBalancer.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.spring.cloud;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
-import org.apache.camel.cloud.LoadBalancer;
-import org.apache.camel.cloud.LoadBalancerFunction;
-import org.apache.camel.cloud.ServiceDefinition;
-import org.apache.camel.impl.cloud.DefaultServiceDefinition;
-import org.apache.camel.support.ServiceSupport;
-import org.apache.camel.util.ObjectHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.cloud.client.ServiceInstance;
-import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
-
-public class CamelCloudLoadBalancer extends ServiceSupport implements CamelContextAware, LoadBalancer {
-    private static final Logger LOGGER = LoggerFactory.getLogger(CamelCloudLoadBalancer.class);
-
-    private final LoadBalancerClient loadBalancerClient;
-    private CamelContext camelContext;
-
-    public CamelCloudLoadBalancer(LoadBalancerClient loadBalancerClient) {
-        this.loadBalancerClient = loadBalancerClient;
-    }
-
-    @Override
-    public CamelContext getCamelContext() {
-        return camelContext;
-    }
-
-    @Override
-    public void setCamelContext(CamelContext camelContext) {
-        this.camelContext = camelContext;
-    }
-
-    @Override
-    protected void doStart() throws Exception {
-        ObjectHelper.notNull(camelContext, "camelContext");
-        ObjectHelper.notNull(loadBalancerClient, "loadBalancerClient");
-
-        LOGGER.info("ServiceCall is using cloud load balancer of type: {}", loadBalancerClient.getClass());
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-    }
-
-    @Override
-    public <T> T process(String serviceName, LoadBalancerFunction<T> function) throws Exception {
-
-
-        return loadBalancerClient.execute(
-            serviceName,  i -> function.apply(instanceToDefinition(i)));
-    }
-
-    // *******************************
-    // Helpers
-    // *******************************
-
-    private ServiceDefinition instanceToDefinition(ServiceInstance instance) {
-        return new DefaultServiceDefinition(
-            instance.getServiceId(),
-            instance.getHost(),
-            instance.getPort(),
-            instance.getMetadata()
-        );
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudLoadBalancerAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudLoadBalancerAutoConfiguration.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudLoadBalancerAutoConfiguration.java
deleted file mode 100644
index 479e5f3..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudLoadBalancerAutoConfiguration.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.spring.cloud;
-
-
-import org.apache.camel.cloud.LoadBalancer;
-import org.apache.camel.spring.boot.util.GroupCondition;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.client.discovery.DiscoveryClient;
-import org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration;
-import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Conditional;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@ConditionalOnBean({ CamelCloudAutoConfiguration.class, LoadBalancerClient.class })
-@AutoConfigureAfter({ LoadBalancerAutoConfiguration.class, CamelCloudServiceDiscoveryAutoConfiguration.class })
-@EnableConfigurationProperties(CamelCloudConfigurationProperties.class)
-@Conditional(CamelCloudLoadBalancerAutoConfiguration.LoadBalancerCondition.class)
-public class CamelCloudLoadBalancerAutoConfiguration {
-    @Bean(name = "load-balancer")
-    public LoadBalancer cloudLoadBalancer(LoadBalancerClient loadBalancerClient) {
-        return new CamelCloudLoadBalancer(loadBalancerClient);
-    }
-
-    @Bean(name = "load-balancer-discovery-client")
-    public DiscoveryClient serviceDiscoveryClient(CamelCloudServiceDiscovery serviceDiscovery) {
-        return new CamelCloudDiscoveryClient("service-discovery-client", serviceDiscovery);
-    }
-
-    // *******************************
-    // Condition
-    // *******************************
-
-    public static class LoadBalancerCondition extends GroupCondition {
-        public LoadBalancerCondition() {
-            super(
-                "camel.cloud",
-                "camel.cloud.load-balancer"
-            );
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceChooserAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceChooserAutoConfiguration.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceChooserAutoConfiguration.java
deleted file mode 100644
index 81838ef..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceChooserAutoConfiguration.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.spring.cloud;
-
-import org.apache.camel.spring.boot.util.GroupCondition;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Conditional;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@ConditionalOnBean(CamelCloudAutoConfiguration.class)
-@EnableConfigurationProperties(CamelCloudConfigurationProperties.class)
-@Conditional(CamelCloudServiceChooserAutoConfiguration.ServiceChooserCondition.class)
-public class CamelCloudServiceChooserAutoConfiguration {
-
-    // *******************************
-    // Condition
-    // *******************************
-
-    public static class ServiceChooserCondition extends GroupCondition {
-        public ServiceChooserCondition() {
-            super(
-                "camel.cloud",
-                "camel.cloud.service-chooser"
-            );
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceDiscovery.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceDiscovery.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceDiscovery.java
deleted file mode 100644
index d67963c..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceDiscovery.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.spring.cloud;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.camel.cloud.ServiceDefinition;
-import org.apache.camel.cloud.ServiceDiscovery;
-import org.apache.camel.impl.cloud.CachingServiceDiscovery;
-import org.apache.camel.impl.cloud.ChainedServiceDiscovery;
-
-public class CamelCloudServiceDiscovery implements ServiceDiscovery {
-    private ServiceDiscovery delegate;
-
-    public CamelCloudServiceDiscovery(Long timeout, List<ServiceDiscovery> serviceDiscoveryList) {
-        // Created a chained service discovery that collects services from multiple
-        // ServiceDiscovery
-        this.delegate = new ChainedServiceDiscovery(serviceDiscoveryList);
-
-        // If a timeout is provided, wrap the serviceDiscovery with a caching
-        // strategy so the discovery implementations are not queried for each
-        // discovery request
-        if (timeout != null && timeout > 0) {
-            this.delegate = CachingServiceDiscovery.wrap(this.delegate, timeout, TimeUnit.MILLISECONDS);
-        }
-    }
-
-    @Override
-    public List<ServiceDefinition> getServices(String name) {
-        return delegate.getServices(name);
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceDiscoveryAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceDiscoveryAutoConfiguration.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceDiscoveryAutoConfiguration.java
deleted file mode 100644
index c0324b4..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceDiscoveryAutoConfiguration.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.spring.cloud;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.NoTypeConversionAvailableException;
-import org.apache.camel.cloud.ServiceDiscovery;
-import org.apache.camel.impl.cloud.StaticServiceDiscovery;
-import org.apache.camel.spring.boot.util.GroupCondition;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Conditional;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Lazy;
-
-@Configuration
-@EnableConfigurationProperties(CamelCloudConfigurationProperties.class)
-@Conditional(CamelCloudServiceDiscoveryAutoConfiguration.Condition.class)
-public class CamelCloudServiceDiscoveryAutoConfiguration {
-
-    @Lazy
-    @Bean(name = "static-service-discovery")
-    public ServiceDiscovery staticServiceDiscovery(CamelCloudConfigurationProperties properties) {
-        StaticServiceDiscovery staticServiceDiscovery = new StaticServiceDiscovery();
-
-        Map<String, List<String>> services = properties.getServiceDiscovery().getServices();
-        for (Map.Entry<String, List<String>> entry : services.entrySet()) {
-            staticServiceDiscovery.addServers(entry.getKey(), entry.getValue());
-        }
-
-        return staticServiceDiscovery;
-    }
-
-    @Lazy
-    @Bean(name = "service-discovery")
-    public CamelCloudServiceDiscovery serviceDiscovery(
-            CamelContext camelContext, CamelCloudConfigurationProperties properties, List<ServiceDiscovery> serviceDiscoveryList) throws NoTypeConversionAvailableException {
-
-        String cacheTimeout = properties.getServiceDiscovery().getCacheTimeout();
-        Long timeout = null;
-
-        if (cacheTimeout != null) {
-            timeout = camelContext.getTypeConverter().mandatoryConvertTo(Long.class, timeout);
-        }
-
-        return new CamelCloudServiceDiscovery(timeout, serviceDiscoveryList);
-    }
-
-    // *******************************
-    // Condition
-    // *******************************
-
-    public static class Condition extends GroupCondition {
-        public Condition() {
-            super(
-                "camel.cloud",
-                "camel.cloud.service-discovery"
-            );
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceFilter.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceFilter.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceFilter.java
deleted file mode 100644
index 5c5b8bf..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceFilter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.spring.cloud;
-
-import java.util.List;
-
-import org.apache.camel.cloud.ServiceDefinition;
-import org.apache.camel.cloud.ServiceFilter;
-import org.apache.camel.impl.cloud.ChainedServiceFilter;
-
-public class CamelCloudServiceFilter implements ServiceFilter {
-    private final ChainedServiceFilter serviceFilter;
-
-    public CamelCloudServiceFilter(List<ServiceFilter> blacklistServiceFilter) {
-        this.serviceFilter = new ChainedServiceFilter(blacklistServiceFilter);
-    }
-
-    @Override
-    public List<ServiceDefinition> apply(List<ServiceDefinition> serviceDefinitions) {
-        return  this.serviceFilter.apply(serviceDefinitions);
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceFilterAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceFilterAutoConfiguration.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceFilterAutoConfiguration.java
deleted file mode 100644
index c29e1a8..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceFilterAutoConfiguration.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.spring.cloud;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.camel.impl.cloud.BlacklistServiceFilter;
-import org.apache.camel.impl.cloud.HealthyServiceFilter;
-import org.apache.camel.spring.boot.util.GroupCondition;
-import org.apache.camel.util.ObjectHelper;
-import org.apache.camel.util.StringHelper;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Conditional;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Lazy;
-
-@Configuration
-@EnableConfigurationProperties(CamelCloudConfigurationProperties.class)
-@Conditional(CamelCloudServiceFilterAutoConfiguration.Condition.class)
-public class CamelCloudServiceFilterAutoConfiguration {
-    @Lazy
-    @Bean(name = "service-filter")
-    public CamelCloudServiceFilter serviceFilter(CamelCloudConfigurationProperties properties) {
-        BlacklistServiceFilter blacklist = new BlacklistServiceFilter();
-
-        Map<String, List<String>> services = properties.getServiceFilter().getBlacklist();
-        for (Map.Entry<String, List<String>> entry : services.entrySet()) {
-            for (String part : entry.getValue()) {
-                String host = StringHelper.before(part, ":");
-                String port = StringHelper.after(part, ":");
-
-                if (ObjectHelper.isNotEmpty(host) && ObjectHelper.isNotEmpty(port)) {
-                    blacklist.addServer(entry.getKey(), host, Integer.parseInt(port));
-                }
-            }
-        }
-
-        return new CamelCloudServiceFilter(Arrays.asList(new HealthyServiceFilter(), blacklist));
-    }
-
-    // *******************************
-    // Condition
-    // *******************************
-
-    public static class Condition extends GroupCondition {
-        public Condition() {
-            super(
-                "camel.cloud",
-                "camel.cloud.service-filter"
-            );
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudDiscoveryClient.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudDiscoveryClient.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudDiscoveryClient.java
new file mode 100644
index 0000000..b210ea4
--- /dev/null
+++ b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudDiscoveryClient.java
@@ -0,0 +1,65 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.spring.cloud;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.camel.cloud.ServiceDiscovery;
+import org.springframework.cloud.client.DefaultServiceInstance;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+
+public class CamelSpringCloudDiscoveryClient implements DiscoveryClient {
+    private final String description;
+    private final ServiceDiscovery serviceDiscovery;
+    private ServiceInstance localInstance;
+
+    public CamelSpringCloudDiscoveryClient(String description, ServiceDiscovery serviceDiscovery) {
+        this(description, null, serviceDiscovery);
+    }
+
+    public CamelSpringCloudDiscoveryClient(String description, ServiceInstance localServiceDiscovery, ServiceDiscovery serviceDiscovery) {
+        this.description = description;
+        this.serviceDiscovery = serviceDiscovery;
+        this.localInstance = localServiceDiscovery;
+    }
+
+    @Override
+    public String description() {
+        return description;
+    }
+
+    @Override
+    public ServiceInstance getLocalServiceInstance() {
+        return this.localInstance;
+    }
+
+    @Override
+    public List<ServiceInstance> getInstances(String serviceId) {
+        return serviceDiscovery.getServices(serviceId).stream()
+            .map(s -> new DefaultServiceInstance(s.getName(), s.getHost(), s.getPort(), false, s.getMetadata()))
+            .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<String> getServices() {
+        return Collections.emptyList();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudLoadBalancer.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudLoadBalancer.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudLoadBalancer.java
new file mode 100644
index 0000000..2cf208d
--- /dev/null
+++ b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudLoadBalancer.java
@@ -0,0 +1,82 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.spring.cloud;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.cloud.LoadBalancer;
+import org.apache.camel.cloud.LoadBalancerFunction;
+import org.apache.camel.cloud.ServiceDefinition;
+import org.apache.camel.impl.cloud.DefaultServiceDefinition;
+import org.apache.camel.support.ServiceSupport;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
+
+public class CamelSpringCloudLoadBalancer extends ServiceSupport implements CamelContextAware, LoadBalancer {
+    private static final Logger LOGGER = LoggerFactory.getLogger(CamelSpringCloudLoadBalancer.class);
+
+    private final LoadBalancerClient loadBalancerClient;
+    private CamelContext camelContext;
+
+    public CamelSpringCloudLoadBalancer(LoadBalancerClient loadBalancerClient) {
+        this.loadBalancerClient = loadBalancerClient;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        ObjectHelper.notNull(camelContext, "camelContext");
+        ObjectHelper.notNull(loadBalancerClient, "loadBalancerClient");
+
+        LOGGER.info("ServiceCall is using cloud load balancer of type: {}", loadBalancerClient.getClass());
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+    }
+
+    @Override
+    public <T> T process(String serviceName, LoadBalancerFunction<T> function) throws Exception {
+        return loadBalancerClient.execute(serviceName,  i -> function.apply(instanceToDefinition(i)));
+    }
+
+    // *******************************
+    // Helpers
+    // *******************************
+
+    private ServiceDefinition instanceToDefinition(ServiceInstance instance) {
+        return new DefaultServiceDefinition(
+            instance.getServiceId(),
+            instance.getHost(),
+            instance.getPort(),
+            instance.getMetadata()
+        );
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudLoadBalancerAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudLoadBalancerAutoConfiguration.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudLoadBalancerAutoConfiguration.java
new file mode 100644
index 0000000..8ac2119
--- /dev/null
+++ b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudLoadBalancerAutoConfiguration.java
@@ -0,0 +1,64 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.spring.cloud;
+
+
+import org.apache.camel.cloud.LoadBalancer;
+import org.apache.camel.spring.boot.cloud.CamelCloudAutoConfiguration;
+import org.apache.camel.spring.boot.cloud.CamelCloudConfigurationProperties;
+import org.apache.camel.spring.boot.cloud.CamelCloudServiceDiscovery;
+import org.apache.camel.spring.boot.cloud.CamelCloudServiceDiscoveryAutoConfiguration;
+import org.apache.camel.spring.boot.util.GroupCondition;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration;
+import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConditionalOnBean({ CamelCloudAutoConfiguration.class, LoadBalancerClient.class })
+@AutoConfigureAfter({ LoadBalancerAutoConfiguration.class, CamelCloudServiceDiscoveryAutoConfiguration.class })
+@EnableConfigurationProperties(CamelCloudConfigurationProperties.class)
+@Conditional(CamelSpringCloudLoadBalancerAutoConfiguration.LoadBalancerCondition.class)
+public class CamelSpringCloudLoadBalancerAutoConfiguration {
+    @Bean(name = "load-balancer")
+    public LoadBalancer cloudLoadBalancer(LoadBalancerClient loadBalancerClient) {
+        return new CamelSpringCloudLoadBalancer(loadBalancerClient);
+    }
+
+    @Bean(name = "load-balancer-discovery-client")
+    public DiscoveryClient serviceDiscoveryClient(CamelCloudServiceDiscovery serviceDiscovery) {
+        return new CamelSpringCloudDiscoveryClient("service-discovery-client", serviceDiscovery);
+    }
+
+    // *******************************
+    // Condition
+    // *******************************
+
+    public static class LoadBalancerCondition extends GroupCondition {
+        public LoadBalancerCondition() {
+            super(
+                "camel.cloud",
+                "camel.cloud.load-balancer"
+            );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/main/resources/META-INF/spring.factories
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/resources/META-INF/spring.factories b/components/camel-spring-cloud/src/main/resources/META-INF/spring.factories
index a183cdd..fc59127 100644
--- a/components/camel-spring-cloud/src/main/resources/META-INF/spring.factories
+++ b/components/camel-spring-cloud/src/main/resources/META-INF/spring.factories
@@ -16,8 +16,4 @@
 #
 
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-org.apache.camel.spring.cloud.CamelCloudAutoConfiguration,\
-org.apache.camel.spring.cloud.CamelCloudServiceDiscoveryAutoConfiguration,\
-org.apache.camel.spring.cloud.CamelCloudServiceFilterAutoConfiguration,\
-org.apache.camel.spring.cloud.CamelCloudServiceChooserAutoConfiguration,\
-org.apache.camel.spring.cloud.CamelCloudLoadBalancerAutoConfiguration
+org.apache.camel.spring.cloud.CamelSpringCloudLoadBalancerAutoConfiguration

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/test/java/org/apache/camel/spring/cloud/CamelCloudServiceCallConfigurationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/test/java/org/apache/camel/spring/cloud/CamelCloudServiceCallConfigurationTest.java b/components/camel-spring-cloud/src/test/java/org/apache/camel/spring/cloud/CamelCloudServiceCallConfigurationTest.java
deleted file mode 100644
index 42c821a..0000000
--- a/components/camel-spring-cloud/src/test/java/org/apache/camel/spring/cloud/CamelCloudServiceCallConfigurationTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.spring.cloud;
-
-import org.apache.camel.cloud.LoadBalancer;
-import org.apache.camel.cloud.ServiceChooser;
-import org.apache.camel.cloud.ServiceDiscovery;
-import org.apache.camel.cloud.ServiceFilter;
-import org.apache.camel.spring.boot.CamelAutoConfiguration;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.context.ApplicationContext;
-import org.springframework.core.env.Environment;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-@DirtiesContext
-@RunWith(SpringRunner.class)
-@SpringBootApplication()
-@SpringBootTest(
-    classes = {
-        CamelAutoConfiguration.class,
-        CamelCloudAutoConfiguration.class,
-        CamelCloudServiceChooserAutoConfiguration.class
-    },
-    properties = {
-        "camel.cloud.enabled=false",
-        "camel.cloud.service-discovery.enabled=false",
-        "camel.cloud.service-filter.enabled=false",
-        "camel.cloud.service-chooser.enabled=true",
-        "camel.cloud.load-balancer.enabled=false",
-        "debug=false"
-    }
-)
-public class CamelCloudServiceCallConfigurationTest {
-    @Autowired
-    private ApplicationContext ctx;
-
-    @Test
-    public void doTest() throws Exception {
-        Environment env = ctx.getEnvironment();
-
-        assertFalse(env.getProperty("camel.cloud.enabled", Boolean.class));
-        assertFalse(env.getProperty("camel.cloud.service-discovery.enabled", Boolean.class));
-        assertFalse(env.getProperty("camel.cloud.service-filter.enabled", Boolean.class));
-        assertTrue(env.getProperty("camel.cloud.service-chooser.enabled", Boolean.class));
-        assertFalse(env.getProperty("camel.cloud.load-balancer.enabled", Boolean.class));
-
-        assertTrue(ctx.getBeansOfType(ServiceDiscovery.class).isEmpty());
-        assertTrue(ctx.getBeansOfType(ServiceFilter.class).isEmpty());
-        assertTrue(ctx.getBeansOfType(ServiceChooser.class).isEmpty());
-        assertTrue(ctx.getBeansOfType(LoadBalancer.class).isEmpty());
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/test/java/org/apache/camel/spring/cloud/CamelCloudServiceCallRibbonTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/test/java/org/apache/camel/spring/cloud/CamelCloudServiceCallRibbonTest.java b/components/camel-spring-cloud/src/test/java/org/apache/camel/spring/cloud/CamelCloudServiceCallRibbonTest.java
deleted file mode 100644
index 01fb0c6..0000000
--- a/components/camel-spring-cloud/src/test/java/org/apache/camel/spring/cloud/CamelCloudServiceCallRibbonTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.spring.cloud;
-
-import org.apache.camel.ProducerTemplate;
-import org.apache.camel.spring.boot.CamelAutoConfiguration;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.annotation.DirtiesContext;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@DirtiesContext
-@RunWith(SpringRunner.class)
-@SpringBootApplication
-@SpringBootTest(
-    classes = {
-        CamelAutoConfiguration.class,
-        CamelCloudAutoConfiguration.class,
-        CamelCloudServiceCallRoutesAutoConfiguration.class
-    },
-    properties = {
-        "ribbon.eureka.enabled=false",
-        "ribbon.listOfServers=localhost:9090,localhost:9092",
-        "ribbon.ServerListRefreshInterval=15000",
-        "debug=false"
-    }
-)
-public class CamelCloudServiceCallRibbonTest {
-    @Autowired
-    private ProducerTemplate template;
-
-    @Test
-    public void testServiceCall() throws Exception {
-        Assert.assertEquals("9090", template.requestBody("direct:start", null, String.class));
-        Assert.assertEquals("9092", template.requestBody("direct:start", null, String.class));
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/camel/blob/61e50869/components/camel-spring-cloud/src/test/java/org/apache/camel/spring/cloud/CamelCloudServiceCallRoutesAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/test/java/org/apache/camel/spring/cloud/CamelCloudServiceCallRoutesAutoConfiguration.java b/components/camel-spring-cloud/src/test/java/org/apache/camel/spring/cloud/CamelCloudServiceCallRoutesAutoConfiguration.java
deleted file mode 100644
index ed5bb63..0000000
--- a/components/camel-spring-cloud/src/test/java/org/apache/camel/spring/cloud/CamelCloudServiceCallRoutesAutoConfiguration.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.apache.camel.spring.cloud;
-
-import org.apache.camel.builder.RouteBuilder;
-import org.springframework.context.annotation.Bean;
-
-public class CamelCloudServiceCallRoutesAutoConfiguration {
-    @Bean
-    public RouteBuilder myRouteBuilder() {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:start")
-                    .serviceCall()
-                       .name("custom-svc-list/hello");
-
-                from("jetty:http://localhost:9090/hello")
-                    .transform()
-                    .constant("9090");
-                from("jetty:http://localhost:9091/hello")
-                    .transform()
-                    .constant("9091");
-                from("jetty:http://localhost:9092/hello")
-                    .transform()
-                    .constant("9092");
-            }
-        };
-    }
-}
-
-