apache camel_使用Apache Camel进行负载平衡

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项目

创建一个简单的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lombok 自动使用_Lombok,自动值和不可变项

lombok 自动使用我喜欢布兰登&#xff08;Brandon &#xff09;在博客文章中比较Project Lombok &#xff0c; AutoValue和Immutables的建议 &#xff0c;而这篇文章试图做到这一点。 我已经简要概述了Project Lombok &#xff0c; AutoValue和Immutables &#xff0c;但是这篇…

邮箱批量登录接验证码_记一次莫名的需求(临时邮箱|企业邮箱)

目录&#xff1a;前言行情伪需求过程1.前戏2.买域名3.网易企业邮箱4.模糊的需求5.晚饭后6.临时邮箱16.临时邮箱27.域名版临时邮箱8.遇见问题8.1.DNSPOD8.2.换种思路拓展1.思路2.后续2.1.简单2.2.自建临时邮箱后话记一次需求不明的亏看完这篇文章你会学到&#xff1a; 免费企业邮…

java 补充日期_Java 9对可选的补充

java 补充日期哇&#xff0c;人们真的对Java 9对Stream API的添加感兴趣。 想要更多&#xff1f; 让我们看一下…… 可选的 可选::流 无需解释&#xff1a; Stream<T> stream();想到的第一个词是&#xff1a; 终于 &#xff01; 最后&#xff0c;我们可以轻松地从可选…

【Python科学计算系列】行列式

1.二元线性方程组求解 import numpy as np a np.array([[3, -2], [2, 1]]) b np.array([12, 1]) d np.linalg.solve(a, b) print(d) 2.三阶行列式求值 import numpy as np a np.array([[1, 2, -4], [-2, 2, 1], [-3, 4, -2]]) d np.linalg.det(a) print(d) 3.行列式的余…

【Python科学计算系列】矩阵

1.矩阵的幂计算&#xff08;设计思想&#xff1a;递归&#xff09; #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np def matrixPow(Matrix,n):if(type(Matrix)list):Matrixnp.array(Matrix)if(n1):return Matrixelse:return np.matmul(Matrix,matrixPow(…

swarm 本地管理远程_带有WildFly Swarm的远程JMS

swarm 本地管理远程我再次在博客中谈论WildFly群&#xff1f; 简短的版本是&#xff1a;我需要对远程JMS访问进行测试&#xff0c;并且拒绝设置复杂的功能&#xff08;如完整的应用程序服务器&#xff09;。 这个想法是要有一个简单的WildFly Swarm应用程序&#xff0c;该应用程…

java解码_Java数组已排序解码

java解码排序是我们在计算机科学中学习的第一个算法。 排序是一个非常有趣的领域&#xff0c;它有大约20多种算法&#xff0c;而且总是很难确定哪种算法最好。 排序算法的效率是根据占用的时间和所需的空间来衡量的。 一些时间气泡排序是最好的&#xff0c;因为它没有空间需求&…

【数论系列】反函数

一、判断反函数是否存在&#xff1a; 由反函数存在定理&#xff1a;严格单调函数必定有严格单调的反函数&#xff0c;并且二者单调性相同&#xff1a; 1、先判读这个函数是否为单调函数&#xff0c;若非单调函数&#xff0c;则其反函数不存在。 设yf(x)的定义域为D&#xff…

java附加属性_Java 9附加流

java附加属性Java 9即将发布&#xff01; 它不仅仅是Jigsaw项目 。 &#xff08;我也很惊讶。&#xff09;它给平台带来了很多小的变化&#xff0c;我想一一看一下。 我将标记所有这些帖子&#xff0c;您可以在这里找到它们。 让我们从…开始 流 Streams学习了两个新技巧。 第…

envi最大似然分类_闲谈最大后验概率估计(MAP estimate)amp;极大似然估计(MLE)和机器学习中的误差分类...

上一篇文章中提到了一个有趣的实验&#xff0c;简单来说就是1-100中有若干个数字是“正确的”&#xff0c;只告诉其中一部分“正确的”数字&#xff0c;去猜全部“正确的”数字。为了严谨的去研究这个问题&#xff0c;我们需要将一些概念进行抽象。首先&#xff0c;把提前告知的…

