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; 免费企业邮…

【四】初步预测

import time from lxml import etree from collections import defaultdict import math import requests from matplotlib import pyplot as plt import pandas as pd import datetimed = defaultdict(list) listp = list()# 90+进球球队 setp = set()Allset = set()def httpg…

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

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

msf如何升级_Kali linux 2016.2(Rolling)中的Metasploit如何更新与目录结构初步认识...

如何更新MSF1、Windows平台方法1&#xff1a;运行msfupdate.bat在msfconsole里执行命令svn update或者方法2&#xff1a;2、unix/linux平台方法1&#xff1a;运行msfupdate即可。方法2&#xff1a;(比较麻烦)安装subversion客户端(--with-ssl)&#xff0c;之后连接CVS server进…

【五】每个球队胜率统计

import time from lxml import etree from collections import defaultdict import math import requests from matplotlib import pyplot as plt import pandas as pd import datetimed = defaultdict(list) listp = list()# 近七天比赛所有球队 listall = list()# 近七天所有…

jaxb注解使用_使用JAXB的简介

jaxb注解使用我正在将一些依赖于Apache XMLBeans的模块迁移到JAXB。 这是令人兴奋和充满挑战的几天。 我想记下我遇到的一些重要事情&#xff0c;以供将来可能会发现有用的任何人使用。 首先&#xff0c;让我们来看一下设置用于JAXB代码生成的maven插件。 在撰写本文时&#x…

离散信号的抽取和内插例题_信号与系统例题分析

第1章 信号及其基本运算1.1 内容要点1.2 公式摘要1.3 例题分析例1.1 连续时间信号与波形例1.2 离散时间信号与波形例1.3 信号的积分运算例1.4 单位冲激信号的筛选特性例1.5 信号的平移例1.6 信号的求和、积分运算例1.7 卷积的两种计算方法例1.8 卷积的位移特性例1.9 卷积概念的…

dynamodb java_使用Java扫描DynamoDB项目

dynamodb java在之前的文章中&#xff0c;我们介绍了如何查询DynamoDB数据库 查询DynamoDB第1部分 查询DynamoDB第2部分 。 除了发出查询之外&#xff0c;DynamoDB还提供扫描功能。 扫描所做的是获取您在DynamoDB表上可能拥有的所有项目。 因此&#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写的hadoop实战_Hadoop实战

Hadoop实战1 Hadoop简介1.1 什么是Hadoop1.1.1 Hadoop概述1.1.2 Hadoop的历史1.1.3 Hadoop的功能与作用1.1.4 Hadoop的优势1.1.5 Hadoop的应用现状和发展趋势1.2 Hadoop项目及其结构1.3 Hadoop的体系结构1.3.1 HDFS的体系结构1.3.2 MapReduce的体系结构1.4 Hadoop与分布式开发1…

mfc 弹簧_弹簧活性样品

mfc 弹簧Spring-Reactive旨在为基于Spring的项目带来响应式编程支持 &#xff0c;并且有望在Spring 5的时间表中提供。 我的意图是使用此模型为REST端点行使一些非常基本的签名。 在继续之前&#xff0c;请允许我确认整个样本完全基于塞巴斯蒂安德勒兹&#xff08;SbastienDel…

【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(…

layui按钮展开、_layui可折叠的组织架构树形图

layui.config({base: module/}).extend({treetable: treetable-lay/treetable}).use([layer, table, treetable], function () {var $ layui.jquery;var table layui.table;var layer layui.layer;var treetable layui.treetable;// 渲染表格var renderTable function () …

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

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

python psycopg2使用_Python中用psycopg2模块操作PostgreSQL方法

其实在Python中可以用来连接PostgreSQL的模块很多&#xff0c;这里比较推荐psycopg2。psycopg2安装起来非常的简单(pip install psycopg2)&#xff0c;这里主要重点介绍下如何使用。安装psycopg2模块&#xff1a;怎么验证是否已经安装过psycopy2?编写上面代码&#xff0c;运行…

java ee7帮助文档_帮助推动Java EE向前发展

java ee7帮助文档如果您还记得我写的题为《 Java EE 8&#xff1a;当前状态是什么》的文章 &#xff0c;很明显&#xff0c;Java EE的发展无疑在过去几个月中有所放缓。 肯定有一些Java EE下的JSR具有比其他JSR更多的活动&#xff0c;但是自JavaOne 2015以来&#xff0c;整个Ja…

【数论系列】集合

1.集合&#xff1a;我们把研究对象统称为元素&#xff0c;把一些元素组成的的总体叫作集合。 集合满足三个特性&#xff0c;即 确定性 &#xff0c; 无序性&#xff0c; 互异性 gather [1, 2, 3, 4, 5, 6] 2. 元素与集合的关系&#xff0c;只有&#xff08;属于&#xff09…

java解码_Java数组已排序解码

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

it企业实习_IT公司实习报告总结

IT公司实习报告总结在IT公司进行实习是一种怎样的体验?不妨为自己做一下实习报告总结&#xff0c;下面为各位提供IT公司实习报告总结范文&#xff0c;以作参考!正式实习开始是7月8号&#xff0c;结束于8月7号&#xff0c;还满有意思&#xff0c;78颠倒一下.对于实习&#xff0…