apache camel

在此示例中,我们将向您展示如何使用Apache Camel作为系统的负载平衡器。 在计算机世界中,负载平衡器是一种充当反向代理并在许多服务器之间分配网络或应用程序流量的设备。 负载平衡器用于增加容量(并发用户)和应用程序的可靠性。 借助Camel,我们可以立即制作自己的软件负载平衡器。 享受骑行!

负载平衡不是《企业集成模式》一书中的单独模式(就像克劳斯·易卜生所说的那样,如果本书有第二版的话),但是骆驼把它当作另一个EIP对待。 尽管Camel语法使负载平衡看起来非常容易,但这仍然是一个复杂的话题,您应该花一些时间在设计阶段规划合适的策略。 Camel带有许多内置的负载平衡策略。 在此示例中,我们介绍了其中一些更常用的方法。

本文的代码使用Maven 3.3.9,Eclipse 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javacodegeeks</groupId>
<artifactId>camelLoadBalancer</artifactId>
<version>1.0.0-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.camel</groupId><artifactId>camel-core</artifactId><version>2.17.1</version></dependency><dependency><groupId>org.apache.camel</groupId><artifactId>camel-test</artifactId><version>2.17.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>
</project>

2.负载均衡

我们提到了骆驼支持的不同政策,但是什么是政策? 策略定义工作负载如何在不同的接收方(处理器,消费者服务…)之间分配。 在本文中,我们播出了随机,轮循及其加权对应项和主题策略的示例。 最后,我们向您展示如何制定自己的政策。

随机

负载平衡策略的最简单形式是随机的。 顾名思义,您只需定义应处理负载的端点,然后Camel即可随机决定使用哪个端点。 这是实现随机策略的代码。 m1,m2和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(uri="mock:m1")MockEndpoint m1;@EndpointInject(uri="mock:m2")MockEndpoint m2;@EndpointInject(uri="mock:m3")MockEndpoint m3;@EndpointInject(uri="mock: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();}
}

轮循

轮询是负载平衡的另一种简单类型。 在此策略中,依次依次使用端点。 在示例代码中,您会看到消息通过m1,m2,m3并再次通过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(uri="mock:m1")MockEndpoint m1;@EndpointInject(uri="mock:m2")MockEndpoint m2;@EndpointInject(uri="mock:m3")MockEndpoint m3;@EndpointInject(uri="mock: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(uri="mock:m1")MockEndpoint m1;@EndpointInject(uri="mock:m2")MockEndpoint m2;@EndpointInject(uri="mock: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();}
}

话题