html 完全复制div中的内容_LOL手游现在远非完全体,未来还有哪些端游内容会加入手游中?...

LOL手游上线已经有一段时间了&#xff0c;虽然绝大多数情况下LOL端游的内容被继承到了手游当中&#xff0c;但是仍然有一部分端游的内容尚未出现在手游之内。今天小编就带领大家来盘点一下&#xff0c;那些未来可能出现在手游当中的端游内容。排位赛ban选英雄机制Moba游戏排位赛…

光盘 机密_使用保险柜管理机密

光盘 机密您如何存储秘密&#xff1f; 密码&#xff0c;API密钥&#xff0c;安全令牌和机密数据属于秘密类别。 那是不应该存在的数据。 在容易猜测的位置&#xff0c;不得以纯文本格式提供。 实际上&#xff0c;不得在任何位置以明文形式存储它。 可以使用Spring Cloud Confi…

junit5 动态测试_JUnit 5 –动态测试

junit5 动态测试在定义测试时&#xff0c;JUnit 4有一个很大的弱点&#xff1a;它必须在编译时发生。 现在&#xff0c;JUnit 5将解决此问题&#xff01; Milestone 1 刚刚发布 &#xff0c;它带有全新的动态测试&#xff0c;可以在运行时创建测试。 总览 本系列中有关JUnit 5…

C++ 11 深度学习(十)原始字面量

你是否曾经为了各种json格式无法写入string中而烦恼&#xff0c;为了各种转义而烦恼。如下图 c11为我们带来了全新的解决方法 其新特性为使用. R"(xxxxxxxxxxxx)" ,此种形式可以使得以原有形式进行表现出来

交流伺服系统设计指南_交流设计

交流伺服系统设计指南软件设计至关重要。 它是应用程序的基础。 就像蓝图一样&#xff0c;它为所有背景的聚会提供了一个通用平台。 它有助于理解&#xff0c;协作和发展。 设计不应仅视为开发的要素。 它不应该仅仅存在于开发人员的脑海中&#xff0c;否则团队将发现它几乎无…

maven 父maven_Maven神秘化

maven 父maven由于我的Android开发的背景下&#xff0c;我比较习惯到Gradle &#xff0c;而不是Maven的 。 尽管我知道Gradle基于Maven&#xff0c;但我从未调查过幕后发生的事情。 在过去的一周中&#xff0c;我一直在尝试了解细节并找出Maven的不同组成部分。 什么是Maven M…

【WebRTC---序篇】(一)为什么要使用WebRTC

1.1.1自研直播客户端架构 一个最简单的直播客户端至少应该包括音视频采集模块,音视频编码模块,网络传输模块,音视频解码模块和音视频渲染模块五大部分。如下图所示 1.1.2拆分音视频模块 在实际开发中,音频和视频处理完全是独立的。如下图所示,经过细分后,音频采集与视频…

DFS深搜与BFS广搜专题

一般搜索算法的流程框架 DFS和BFS与一般搜索流程的关系 如果一般搜索算法流程4使用的是stack栈结构(先进后出&#xff0c;后进先出)那么就会越搜越深。即&#xff0c;DFS&#xff0c;DFS只保存当前一条路径&#xff0c;其目的是枚举出所有可能性。反之&#xff0c;如果流程4使…

cloud foundry_使用“另类” Cloud Foundry Gradle插件无需停机

cloud foundry我一直在尝试编写用于将应用程序部署到Cloud Foundry的gradle插件 &#xff0c;并在上一篇文章中写了有关此插件的文章 。 现在&#xff0c;我通过使用两种方法支持将无停机时间部署到Cloud Foundry中来增强此插件&#xff1a; 自动驾驶风格部署和更常用的蓝绿色风…

懒惰学习_懒惰评估

懒惰学习最近&#xff0c;我正在编写log4j附加程序&#xff0c;并希望在自定义附加程序创建过程中使用logger记录一些诊断详细信息&#xff0c;但是log4j初始化仅在创建附加程序实例后才完成&#xff0c;因此在此阶段记录的消息将被忽略。 我感到需要在自定义附加程序中进行延…