前端做网站,wordpress模板游戏推广,手机端制作游戏的app,江苏市场监督管理局appapache camel在此示例中#xff0c;我们将向您展示如何使用Apache Camel作为系统的负载平衡器。 在计算机世界中#xff0c;负载平衡器是一种充当反向代理并在许多服务器之间分配网络或应用程序流量的设备。 负载平衡器用于增加容量#xff08;并发用户#xff09;和应用程… apache camel 在此示例中我们将向您展示如何使用Apache Camel作为系统的负载平衡器。 在计算机世界中负载平衡器是一种充当反向代理并在许多服务器之间分配网络或应用程序流量的设备。 负载平衡器用于增加容量并发用户和应用程序的可靠性。 借助Camel我们可以立即制作自己的软件负载平衡器。 享受骑行 负载平衡不是《企业集成模式》一书中的单独模式就像克劳斯·易卜生所说的那样如果本书有第二版的话但是骆驼把它当作另一个EIP对待。 尽管Camel语法使负载平衡看起来非常容易但这仍然是一个复杂的话题您应该花一些时间在设计阶段规划合适的策略。 Camel带有许多内置的负载平衡策略。 在此示例中我们介绍了其中一些更常用的方法。 本文的代码使用Maven 3.3.9Eclipse Mars 4.5.0和Apache Camel 2.17.1。 请注意自2.15版本以来负载平衡器API有所更改如果您要使用Camel的早期版本请查阅文档。 此示例源代码中的所有类都使用Test带注释的方法因此您必须将它们作为JUnit测试运行并希望看到绿色的条。 1.创建基础项目 在继续编写实际代码之前首先要在Eclipse中创建一个Maven项目。 首先选择File- New…- new project。 键入maven并选择Maven项目。 创建一个新的Maven项目 在下一个窗口中检查创建简单项目选项然后单击下一步 创建一个简单的Maven项目 最后添加以下配置然后单击完成 配置Maven项目 现在编辑pom.xml文件如下所示 pom.xml project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd
modelVersion4.0.0/modelVersion
groupIdcom.javacodegeeks/groupId
artifactIdcamelLoadBalancer/artifactId
version1.0.0-SNAPSHOT/versiondependenciesdependencygroupIdorg.apache.camel/groupIdartifactIdcamel-core/artifactIdversion2.17.1/version/dependencydependencygroupIdorg.apache.camel/groupIdartifactIdcamel-test/artifactIdversion2.17.1/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version/dependency/dependencies
/project2.负载均衡 我们提到了骆驼支持的不同政策但是什么是政策 策略定义工作负载如何在不同的接收方处理器消费者服务…之间分配。 在本文中我们播出了随机轮循及其加权对应项和主题策略的示例。 最后我们向您展示如何制定自己的政策。 随机 负载平衡策略的最简单形式是随机的。 顾名思义您只需定义应处理负载的端点然后Camel即可随机决定使用哪个端点。 这是实现随机策略的代码。 m1m2和m3是处理消息的端点。 终结点始终会收到该消息但是每次运行该类时都会使用上述终结点之一。 这种选择是完全随机的您可以通过添加自己的断言来检查这种随机性。 RandomLoadBalance.java package com.jcg;import org.apache.camel.EndpointInject;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;public class RandomLoadBalance extends CamelTestSupport{EndpointInject(urimock:m1)MockEndpoint m1;EndpointInject(urimock:m2)MockEndpoint m2;EndpointInject(urimock:m3)MockEndpoint m3;EndpointInject(urimock:end)MockEndpoint end;Overrideprotected RouteBuilder createRouteBuilder() throws Exception{return new RouteBuilder(){Overridepublic void configure() throws Exception {from(direct:start).loadBalance().random().to(m1,m2,m3).end().to(end);}};}Testpublic void testSending() throws Exception{end.expectedMessageCount(1);template.sendBody(direct:start, );end.assertIsSatisfied();}
}轮循 轮询是负载平衡的另一种简单类型。 在此策略中依次依次使用端点。 在示例代码中您会看到消息通过m1m2m3并再次通过m1。 RoundRobinLoadBalance.java package com.jcg;import javax.naming.Context;
import org.apache.camel.EndpointInject;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.dataset.SimpleDataSet;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;public class RoundRobinLoadBalance extends CamelTestSupport{EndpointInject(urimock:m1)MockEndpoint m1;EndpointInject(urimock:m2)MockEndpoint m2;EndpointInject(urimock:m3)MockEndpoint m3;EndpointInject(urimock:end)MockEndpoint end;Overrideprotected RouteBuilder createRouteBuilder() throws Exception{return new RouteBuilder(){Overridepublic void configure() throws Exception {from(dataset:start).loadBalance().roundRobin().to(m1,m2,m3).end().to(end);}};}Overrideprotected Context createJndiContext() throws Exception{SimpleDataSet sds new SimpleDataSet();sds.setSize(4);Context context super.createJndiContext();context.bind(start, sds);return context;}Testpublic void testSending() throws Exception{ m1.expectedMessageCount(2);m2.expectedMessageCount(1);m3.expectedMessageCount(1);end.expectedMessageCount(4);template.sendBody(dataset:start, );m1.assertIsSatisfied();m2.assertIsSatisfied();m3.assertIsSatisfied();end.assertIsSatisfied();}
}加权轮循 在现实世界中很少有相同的计算机可以满足您的请求。 因此拥有一台可能更强大的机器比其他机器做更多的工作有意义。 加权循环和加权随机分别是循环策略和随机策略的更复杂对应物。 使用加权轮询或随机轮询您可以细粒度地控制负载平衡。 这里我们举一个加权轮循的例子。 加权随机是相同的。 weight方法有两个参数。 首先是一个布尔值它定义策略是循环true还是随机false。 第二个参数是一个字符串它定义相应端点的分配比率。 这里的“ 2,1”表示m1接收到的流量是m2接收到的流量的两倍。 在早期版本的Camel中您必须使用整数列表。 WeightedRoundRobinLoadBalance.java package com.jcg;import javax.naming.Context;
import org.apache.camel.EndpointInject;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.dataset.SimpleDataSet;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;public class WeightedRoundRobinLoadBalance extends CamelTestSupport{EndpointInject(urimock:m1)MockEndpoint m1;EndpointInject(urimock:m2)MockEndpoint m2;EndpointInject(urimock:end)MockEndpoint end;Overrideprotected RouteBuilder createRouteBuilder() throws Exception{return new RouteBuilder(){Overridepublic void configure() throws Exception {// first argument of weighted method is a boolean defines if the policy is// Round robin (true) or Random (false)from(dataset:start).loadBalance().weighted(true,2,1).to(m1,m2).end().to(end);}};}Overrideprotected Context createJndiContext() throws Exception{SimpleDataSet sds new SimpleDataSet();sds.setSize(6);Context context super.createJndiContext();context.bind(start, sds);return context;}Testpublic void testSending() throws Exception{m1.expectedMessageCount(4);m2.expectedMessageCount(2);end.expectedMessageCount(6);template.sendBody(dataset:start, );m1.assertIsSatisfied();m2.assertIsSatisfied();end.assertIsSatisfied();}
}话题 主题从根本上不同于其他策略因为所有端点都接收到该消息。 在我们的示例代码m1m2和m3中全部处理5条消息并且端点也接收5条消息。 主题对于防止端点故障很有用。 TopicLoadBalance.java package com.jcg;import javax.naming.Context;
import org.apache.camel.EndpointInject;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.dataset.SimpleDataSet;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;public class TopicLoadBalance extends CamelTestSupport{EndpointInject(urimock:m1)MockEndpoint m1;EndpointInject(urimock:m2)MockEndpoint m2;EndpointInject(urimock:m3)MockEndpoint m3;EndpointInject(urimock:end)MockEndpoint end;Overrideprotected RouteBuilder createRouteBuilder() throws Exception{return new RouteBuilder(){Overridepublic void configure() throws Exception {from(dataset:start).loadBalance().topic().to(m1,m2,m3).end().to(end);}};}Overrideprotected Context createJndiContext() throws Exception{SimpleDataSet sds new SimpleDataSet();sds.setSize(5);Context context super.createJndiContext();context.bind(start, sds);return context;}Testpublic void testSending() throws Exception{ m1.expectedMessageCount(5);m2.expectedMessageCount(5);m3.expectedMessageCount(5);end.expectedMessageCount(5);template.sendBody(dataset:start, );m1.assertIsSatisfied();m2.assertIsSatisfied();m3.assertIsSatisfied();end.assertIsSatisfied();}
}自定义负载均衡器 骆驼提供了许多有用的策略但是总有一些策略无法满足您的需求。 在这种情况下您必须定义自己的负载平衡策略但Camel不会让您感到孤独。 自定义负载平衡器使您可以轻松定义自己的策略。 在示例代码中我们定义了一个负载均衡器用于检查消息头“ sessionID”字段。 如果是偶数则将其发送到m1如果是m2则将其发送给m1。 当然这是一个不现实的示例但是我们故意简化了能够专注于负载平衡实现而又没有业务逻辑混乱的情况。 首先我们创建一个扩展LoadBalancerSupport类并覆盖处理方法的类。 然后我们将此类的实例传递给loadBalance方法。 SessionChecker.java package com.jcg;import org.apache.camel.AsyncCallback;
import org.apache.camel.Exchange;
import org.apache.camel.processor.loadbalancer.LoadBalancerSupport;public class SessionChecker extends LoadBalancerSupport{Overridepublic boolean process(Exchange exchange, AsyncCallback callback) {int id exchange.getIn().getHeader(sessionID, Integer.class);try{if(id%2 0){getProcessors().get(0).process(exchange);} else{getProcessors().get(1).process(exchange);}}catch(Exception e){e.printStackTrace();}callback.done(true);return true;}
} CustomLoadBalance.java package com.jcg;import java.util.HashMap;
import java.util.Map;
import javax.naming.Context;
import org.apache.camel.EndpointInject;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.dataset.SimpleDataSet;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;public class CustomLoadBalance extends CamelTestSupport{EndpointInject(urimock:m1)MockEndpoint m1;EndpointInject(urimock:m2)MockEndpoint m2;EndpointInject(urimock:end)MockEndpoint end;Overrideprotected RouteBuilder createRouteBuilder() throws Exception{return new RouteBuilder(){Overridepublic void configure() throws Exception {from(dataset:start).loadBalance(new SessionChecker()).to(m1,m2).end().to(end);}};}Overrideprotected Context createJndiContext() throws Exception{SimpleDataSet sds new SimpleDataSet();MapString, Object headers new HashMap();headers.put(sessionID, 1);sds.setDefaultHeaders(headers);sds.setSize(2);Context context super.createJndiContext();context.bind(start, sds);return context;}Testpublic void testSending() throws Exception{ m1.expectedMessageCount(0);m2.expectedMessageCount(2);end.expectedMessageCount(2);template.sendBody(dataset:start, );m1.assertIsSatisfied();m2.assertIsSatisfied();end.assertIsSatisfied();}
}3.结论 骆驼负载平衡还有更多。 我们没有涵盖诸如故障转移粘性和断路器之类的策略。 实际上骆驼不仅限于此。 您可以在更多情况下使用负载平衡例如客户端和服务器之间的HTTP代理。 4.下载Eclipse项目 这是不同的Camel负载平衡策略的示例。 下载 您可以在此处下载此示例的完整源代码 Camel负载均衡器 翻译自: https://www.javacodegeeks.com/2016/06/load-balancing-apache-camel.htmlapache camel