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項目
現在編輯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进行负载平衡的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dynamodb java_使用Java
- 下一篇: lombok 自动使用_Lombok,自