CAMEL-9683: Started on camel-ribbon
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/da936819 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/da936819 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/da936819 Branch: refs/heads/remoteServiceCall Commit: da9368198555770e29d4899ae0f5f9172f045a5d Parents: d2495c7 Author: Claus Ibsen <davscl...@apache.org> Authored: Mon May 16 14:50:01 2016 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Mon May 23 09:27:15 2016 +0200 ---------------------------------------------------------------------- .../component/ribbon/RibbonConfiguration.java | 10 ++++++++++ .../processor/RibbonServiceCallProcessor.java | 18 +++++++++++++++++- ...bbonServiceCallStaticServerListStrategy.java | 20 ++++++++++++++++++++ .../SpringRibbonServiceCallRouteTest.xml | 2 +- 4 files changed, 48 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/da936819/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/RibbonConfiguration.java ---------------------------------------------------------------------- diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/RibbonConfiguration.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/RibbonConfiguration.java index ead659e..21c1fe9 100644 --- a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/RibbonConfiguration.java +++ b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/RibbonConfiguration.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.ribbon; +import com.netflix.loadbalancer.IPing; import com.netflix.loadbalancer.IRule; public class RibbonConfiguration { @@ -24,6 +25,7 @@ public class RibbonConfiguration { private String username; private String password; private IRule rule; + private IPing ping; public String getNamespace() { return namespace; @@ -56,4 +58,12 @@ public class RibbonConfiguration { public void setRule(IRule rule) { this.rule = rule; } + + public IPing getPing() { + return ping; + } + + public void setPing(IPing ping) { + this.ping = ping; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/da936819/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallProcessor.java ---------------------------------------------------------------------- diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallProcessor.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallProcessor.java index 290149a..ef97054 100644 --- a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallProcessor.java +++ b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallProcessor.java @@ -22,6 +22,7 @@ import java.util.concurrent.RejectedExecutionException; import com.netflix.client.config.IClientConfig; import com.netflix.client.config.IClientConfigKey; import com.netflix.loadbalancer.DummyPing; +import com.netflix.loadbalancer.IPing; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.PollingServerListUpdater; import com.netflix.loadbalancer.RoundRobinRule; @@ -67,6 +68,7 @@ public class RibbonServiceCallProcessor extends ServiceSupport implements AsyncP private ServiceCallServerListStrategy<RibbonServer> serverListStrategy; private ZoneAwareLoadBalancer<RibbonServer> ribbonLoadBalancer; private IRule rule; + private IPing ping; private final RibbonServiceCallExpression serviceCallExpression; private Map<String, String> ribbonClientConfig; private SendDynamicProcessor processor; @@ -96,6 +98,8 @@ public class RibbonServiceCallProcessor extends ServiceSupport implements AsyncP this.uri = uri; this.exchangePattern = exchangePattern; this.configuration = configuration; + this.rule = configuration.getRule(); + this.ping = configuration.getPing(); this.serviceCallExpression = new RibbonServiceCallExpression(this.name, this.scheme, this.contextPath, this.uri); } @@ -175,6 +179,14 @@ public class RibbonServiceCallProcessor extends ServiceSupport implements AsyncP this.rule = rule; } + public IPing getPing() { + return ping; + } + + public void setPing(IPing ping) { + this.ping = ping; + } + public Map<String, String> getRibbonClientConfig() { return ribbonClientConfig; } @@ -200,6 +212,10 @@ public class RibbonServiceCallProcessor extends ServiceSupport implements AsyncP // use round robin rule by default rule = new RoundRobinRule(); } + if (ping == null) { + // use dummy ping by default + ping = new DummyPing(); + } // setup client config IClientConfig config = IClientConfig.Builder.newBuilder().build(); @@ -213,7 +229,7 @@ public class RibbonServiceCallProcessor extends ServiceSupport implements AsyncP } ServerListUpdater updater = new PollingServerListUpdater(config); - ribbonLoadBalancer = new ZoneAwareLoadBalancer<>(config, rule, new DummyPing(), (ServerList<RibbonServer>) serverListStrategy, null, updater); + ribbonLoadBalancer = new ZoneAwareLoadBalancer<>(config, rule, ping, (ServerList<RibbonServer>) serverListStrategy, null, updater); LOG.info("RibbonServiceCall at namespace: {} with service name: {} is using load balancer: {} and server list: {}", namespace, name, ribbonLoadBalancer, serverListStrategy); http://git-wip-us.apache.org/repos/asf/camel/blob/da936819/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallStaticServerListStrategy.java ---------------------------------------------------------------------- diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallStaticServerListStrategy.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallStaticServerListStrategy.java index a836900..3630ac4 100644 --- a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallStaticServerListStrategy.java +++ b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/processor/RibbonServiceCallStaticServerListStrategy.java @@ -25,11 +25,22 @@ import com.netflix.loadbalancer.ServerList; import org.apache.camel.spi.ServiceCallServerListStrategy; import org.apache.camel.util.ObjectHelper; +/** + * A static list of known servers to be used by the Ribbon load balancer with the Camel Service Call EIP. + * <p/> + * You can implement custom implementations by existing this class and override the {@link #getUpdatedListOfServers()} that is called by Ribbon to refresh the known list + * of servers. For example to periodically query a remote server registry for a list of active servers. + */ public class RibbonServiceCallStaticServerListStrategy extends AbstractServerList<RibbonServer> implements ServerList<RibbonServer>, ServiceCallServerListStrategy<RibbonServer> { private IClientConfig clientConfig; private final List<RibbonServer> servers = new ArrayList<>(); + /** + * Build a {@link RibbonServiceCallStaticServerListStrategy} with the initial list of servers + * + * @param servers servers separated by comma in the format: host:port,host2:port,host3:port and so on. + */ public static RibbonServiceCallStaticServerListStrategy build(String servers) { RibbonServiceCallStaticServerListStrategy answer = new RibbonServiceCallStaticServerListStrategy(); String[] parts = servers.split(","); @@ -49,14 +60,23 @@ public class RibbonServiceCallStaticServerListStrategy extends AbstractServerLis this.servers.addAll(servers); } + /** + * Add a server to the known list of servers. + */ public void addServer(RibbonServer server) { servers.add(server); } + /** + * Add a server to the known list of servers. + */ public void addServer(String host, int port) { servers.add(new RibbonServer(host, port)); } + /** + * Remove an existing server from the list of known servers. + */ public void removeServer(String host, int port) { servers.remove(new RibbonServer(host, port)); } http://git-wip-us.apache.org/repos/asf/camel/blob/da936819/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 index 487fa0c..a06a670 100644 --- 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 @@ -36,7 +36,7 @@ <route> <from uri="direct:start"/> - <serviceCall name="myService" serviceCallConfigurationRef="myConfig"/> + <serviceCall name="myService"/> <to uri="mock:result"/> </route>