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/01/11 12:04:13 UTC

[02/10] camel git commit: CAMEL-10638: Refactor ServiceCall EIP

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.java
new file mode 100644
index 0000000..34269b3
--- /dev/null
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.java
@@ -0,0 +1,31 @@
+/**
+ * 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.component.ribbon.cloud;
+
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+
+@DirtiesContext
+public class SpringDslRibbonServiceCallRouteTest extends SpringRibbonServiceCallRouteTest {
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.xml");
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringRibbonServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringRibbonServiceCallRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringRibbonServiceCallRouteTest.java
new file mode 100644
index 0000000..3c9e8b2
--- /dev/null
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringRibbonServiceCallRouteTest.java
@@ -0,0 +1,40 @@
+/**
+ * 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.component.ribbon.cloud;
+
+import org.apache.camel.test.spring.CamelSpringTestSupport;
+import org.junit.Test;
+import org.springframework.test.annotation.DirtiesContext;
+
+@DirtiesContext
+public abstract class SpringRibbonServiceCallRouteTest extends CamelSpringTestSupport {
+    @Test
+    public void testServiceCall() throws Exception {
+        getMockEndpoint("mock:9090").expectedMessageCount(1);
+        getMockEndpoint("mock:9091").expectedMessageCount(1);
+        getMockEndpoint("mock:result").expectedMessageCount(2);
+
+        String out = template.requestBody("direct:start", null, String.class);
+        String out2 = template.requestBody("direct:start", null, String.class);
+        assertEquals("9091", out);
+        assertEquals("9090", out2);
+
+        assertMockEndpointsSatisfied();
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServerListTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServerListTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServerListTest.java
deleted file mode 100644
index 4671709..0000000
--- a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServerListTest.java
+++ /dev/null
@@ -1,53 +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.component.ribbon.processor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import com.netflix.loadbalancer.LoadBalancerBuilder;
-import com.netflix.loadbalancer.RoundRobinRule;
-import com.netflix.loadbalancer.Server;
-import com.netflix.loadbalancer.ServerList;
-import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
-import org.junit.Test;
-
-public class RibbonServerListTest extends TestCase {
-
-    @Test
-    public void testFixedServerList() throws Exception {
-        List<RibbonServer> servers = new ArrayList<>();
-        servers.add(new RibbonServer("localhost", 9090));
-        servers.add(new RibbonServer("localhost", 9091));
-
-        ServerList<RibbonServer> list = new RibbonServiceCallStaticServerListStrategy(servers);
-
-        ZoneAwareLoadBalancer<RibbonServer> lb = LoadBalancerBuilder.<RibbonServer>newBuilder()
-            .withDynamicServerList(list)
-            .withRule(new RoundRobinRule()).buildDynamicServerListLoadBalancer();
-
-        Server server = lb.chooseServer();
-        assertEquals("localhost", server.getHost());
-        assertEquals(9091, server.getPort());
-
-        server = lb.chooseServer();
-        assertEquals("localhost", server.getHost());
-        assertEquals(9090, server.getPort());
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallRegistryRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallRegistryRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallRegistryRouteTest.java
deleted file mode 100644
index b1c7d4d..0000000
--- a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallRegistryRouteTest.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.component.ribbon.processor;
-
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.remote.RibbonConfigurationDefinition;
-
-public class RibbonServiceCallRegistryRouteTest extends RibbonServiceCallRouteTest {
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                // setup a static ribbon server list with these 2 servers to start with
-                RibbonServiceCallStaticServerListStrategy servers = new RibbonServiceCallStaticServerListStrategy();
-                servers.addServer("localhost", 9090);
-                servers.addServer("localhost", 9091);
-
-                // configure camel service call
-                RibbonConfigurationDefinition config = new RibbonConfigurationDefinition();
-                config.setServerListStrategy(servers);
-
-                // register configuration
-                context.setServiceCallConfiguration(config);
-
-                from("direct:start")
-                        .serviceCall("myService")
-                        .to("mock:result");
-
-                from("jetty:http://localhost:9090")
-                    .to("mock:9090")
-                    .transform().constant("9090");
-
-                from("jetty:http://localhost:9091")
-                    .to("mock:9091")
-                    .transform().constant("9091");
-            }
-        };
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallRouteTest.java
deleted file mode 100644
index a3abc29..0000000
--- a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallRouteTest.java
+++ /dev/null
@@ -1,65 +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.component.ribbon.processor;
-
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.test.junit4.CamelTestSupport;
-import org.junit.Test;
-
-public class RibbonServiceCallRouteTest extends CamelTestSupport {
-
-    @Test
-    public void testServiceCall() throws Exception {
-        getMockEndpoint("mock:9090").expectedMessageCount(1);
-        getMockEndpoint("mock:9091").expectedMessageCount(1);
-        getMockEndpoint("mock:result").expectedMessageCount(2);
-
-        String out = template.requestBody("direct:start", null, String.class);
-        String out2 = template.requestBody("direct:start", null, String.class);
-        assertEquals("9091", out);
-        assertEquals("9090", out2);
-
-        assertMockEndpointsSatisfied();
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                // setup a static ribbon server list with these 2 servers to start with
-                RibbonServiceCallStaticServerListStrategy servers = new RibbonServiceCallStaticServerListStrategy();
-                servers.addServer("localhost", 9090);
-                servers.addServer("localhost", 9091);
-
-                from("direct:start")
-                        .serviceCall().name("myService").ribbonConfiguration().serverListStrategy(servers).end()
-                        .to("mock:result");
-
-                from("jetty:http://localhost:9090")
-                    .to("mock:9090")
-                    .transform().constant("9090");
-
-                from("jetty:http://localhost:9091")
-                    .to("mock:9091")
-                    .transform().constant("9091");
-            }
-        };
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallUpdateRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallUpdateRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallUpdateRouteTest.java
deleted file mode 100644
index a37f5bc..0000000
--- a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallUpdateRouteTest.java
+++ /dev/null
@@ -1,90 +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.component.ribbon.processor;
-
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.test.junit4.CamelTestSupport;
-import org.junit.Test;
-
-public class RibbonServiceCallUpdateRouteTest extends CamelTestSupport {
-
-    private final RibbonServiceCallStaticServerListStrategy servers = new RibbonServiceCallStaticServerListStrategy();
-
-    @Override
-    public void setUp() throws Exception {
-        // setup a static ribbon server list with these 2 servers to start with
-        servers.addServer("localhost", 9090);
-        servers.addServer("localhost", 9091);
-
-        super.setUp();
-    }
-
-    @Test
-    public void testServiceCall() throws Exception {
-        getMockEndpoint("mock:9090").expectedMessageCount(1);
-        getMockEndpoint("mock:9091").expectedMessageCount(1);
-        getMockEndpoint("mock:result").expectedMessageCount(2);
-
-        String out = template.requestBody("direct:start", null, String.class);
-        String out2 = template.requestBody("direct:start", null, String.class);
-        assertEquals("9091", out);
-        assertEquals("9090", out2);
-
-        assertMockEndpointsSatisfied();
-
-        // stop the first server and remove it from the known list of servers
-        context.stopRoute("9090");
-        servers.removeServer("localhost", 9090);
-
-        // call the other active server
-        String out3 = template.requestBody("direct:start", null, String.class);
-        assertEquals("9091", out3);
-
-        // sleep a bit to make the server updated run and detect that a server is no longer in the list
-        log.debug("Sleeping to all the server list updated to run");
-        Thread.sleep(1000);
-        log.debug("Calling the service now");
-
-        // call again and it should call 9091 as its the only active server
-        String out4 = template.requestBody("direct:start", null, String.class);
-        assertEquals("9091", out4);
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("direct:start")
-                        .serviceCall().name("myService")
-                            // lets update quick so we do not have to sleep so much in the tests
-                            .ribbonConfiguration().serverListStrategy(servers).clientProperty("ServerListRefreshInterval", "250").end()
-                        .to("mock:result");
-
-                from("jetty:http://localhost:9090").routeId("9090")
-                    .to("mock:9090")
-                    .transform().constant("9090");
-
-                from("jetty:http://localhost:9091").routeId("9091")
-                    .to("mock:9091")
-                    .transform().constant("9091");
-            }
-        };
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/SpringRibbonServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/SpringRibbonServiceCallRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/SpringRibbonServiceCallRouteTest.java
deleted file mode 100644
index 6b35b75..0000000
--- a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/processor/SpringRibbonServiceCallRouteTest.java
+++ /dev/null
@@ -1,46 +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.component.ribbon.processor;
-
-import org.apache.camel.test.spring.CamelSpringTestSupport;
-import org.junit.Test;
-import org.springframework.context.support.AbstractApplicationContext;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-public class SpringRibbonServiceCallRouteTest extends CamelSpringTestSupport {
-
-    @Override
-    protected AbstractApplicationContext createApplicationContext() {
-        return new ClassPathXmlApplicationContext("org/apache/camel/component/ribbon/processor/SpringRibbonServiceCallRouteTest.xml");
-    }
-
-    @Test
-    public void testServiceCall() throws Exception {
-        getMockEndpoint("mock:9090").expectedMessageCount(1);
-        getMockEndpoint("mock:9091").expectedMessageCount(1);
-        getMockEndpoint("mock:result").expectedMessageCount(2);
-
-        String out = template.requestBody("direct:start", null, String.class);
-        String out2 = template.requestBody("direct:start", null, String.class);
-        assertEquals("9091", out);
-        assertEquals("9090", out2);
-
-        assertMockEndpointsSatisfied();
-    }
-
-}
-

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringBeanRibbonServiceCallRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringBeanRibbonServiceCallRouteTest.xml b/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringBeanRibbonServiceCallRouteTest.xml
new file mode 100644
index 0000000..01e59d9
--- /dev/null
+++ b/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringBeanRibbonServiceCallRouteTest.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+         http://www.springframework.org/schema/beans
+         http://www.springframework.org/schema/beans/spring-beans.xsd
+         http://camel.apache.org/schema/spring
+         http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+  <!-- setup a static ribbon server list with these 2 servers to start with -->
+  <bean id="discovery" class="org.apache.camel.impl.cloud.StaticServiceDiscovery">
+    <property name="servers" value="localhost:9090,localhost:9091"/>
+  </bean>
+
+  <bean id="balancer" class="org.apache.camel.component.ribbon.cloud.RibbonLoadBalancer">
+    <constructor-arg index="0">
+      <bean class="org.apache.camel.component.ribbon.RibbonConfiguration"/>
+    </constructor-arg>
+  </bean>
+
+  <camelContext xmlns="http://camel.apache.org/schema/spring">
+
+    <!-- service call configuration to use ribbon -->
+    <serviceCallConfiguration id="ribbon" loadBalancerRef="balancer" serviceDiscoveryRef="discovery"/>
+
+    <route>
+      <from uri="direct:start"/>
+      <serviceCall name="myService"/>
+      <to uri="mock:result"/>
+    </route>
+
+    <route>
+      <from uri="jetty:http://localhost:9090"/>
+      <to uri="mock:9090"/>
+      <transform>
+        <constant>9090</constant>
+      </transform>
+    </route>
+
+    <route>
+      <from uri="jetty:http://localhost:9091"/>
+      <to uri="mock:9091"/>
+      <transform>
+        <constant>9091</constant>
+      </transform>
+    </route>
+  </camelContext>
+
+</beans>

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.xml b/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.xml
new file mode 100644
index 0000000..48ce72a
--- /dev/null
+++ b/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+         http://www.springframework.org/schema/beans
+         http://www.springframework.org/schema/beans/spring-beans.xsd
+         http://camel.apache.org/schema/spring
+         http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+  <camelContext xmlns="http://camel.apache.org/schema/spring">
+    <route>
+      <from uri="direct:start"/>
+      <serviceCall name="myService">
+        <!-- static list of servers -->
+        <staticServiceDiscovery>
+          <servers>localhost:9090,localhost:9091</servers>
+        </staticServiceDiscovery>
+
+        <!-- enable ribbon load balancer -->
+        <ribbonLoadBalancer clientName="myClient"/>
+      </serviceCall>
+      <to uri="mock:result"/>
+    </route>
+
+    <route>
+      <from uri="jetty:http://localhost:9090"/>
+      <to uri="mock:9090"/>
+      <transform>
+        <constant>9090</constant>
+      </transform>
+    </route>
+
+    <route>
+      <from uri="jetty:http://localhost:9091"/>
+      <to uri="mock:9091"/>
+      <transform>
+        <constant>9091</constant>
+      </transform>
+    </route>
+  </camelContext>
+
+</beans>

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/processor/SpringRibbonServiceCallRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/processor/SpringRibbonServiceCallRouteTest.xml b/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/processor/SpringRibbonServiceCallRouteTest.xml
deleted file mode 100644
index 6b2df8d..0000000
--- a/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/processor/SpringRibbonServiceCallRouteTest.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    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.
--->
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="
-       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
-    ">
-
-  <!-- setup a static ribbon server list with these 2 servers to start with -->
-  <!-- call the build method with the argument below -->
-  <bean id="servers" class="org.apache.camel.component.ribbon.processor.RibbonServiceCallStaticServerListStrategy"
-        factory-method="build">
-    <constructor-arg index="0" value="localhost:9090,localhost:9091"/>
-  </bean>
-
-  <camelContext xmlns="http://camel.apache.org/schema/spring">
-
-    <!-- service call configuration to use ribbon -->
-    <ribbonConfiguration id="ribbon" serverListStrategyRef="servers"/>
-
-    <route>
-      <from uri="direct:start"/>
-      <serviceCall name="myService"/>
-      <to uri="mock:result"/>
-    </route>
-
-    <route>
-      <from uri="jetty:http://localhost:9090"/>
-      <to uri="mock:9090"/>
-      <transform>
-        <constant>9090</constant>
-      </transform>
-    </route>
-
-    <route>
-      <from uri="jetty:http://localhost:9091"/>
-      <to uri="mock:9091"/>
-      <transform>
-        <constant>9091</constant>
-      </transform>
-    </route>
-  </camelContext>
-
-</beans>

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/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
new file mode 100644
index 0000000..194f518
--- /dev/null
+++ b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudDiscoveryClient.java
@@ -0,0 +1,83 @@
+/**
+ * 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.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+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 Map<String, List<ServiceInstance>> services;
+    private ServiceInstance localInstance;
+
+    public CamelCloudDiscoveryClient(String description) {
+        this(description, Collections.emptyMap());
+    }
+
+    public CamelCloudDiscoveryClient(String description, Map<String, List<ServiceInstance>> services) {
+        this.description = description;
+        this.services = new LinkedHashMap<>(services);
+        this.localInstance = null;
+    }
+
+    @Override
+    public String description() {
+        return description;
+    }
+
+    @Override
+    public ServiceInstance getLocalServiceInstance() {
+        return this.localInstance;
+    }
+
+    @Override
+    public List<ServiceInstance> getInstances(String serviceId) {
+        return services.get(serviceId);
+    }
+
+    @Override
+    public List<String> getServices() {
+        return new ArrayList<>(services.keySet());
+    }
+
+    public CamelCloudDiscoveryClient addServiceInstance(ServiceInstance instance) {
+        services.computeIfAbsent(instance.getServiceId(), key -> new LinkedList<>()).add(instance);
+        return this;
+    }
+
+    public CamelCloudDiscoveryClient addServiceInstance(String serviceId, String host, int port) {
+        return addServiceInstance(new DefaultServiceInstance(serviceId, host, port, false));
+    }
+
+    public CamelCloudDiscoveryClient setLocalServiceInstance(ServiceInstance instance) {
+        this.localInstance = instance;
+        return this;
+    }
+
+    public CamelCloudDiscoveryClient setLocalServiceInstance(String serviceId, String host, int port) {
+        return setLocalServiceInstance(new DefaultServiceInstance(serviceId, host, port, false));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/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
new file mode 100644
index 0000000..08a73b8
--- /dev/null
+++ b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudLoadBalancer.java
@@ -0,0 +1,71 @@
+/**
+ * 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.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.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(new DefaultServiceDefinition(i.getServiceId(), i.getHost(), i.getPort(), i.getMetadata()))
+        );
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/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
new file mode 100644
index 0000000..3896494
--- /dev/null
+++ b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelCloudServiceDiscovery.java
@@ -0,0 +1,52 @@
+/**
+ * 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.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.camel.cloud.ServiceDefinition;
+import org.apache.camel.impl.cloud.DefaultServiceDefinition;
+import org.apache.camel.impl.cloud.DefaultServiceDiscovery;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+
+public class CamelCloudServiceDiscovery extends DefaultServiceDiscovery {
+    private final List<DiscoveryClient> clients;
+
+    public CamelCloudServiceDiscovery(List<DiscoveryClient> clients) {
+        this.clients = new ArrayList<>(clients);
+    }
+
+    @Override
+    public List<ServiceDefinition> getInitialListOfServices(String name) {
+        return getServers(name);
+    }
+
+    @Override
+    public List<ServiceDefinition> getUpdatedListOfServices(String name) {
+        return getServers(name);
+    }
+
+    private List<ServiceDefinition> getServers(String name) {
+        return clients.stream()
+            .flatMap(c -> c.getInstances(name).stream())
+            .map(s -> new DefaultServiceDefinition(s.getServiceId(), s.getHost(), s.getPort(), s.getMetadata()))
+            .collect(Collectors.toList());
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallConfigurationProperties.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallConfigurationProperties.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallConfigurationProperties.java
new file mode 100644
index 0000000..dd1124e
--- /dev/null
+++ b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallConfigurationProperties.java
@@ -0,0 +1,113 @@
+/**
+ * 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.Map;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix = "camel.cloud.servicecall")
+public class ServiceCallConfigurationProperties {
+    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, String> services = new HashMap<>();
+
+        public boolean isEnabled() {
+            return enabled;
+        }
+
+        public void setEnabled(boolean enabled) {
+            this.enabled = enabled;
+        }
+
+        public Map<String, String> getServices() {
+            return services;
+        }
+    }
+
+    public static class ServiceFilter {
+        private boolean enabled = true;
+
+        public boolean isEnabled() {
+            return enabled;
+        }
+
+        public void setEnabled(boolean enabled) {
+            this.enabled = enabled;
+        }
+    }
+
+    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/a811f400/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallLoadBalancerAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallLoadBalancerAutoConfiguration.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallLoadBalancerAutoConfiguration.java
new file mode 100644
index 0000000..32b66d2
--- /dev/null
+++ b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallLoadBalancerAutoConfiguration.java
@@ -0,0 +1,54 @@
+/**
+ * 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.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;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.context.annotation.Scope;
+
+@Configuration
+@ConditionalOnBean({ CamelCloudAutoConfiguration.class, LoadBalancerClient.class })
+@AutoConfigureAfter(LoadBalancerAutoConfiguration.class)
+@EnableConfigurationProperties(ServiceCallConfigurationProperties.class)
+public class ServiceCallLoadBalancerAutoConfiguration {
+    @Lazy
+    @Scope("prototype")
+    @Bean(name = "cloud-load-balancer")
+    @Conditional(ServiceCallLoadBalancerAutoConfiguration.LoadBalancerCondition.class)
+    public LoadBalancer cloudLoadBalancer(LoadBalancerClient loadBalancerClient) {
+        return new CamelCloudLoadBalancer(loadBalancerClient);
+    }
+
+    public static class LoadBalancerCondition extends GroupCondition {
+        public LoadBalancerCondition() {
+            super(
+                "camel.cloud.servicecall",
+                "camel.cloud.servicecall.load-balancer"
+            );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallServiceChooserAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallServiceChooserAutoConfiguration.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallServiceChooserAutoConfiguration.java
new file mode 100644
index 0000000..dae38a0
--- /dev/null
+++ b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallServiceChooserAutoConfiguration.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.ServiceChooser;
+import org.apache.camel.impl.cloud.RandomServiceChooser;
+import org.apache.camel.impl.cloud.RoundRobinServiceChooser;
+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.Bean;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.context.annotation.Scope;
+import org.springframework.core.annotation.Order;
+
+@Configuration
+@ConditionalOnBean(CamelCloudAutoConfiguration.class)
+@EnableConfigurationProperties(ServiceCallConfigurationProperties.class)
+public class ServiceCallServiceChooserAutoConfiguration {
+
+    @Lazy
+    @Scope("prototype")
+    @Order(1)
+    @Bean(name = "round-robin-service-chooser")
+    @Conditional(ServiceCallServiceChooserAutoConfiguration.ServiceChooserCondition.class)
+    public ServiceChooser roundRobinLoadBalancer() {
+        return new RoundRobinServiceChooser();
+    }
+
+    @Lazy
+    @Scope("prototype")
+    @Order(2)
+    @Bean(name = "random-service-chooser")
+    @Conditional(ServiceCallServiceChooserAutoConfiguration.ServiceChooserCondition.class)
+    public ServiceChooser randomLoadBalancer() {
+        return new RandomServiceChooser();
+    }
+
+    public static class ServiceChooserCondition extends GroupCondition {
+        public ServiceChooserCondition() {
+            super(
+                "camel.cloud.servicecall",
+                "camel.cloud.servicecall.service-chooser"
+            );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallServiceDiscoveryAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallServiceDiscoveryAutoConfiguration.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallServiceDiscoveryAutoConfiguration.java
new file mode 100644
index 0000000..4934465
--- /dev/null
+++ b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallServiceDiscoveryAutoConfiguration.java
@@ -0,0 +1,75 @@
+/**
+ * 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.cloud.ServiceDiscovery;
+import org.apache.camel.spring.boot.util.GroupCondition;
+import org.apache.camel.util.StringHelper;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.context.annotation.Scope;
+
+@Configuration
+@EnableConfigurationProperties(ServiceCallConfigurationProperties.class)
+public class ServiceCallServiceDiscoveryAutoConfiguration {
+    @Lazy
+    @Scope("prototype")
+    @Bean(name = "service-discovery-client")
+    @Conditional(ServiceCallServiceDiscoveryAutoConfiguration.ServiceDiscoveryCondition.class)
+    public DiscoveryClient serviceDiscoveryClient(ServiceCallConfigurationProperties properties) {
+        CamelCloudDiscoveryClient client = new CamelCloudDiscoveryClient("service-discovery-client");
+
+        Map<String, String> services = properties.getServiceDiscovery().getServices();
+        for (Map.Entry<String, String> entry : services.entrySet()) {
+
+            String[] parts = entry.getValue().split(",");
+            for (String part : parts) {
+                String host = StringHelper.before(part, ":");
+                String port = StringHelper.after(part, ":");
+
+                client.addServiceInstance(entry.getKey(), host, Integer.parseInt(port));
+            }
+        }
+
+        return client;
+    }
+
+    @Lazy
+    @Scope("prototype")
+    @Bean(name = "service-discovery")
+    @Conditional(ServiceCallServiceDiscoveryAutoConfiguration.ServiceDiscoveryCondition.class)
+    public ServiceDiscovery serviceDiscovery(List<DiscoveryClient> clients) {
+        return new CamelCloudServiceDiscovery(clients);
+    }
+
+    public static class ServiceDiscoveryCondition extends GroupCondition {
+        public ServiceDiscoveryCondition() {
+            super(
+                "camel.cloud.servicecall",
+                "camel.cloud.servicecall.service-discovery"
+            );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallServiceFilterAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallServiceFilterAutoConfiguration.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallServiceFilterAutoConfiguration.java
new file mode 100644
index 0000000..d97c7d1
--- /dev/null
+++ b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/ServiceCallServiceFilterAutoConfiguration.java
@@ -0,0 +1,58 @@
+/**
+ * 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.ServiceFilter;
+import org.apache.camel.impl.cloud.AllServiceFilter;
+import org.apache.camel.impl.cloud.HealthyServiceFilter;
+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;
+import org.springframework.context.annotation.Scope;
+
+@Configuration
+@EnableConfigurationProperties(ServiceCallConfigurationProperties.class)
+public class ServiceCallServiceFilterAutoConfiguration {
+    @Lazy
+    @Scope("prototype")
+    @Bean(name = "service-filter-healthy")
+    @Conditional(ServiceCallServiceFilterAutoConfiguration.ServiceFilterCondition.class)
+    public ServiceFilter healthyServiceFilter() {
+        return new HealthyServiceFilter();
+    }
+
+    @Lazy
+    @Scope("prototype")
+    @Bean(name = "service-filter-all")
+    @Conditional(ServiceCallServiceFilterAutoConfiguration.ServiceFilterCondition.class)
+    public ServiceFilter allServiceFilter() {
+        return new AllServiceFilter();
+    }
+
+    public static class ServiceFilterCondition extends GroupCondition {
+        public ServiceFilterCondition() {
+            super(
+                "camel.cloud.servicecall",
+                "camel.cloud.servicecall.service-filter"
+            );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallAutoConfiguration.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallAutoConfiguration.java
deleted file mode 100644
index 4f382e7..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallAutoConfiguration.java
+++ /dev/null
@@ -1,95 +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.servicecall;
-
-import java.util.List;
-
-import org.apache.camel.impl.remote.RoundRobinServiceCallLoadBalancer;
-import org.apache.camel.spi.ServiceCallLoadBalancer;
-import org.apache.camel.spi.ServiceCallServer;
-import org.apache.camel.spi.ServiceCallServerListStrategy;
-import org.apache.camel.spring.boot.CamelAutoConfiguration;
-import org.apache.camel.spring.boot.util.GroupCondition;
-import org.apache.camel.spring.cloud.CamelCloudAutoConfiguration;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.cloud.client.discovery.DiscoveryClient;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Conditional;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.context.annotation.Scope;
-import org.springframework.core.annotation.Order;
-
-@Configuration
-@ConditionalOnBean(CamelCloudAutoConfiguration.class)
-public class CamelCloudServiceCallAutoConfiguration {
-
-    // ******************************************
-    // ServiceCall - ServerListStrategy
-    // ******************************************
-
-    @Lazy
-    @Scope("prototype")
-    @Bean(name = "server-list-strategy")
-    @ConditionalOnBean(DiscoveryClient.class)
-    @Conditional(CamelCloudServiceCallAutoConfiguration.ServerListStrategyCondition.class)
-    public ServiceCallServerListStrategy serverListStrategy(List<DiscoveryClient> clients) {
-        return new CamelCloudServiceCallServerListStrategy(clients);
-    }
-
-    public static class ServerListStrategyCondition extends GroupCondition {
-        public ServerListStrategyCondition() {
-            super(
-                "camel.cloud.servicecall",
-                "camel.cloud.servicecall.server-list-strategy"
-            );
-        }
-    }
-
-    // ******************************************
-    // ServiceCall - Load Balancer
-    // ******************************************
-
-    @Lazy
-    @Scope("prototype")
-    @Order(1)
-    @Bean(name = "round-robin-load-balancer")
-    @Conditional(CamelCloudServiceCallAutoConfiguration.LoadBalancerCondition.class)
-    public ServiceCallLoadBalancer<ServiceCallServer> roundRobinLoadBalancer() {
-        return new RoundRobinServiceCallLoadBalancer<>();
-    }
-
-    @Lazy
-    @Scope("prototype")
-    @Order(2)
-    @Bean(name = "random-load-balancer")
-    @Conditional(CamelCloudServiceCallAutoConfiguration.LoadBalancerCondition.class)
-    public ServiceCallLoadBalancer<ServiceCallServer> randomLoadBalancer() {
-        return new RoundRobinServiceCallLoadBalancer<>();
-    }
-
-    public static class LoadBalancerCondition extends GroupCondition {
-        public LoadBalancerCondition() {
-            super(
-                "camel.cloud.servicecall",
-                "camel.cloud.servicecall.load-balancer"
-            );
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallConfigurationProperties.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallConfigurationProperties.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallConfigurationProperties.java
deleted file mode 100644
index 548bcd7..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallConfigurationProperties.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.servicecall;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-@ConfigurationProperties(prefix = "camel.cloud.servicecall")
-public class CamelCloudServiceCallConfigurationProperties {
-    private boolean enabled = true;
-    private LoadBalancer loadBalancer;
-    private ServerListStrategy serverListStrategy;
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public LoadBalancer getLoadBalancer() {
-        return loadBalancer;
-    }
-
-    public void setLoadBalancer(LoadBalancer loadBalancer) {
-        this.loadBalancer = loadBalancer;
-    }
-
-    public ServerListStrategy getServerListStrategy() {
-        return serverListStrategy;
-    }
-
-    public void setServerListStrategy(ServerListStrategy serverListStrategy) {
-        this.serverListStrategy = serverListStrategy;
-    }
-
-    // *****************************************
-    // 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 ServerListStrategy {
-        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/a811f400/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallProcessor.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallProcessor.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallProcessor.java
deleted file mode 100644
index bb965ab..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallProcessor.java
+++ /dev/null
@@ -1,200 +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.servicecall;
-
-import java.io.IOException;
-
-import org.apache.camel.AsyncCallback;
-import org.apache.camel.AsyncProcessor;
-import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
-import org.apache.camel.Exchange;
-import org.apache.camel.ExchangePattern;
-import org.apache.camel.Expression;
-import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.Traceable;
-import org.apache.camel.impl.remote.DefaultServiceCallExpression;
-import org.apache.camel.impl.remote.ServiceCallConstants;
-import org.apache.camel.processor.SendDynamicProcessor;
-import org.apache.camel.spi.IdAware;
-import org.apache.camel.support.ServiceSupport;
-import org.apache.camel.util.AsyncProcessorHelper;
-import org.apache.camel.util.ObjectHelper;
-import org.apache.camel.util.ServiceHelper;
-import org.apache.camel.util.StringHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
-
-public class CamelCloudServiceCallProcessor extends ServiceSupport implements AsyncProcessor, CamelContextAware, Traceable, IdAware {
-    private static final Logger LOG = LoggerFactory.getLogger(CamelCloudServiceCallProcessor.class);
-
-    private final ExchangePattern exchangePattern;
-    private final String name;
-    private final String scheme;
-    private final String uri;
-    private final String contextPath;
-    private final LoadBalancerClient loadBalancerClient;
-    private CamelContext camelContext;
-    private String id;
-    private Expression serviceCallExpression;
-    private SendDynamicProcessor processor;
-
-    public CamelCloudServiceCallProcessor(String name, String scheme, String uri, ExchangePattern exchangePattern, LoadBalancerClient loadBalancerClient) {
-        this.uri = uri;
-        this.exchangePattern = exchangePattern;
-        this.loadBalancerClient = loadBalancerClient;
-
-        // setup from the provided name which can contain scheme and context-path information as well
-        String serviceName;
-        if (name.contains("/")) {
-            serviceName = StringHelper.before(name, "/");
-            this.contextPath = StringHelper.after(name, "/");
-        } else if (name.contains("?")) {
-            serviceName = StringHelper.before(name, "?");
-            this.contextPath = StringHelper.after(name, "?");
-        } else {
-            serviceName = name;
-            this.contextPath = null;
-        }
-        if (serviceName.contains(":")) {
-            this.scheme = StringHelper.before(serviceName, ":");
-            this.name = StringHelper.after(serviceName, ":");
-        } else {
-            this.scheme = scheme;
-            this.name = serviceName;
-        }
-
-        this.serviceCallExpression = new DefaultServiceCallExpression(
-            this.name,
-            this.scheme,
-            this.contextPath,
-            this.uri);
-    }
-
-    @Override
-    public CamelContext getCamelContext() {
-        return camelContext;
-    }
-
-    @Override
-    public void setCamelContext(CamelContext camelContext) {
-        this.camelContext = camelContext;
-    }
-
-    @Override
-    public String getId() {
-        return id;
-    }
-
-    @Override
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    @Override
-    public String getTraceLabel() {
-        return id;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getScheme() {
-        return scheme;
-    }
-
-    public String getContextPath() {
-        return contextPath;
-    }
-
-    public String getUri() {
-        return uri;
-    }
-
-    public ExchangePattern getExchangePattern() {
-        return exchangePattern;
-    }
-
-    public void setServiceCallExpression(Expression serviceCallExpression) {
-        this.serviceCallExpression = serviceCallExpression;
-    }
-
-    public Expression getServiceCallExpression() {
-        return serviceCallExpression;
-    }
-
-    public CamelCloudServiceCallProcessor serviceCallExpression(Expression serviceCallExpression) {
-        setServiceCallExpression(serviceCallExpression);
-        return this;
-    }
-
-    public AsyncProcessor getProcessor() {
-        return processor;
-    }
-
-    @Override
-    protected void doStart() throws Exception {
-        StringHelper.notEmpty(getName(), "name", "serviceName");
-        ObjectHelper.notNull(camelContext, "camelContext");
-        ObjectHelper.notNull(serviceCallExpression, "serviceCallExpression");
-        ObjectHelper.notNull(loadBalancerClient, "loadBalancerClient");
-
-        LOG.info("ServiceCall with service name: {}", name);
-
-        processor = new SendDynamicProcessor(uri, serviceCallExpression);
-        processor.setCamelContext(getCamelContext());
-        if (exchangePattern != null) {
-            processor.setPattern(exchangePattern);
-        }
-
-        ServiceHelper.startServices(processor);
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-    }
-
-    @Override
-    public void process(Exchange exchange) throws Exception {
-        AsyncProcessorHelper.process(this, exchange);
-    }
-
-    @Override
-    public boolean process(final Exchange exchange, final AsyncCallback callback) {
-        if (exchange.getException() != null) {
-            callback.done(true);
-            return true;
-        }
-
-        try {
-            return loadBalancerClient.execute(
-                exchange.getIn().getHeader(ServiceCallConstants.SERVICE_NAME, name, String.class),
-                instance -> {
-                    exchange.getIn().setHeader(ServiceCallConstants.SERVER_IP, instance.getHost());
-                    exchange.getIn().setHeader(ServiceCallConstants.SERVER_PORT, instance.getPort());
-                    exchange.getIn().setHeader(ServiceCallConstants.SERVICE_NAME, instance.getServiceId());
-                    return processor.process(exchange, callback);
-                }
-            );
-        } catch (IOException e) {
-            throw new RuntimeCamelException(e);
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallProcessorFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallProcessorFactory.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallProcessorFactory.java
deleted file mode 100644
index 2db3ffe..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallProcessorFactory.java
+++ /dev/null
@@ -1,201 +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.servicecall;
-
-import java.util.Set;
-import java.util.function.Supplier;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.ExchangePattern;
-import org.apache.camel.Processor;
-import org.apache.camel.impl.remote.AbstractServiceCallProcessorFactory;
-import org.apache.camel.impl.remote.DefaultServiceCallProcessor;
-import org.apache.camel.model.remote.ServiceCallConfigurationDefinition;
-import org.apache.camel.model.remote.ServiceCallDefinition;
-import org.apache.camel.spi.RouteContext;
-import org.apache.camel.spi.ServiceCallLoadBalancer;
-import org.apache.camel.spi.ServiceCallServer;
-import org.apache.camel.spi.ServiceCallServerListStrategy;
-import org.apache.camel.util.CamelContextHelper;
-import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
-
-public class CamelCloudServiceCallProcessorFactory extends AbstractServiceCallProcessorFactory {
-    @Override
-    protected Processor createProcessor(RouteContext routeContext, ServiceCallDefinition definition) throws Exception {
-        String name = definition.getName();
-        String uri = definition.getUri();
-        ExchangePattern mep = definition.getPattern();
-        CamelContext camelContext = routeContext.getCamelContext();
-
-        ServiceCallConfigurationDefinition config = definition.getServiceCallConfiguration();
-        ServiceCallConfigurationDefinition configRef = null;
-        if (definition.getServiceCallConfigurationRef() != null) {
-            // lookup in registry first
-            configRef = CamelContextHelper.lookup(camelContext, definition.getServiceCallConfigurationRef(), ServiceCallConfigurationDefinition.class);
-            if (configRef == null) {
-                // and fallback as service configuration
-                camelContext.getServiceCallConfiguration(definition.getServiceCallConfigurationRef(), ServiceCallConfigurationDefinition.class);
-            }
-        }
-
-        // if no configuration explicit configured then use default
-        if (config == null && configRef == null) {
-            config = camelContext.getServiceCallConfiguration(null, ServiceCallConfigurationDefinition.class);
-        }
-        if (config == null) {
-            // if no default then try to find if there configuration in the registry of the given type
-            Set<ServiceCallConfigurationDefinition> set = camelContext.getRegistry().findByType(ServiceCallConfigurationDefinition.class);
-            if (set.size() == 1) {
-                config = set.iterator().next();
-            }
-        }
-
-
-        //if (config == null && configRef == null) {
-        //    throw new IllegalStateException("The ServiceCall: " + definition + " must be configured before it can be used.");
-        //}
-
-        String component = definition.getComponent();
-        if (component == null) {
-            component = config != null ? config.getComponent() : null;
-            if (component == null && configRef != null) {
-                component = configRef.getComponent();
-            }
-        }
-
-        // lookup the load balancer to use (configured on EIP takes precedence vs configured on configuration)
-        Object lb = retrieveLoadBalancer(camelContext, definition, config, configRef);
-        if (lb == null) {
-            throw new IllegalArgumentException("Load balancer must be provided");
-        }
-
-        if (lb instanceof LoadBalancerClient) {
-            return new CamelCloudServiceCallProcessor(name, uri, component, mep, (LoadBalancerClient) lb);
-        } else if (lb instanceof ServiceCallLoadBalancer) {
-
-            ServiceCallServerListStrategy<ServiceCallServer> sl = retrieveServerListStrategy(camelContext, definition, config, configRef);
-            if (lb == null) {
-                throw new IllegalArgumentException("Server list strategy must be provided");
-            }
-
-            DefaultServiceCallProcessor<ServiceCallServer> processor = new DefaultServiceCallProcessor<>(name, component, uri, mep);
-            processor.setLoadBalancer((ServiceCallLoadBalancer<ServiceCallServer>)lb);
-            processor.setServerListStrategy(sl);
-
-            return processor;
-        } else {
-            throw new IllegalStateException(
-                "Unable to configure ServiceCall: LoadBalancer should be an instance of LoadBalancerClient or ServiceCallLoadBalancer, got " + lb.getClass().getName()
-            );
-        }
-    }
-
-    // *************************************************************************
-    // Load Balancer
-    // *************************************************************************
-
-    private Object retrieveLoadBalancer(
-        CamelContext camelContext, ServiceCallDefinition definition, ServiceCallConfigurationDefinition config, ServiceCallConfigurationDefinition configRef) {
-
-        // lookup the load balancer to use (configured on EIP takes precedence vs configured on configuration)
-        Object lb = retrieveLoadBalancer(camelContext, definition::getLoadBalancer, definition::getLoadBalancerRef);
-        if (lb == null && config != null) {
-            lb = retrieveLoadBalancer(camelContext, config::getLoadBalancer, config::getLoadBalancerRef);
-        }
-        if (lb == null && configRef != null) {
-            lb = retrieveLoadBalancer(camelContext, configRef::getLoadBalancer, configRef::getLoadBalancerRef);
-        }
-
-        if (lb == null) {
-            Set<LoadBalancerClient> set = camelContext.getRegistry().findByType(LoadBalancerClient.class);
-            if (set.size() == 1) {
-                lb = set.iterator().next();
-            }
-        }
-
-        return lb;
-    }
-
-    private Object retrieveLoadBalancer(
-        CamelContext camelContext, Supplier<Object> loadBalancerSupplier, Supplier<String> loadBalancerRefSupplier) {
-
-        Object lb = null;
-
-        if (loadBalancerSupplier != null) {
-            lb = loadBalancerSupplier.get();
-        }
-
-        if (lb == null && loadBalancerRefSupplier != null) {
-            String ref = loadBalancerRefSupplier.get();
-            if (ref != null) {
-                lb = CamelContextHelper.lookup(camelContext, ref, LoadBalancerClient.class);
-            }
-            if (ref != null && lb == null) {
-                lb = CamelContextHelper.lookup(camelContext, ref, ServiceCallLoadBalancer.class);
-            }
-        }
-
-        return lb;
-    }
-
-    // *************************************************************************
-    // Server List
-    // *************************************************************************
-
-
-    private ServiceCallServerListStrategy retrieveServerListStrategy(
-        CamelContext camelContext, ServiceCallDefinition definition, ServiceCallConfigurationDefinition config, ServiceCallConfigurationDefinition configRef) {
-
-        // lookup the server list strategy to use (configured on EIP takes precedence vs configured on configuration)
-        ServiceCallServerListStrategy sl = retrieveServerListStrategy(camelContext, definition::getServerListStrategy, definition::getServerListStrategyRef);
-        if (sl == null && config != null) {
-            sl = retrieveServerListStrategy(camelContext, config::getServerListStrategy, config::getServerListStrategyRef);
-        }
-        if (sl == null && configRef != null) {
-            sl = retrieveServerListStrategy(camelContext, configRef::getServerListStrategy, configRef::getServerListStrategyRef);
-        }
-
-        if (sl == null) {
-            Set<ServiceCallServerListStrategy> set = camelContext.getRegistry().findByType(ServiceCallServerListStrategy.class);
-            if (set.size() == 1) {
-                sl = set.iterator().next();
-            }
-        }
-
-        return sl;
-    }
-
-    private ServiceCallServerListStrategy retrieveServerListStrategy(
-        CamelContext camelContext, Supplier<ServiceCallServerListStrategy> serverListSupplier, Supplier<String> serverListSupplierRef) {
-
-        ServiceCallServerListStrategy sl = null;
-
-        if (serverListSupplier != null) {
-            sl = serverListSupplier.get();
-        }
-
-        if (sl == null && serverListSupplierRef != null) {
-            String ref = serverListSupplierRef.get();
-            if (ref != null) {
-                sl = CamelContextHelper.lookup(camelContext, ref, ServiceCallServerListStrategy.class);
-            }
-        }
-
-        return sl;
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallServerListStrategy.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallServerListStrategy.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallServerListStrategy.java
deleted file mode 100644
index 3f30b6c..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/servicecall/CamelCloudServiceCallServerListStrategy.java
+++ /dev/null
@@ -1,52 +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.servicecall;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.apache.camel.impl.remote.DefaultServiceCallServer;
-import org.apache.camel.impl.remote.DefaultServiceCallServerListStrategy;
-import org.apache.camel.spi.ServiceCallServer;
-import org.springframework.cloud.client.discovery.DiscoveryClient;
-
-public class CamelCloudServiceCallServerListStrategy extends DefaultServiceCallServerListStrategy<ServiceCallServer> {
-    private final List<DiscoveryClient> clients;
-
-    public CamelCloudServiceCallServerListStrategy(List<DiscoveryClient> clients) {
-        this.clients = new ArrayList<>(clients);
-    }
-
-    @Override
-    public List<ServiceCallServer> getInitialListOfServers(String name) {
-        return getServers(name);
-    }
-
-    @Override
-    public List<ServiceCallServer> getUpdatedListOfServers(String name) {
-        return getServers(name);
-    }
-
-    private List<ServiceCallServer> getServers(String name) {
-        return clients.stream()
-            .flatMap(c -> c.getInstances(name).stream())
-            .map(s -> new DefaultServiceCallServer(s.getHost(), s.getPort(), s.getMetadata()))
-            .collect(Collectors.toList());
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/components/camel-spring-cloud/src/main/resources/META-INF/services/org/apache/camel/model/ServiceCallDefinition
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/resources/META-INF/services/org/apache/camel/model/ServiceCallDefinition b/components/camel-spring-cloud/src/main/resources/META-INF/services/org/apache/camel/model/ServiceCallDefinition
deleted file mode 100644
index c5f036b..0000000
--- a/components/camel-spring-cloud/src/main/resources/META-INF/services/org/apache/camel/model/ServiceCallDefinition
+++ /dev/null
@@ -1,18 +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.
-#
-
-class=org.apache.camel.spring.cloud.servicecall.CamelCloudServiceCallProcessorFactory

http://git-wip-us.apache.org/repos/asf/camel/blob/a811f400/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 429fa52..d925094 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
@@ -17,4 +17,6 @@
 
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
 org.apache.camel.spring.cloud.CamelCloudAutoConfiguration,\
-org.apache.camel.spring.cloud.servicecall.CamelCloudServiceCallAutoConfiguration
+org.apache.camel.spring.cloud.ServiceCallServiceChooserAutoConfiguration,\
+org.apache.camel.spring.cloud.ServiceCallServiceDiscoveryAutoConfiguration,\
+org.apache.camel.spring.cloud.ServiceCallLoadBalancerAutoConfiguration