主题从根本上不同于其他策略,因为所有端点都接收到该消息。 在我们的示例代码m1,m2和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(uri="mock:m1")MockEndpoint m1;@EndpointInject(uri="mock:m2")MockEndpoint m2;@EndpointInject(uri="mock:m3")MockEndpoint m3;@EndpointInject(uri="mock: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(uri="mock:m1")MockEndpoint m1;@EndpointInject(uri="mock:m2")MockEndpoint m2;@EndpointInject(uri="mock: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();Map<String, 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.html

apache camel

apache camel_使用Apache Camel进行负载平衡相关推荐

  1. camel_使用Apache Camel进行负载平衡

    camel 在此示例中,我们将向您展示如何使用Apache Camel作为系统的负载平衡器. 在计算机世界中,负载平衡器是一种充当反向代理并在许多服务器之间分配网络或应用程序流量的设备. 负载平衡器用 ...

  2. 使用Apache Camel进行负载平衡

    在此示例中,我们将向您展示如何使用Apache Camel作为系统的负载平衡器. 在计算机世界中,负载均衡器是一种充当反向代理并在许多服务器之间分配网络或应用程序流量的设备. 负载平衡器用于增加容量( ...

  3. apache camel_发掘Apache Camel的力量

    apache camel 最近几年,ESB软件越来越受欢迎. 如果大多数人通常知道什么是ESB,那么他们很少会清楚地了解这种体系结构的不同组件的确切作用. 例如,Apache ServiceMix由三 ...

  4. apache camel_学习Apache Camel –实时索引推文

    apache camel 在大多数软件开发项目中,有一点需要使应用程序开始与其他应用程序或第三方组件通信. 无论是发送电子邮件通知,调用外部api,写入文件还是将数据从一个地方迁移到另一个地方,您都可 ...

  5. apache.camel_使用Apache Camel 2.14的轻松REST端点

    apache.camel Apache Camel 最近发布了一个新版本 , 其中一些新功能由我的同事Claus Ibsen博客发布 . 您确实应该检查他的博客条目并深入研究更多细节,但是我一直希望尝 ...

  6. apache camel_探索Apache Camel Core –文件组件

    apache camel 文件轮询器是解决常见IT问题的非常有用的机制. Camel的内置file组件非常灵活,并且有许多选项可用于配置. 让我们在这里介绍一些常用用法. 轮询目录以输入文件 这是一条 ...

  7. apache camel_使用Apache Camel发布/订阅模式

    apache camel 发布/订阅是一种简单的消息传递模式,其中,发布者将消息发送到某个频道,而无需知道谁将接收消息. 然后,通道负责将消息的副本传递给每个订户. 此消息传递模型可以创建松耦合和可伸 ...

  8. apache cxf_Apache CXF负载平衡和故障转移

    apache cxf 不久前,我们已经面临了基于Apache CXF的负载平衡Web服务客户端的需求. 此外,当某些服务器关闭时,客户端应自动进行故障转移. 更糟糕的是,服务器目标地址列表要从外部服务 ...

  9. Apache CXF负载平衡和故障转移

    前一段时间,我们已经面临基于Apache CXF的负载平衡Web服务客户端的需求. 此外,当某些服务器关闭时,客户端应自动进行故障转移. 更糟糕的是,服务器目标地址列表要从外部服务获取并在运行时更新. ...

最新文章

  1. CBNet和DetectoRS:COCO数据集霸榜模型
  2. HTML 中的字符实体集
  3. php跳过一段html,PHP_一段能瞬间秒杀所有版本IE的简单HTML代码,许多人都非常讨厌Internet Explore - phpStudy...
  4. android 知识点大全 面试
  5. AI智能语音识别算法原理 四
  6. 工商银行近20年实时大数据平台建设历程
  7. swustoj 143 汉诺塔
  8. java并发编程——创建线程之Thread 和 Runnable
  9. 习题4-1 求奇数和 (15分) 本题要求计算给定的一系列正整数中奇数的和
  10. 用低维向高维“穿梭”的想法来理解高维空间
  11. 离散数学中Warshall算法简析
  12. 西交《物理化学》在线作业
  13. Excel怎么将表格中的所有空白行删除
  14. 一个生成随机密码的WPF小程序
  15. php 大数据量及海量数据处理算法总结
  16. 2018ACM杰出科学家名单公布,12 位华人学者上榜
  17. word换pdf并且自动生成目录
  18. 前端开发:使用HTML5简单实现嫦娥奔月动画
  19. 发那科机器人GI分配_发那科机器人调试离线编程与应用 “I/O的分配”
  20. mysql实时采集Excel数据_通过mysql数据库excel表格数据采集汇总

热门文章

  1. 线性筛素数的实现与证明
  2. P5895-[IOI2013]dreaming梦想【树的直径,结论】
  3. jzoj100044-abcd【多重背包,二进制压缩,dp】
  4. nssl1195-健美猫【???】
  5. ssl1104-USACO 2.1城堡(foodfill)【图论,广搜】
  6. 行列式、LGV、矩阵树学习笔记
  7. Korney Korneevich and XOR(CF750F1/F2)
  8. 【数学】异或(jzoj 2298)
  9. Sentinel(十九)之主流框架的适配
  10. 实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例