基本的Apache Camel负载均衡器故障转移示例

5

首先我想让你知道我是新手,最近才掌握了Camel的主要概念。

我正在尝试使用Apache-Camel和ActiveMQ作为代理,并使用jms-component作为负载均衡器的客户端创建一个基本的工作示例。如果可能的话,所有这些都只使用Java DSL。

该示例由4个主要应用程序组成,称为MyApp-A、MyApp-B、MyApp-C和MyApp-D。在正常情况下,MyApp-A从我的计算机中读取文件,然后将其转换为消息。然后它将该消息发送到MyApp-B,MyApp-B将其发送到MyApp-C。

enter image description here

然而,存在故障场景。在这种情况下,MyApp-A无法将消息发送到MyApp-B。然后,它将该消息发送到MyApp-D,MyApp-D再将其发送到MyApp-C。

enter image description here

以下是MyApp-A的代码:

public class MyApp-A {

    public static void main(String args[]) throws Exception {
        // create CamelContext
        CamelContext context = new DefaultCamelContext();

        // connect to embedded ActiveMQ JMS broker
        ConnectionFactory connectionFactory = 
            new ActiveMQConnectionFactory("vm://localhost");
        context.addComponent("jms",
            JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));

        // add our route to the CamelContext
        context.addRoutes(new RouteBuilder() {
            @Override
            public void configure() {
                from("file:data/inbox?noop=true")loadbalancer().failover().to("MyApp-B:incomingOrders").to("MyApp-D:incomingOrders").end();
            }
        });

        // start the route and let it do its work
        context.start();
        Thread.sleep(10000);

        // stop the CamelContext
        context.stop();
    }
}

我考虑使用camel-ftp,但它不起作用,因为MyApp-C不知道MyApp-B已经停止工作,并且也不知道它必须从MyApp-D获取。
现在我有几个问题:
1. 如何将消息(在此情况下是文件)从MyApp-A发送到另一个应用程序的MyApp-B?在Java DSL的.to(String)方法中,我应该放什么?
2. 我该如何编写MyApp-B?如何使其从A(可能是不同机器上的不同应用程序)接收消息并将其发送到MyApp-C(如果我找出了如何从MyApp-A发送到MyApp-B,我会知道如何从MyApp-B发送到MyApp-C)?
3. MyApp-A如何检测到MyApp-B失败?
4. 我应该使用哪个camel组件?
如果您能对我的代码提供任何反馈,并帮助解决问题,我将不胜感激。
1个回答

3

经过不懈努力,我已经找到了一种方法,可以基于apache提供的负载均衡器示例来实现这个功能。

我已将Eclipse项目上传至我的Github账户,您可以在此处检查其工作情况:

尽管我的示例尊重整体架构,但仍有一些差异如下所述:
  • 它使用Spring DSL而不是Java DSL
  • MyApp-A是负载均衡器。 每10次生成报告(而不是读取文件),并将其发送到MyApp-B。
  • MyApp-B对应于localhost:9991上的MINA服务器1
  • MyApp-C对应于localhost:9993上的MINA服务器3
  • MyApp-D对应于localhost:9992上的MINA服务器2
  • 当MyApp-C接收到报告时,它会将其发送回MyApp-A
此外,还不清楚MyApp-C何时、在哪里或为什么会用更改后的报告回复MyApp-A。Spring DSL代码中没有指定这种行为,到目前为止,没有人能够解释为什么会发生这种情况。因此存在两个问题:
  1. 如何使用Java DSL完成此操作
  2. 为什么MyApp-C会回复MyApp-A,以及它是如何做到的?
如果您感兴趣,这里是我创建的README.txt,其中包含有关问题的准确描述:

使用MINA实现负载均衡示例

此示例演示了如何轻松使用Camel-MINA组件设计解决方案,以实现容错解决方案,即在服务器宕机时重定向请求。这些服务器是由Apache MINA框架创建的简单TCP/IP服务器,并在单独的JVM中运行。

在本示例中,负载均衡器客户端每10秒生成一份报告,并将该报告发送到运行在localhost:9991上的MINA服务器。然后,该服务器将报告转发到运行在localhost:9993上的MINA服务器,后者将报告返回给客户端,以便在控制台上打印出来。每个MINA服务器都会更改消息正文,以便您可以看到报告必须使用的路由。如果由于某种原因(例如您按下CTRL + C),运行在localhost:9991上的MINA服务器已关闭,则负载均衡器将自动开始使用运行在localhost:9992上的MINA服务器。一旦此MINA服务器接收到报告,它将像从未发生过一样将其发送回运行在localhost:9993上的MINA服务器。如果localhost:9991再次启动,则负载均衡器将重新开始使用它。

无论如何,负载均衡器始终尝试先使用localhost:9991,然后再尝试使用localhost:9992。

运行示例

要在您的Maven仓库中编译和安装项目,请在项目根目录上执行以下命令:

mvn clean install

要运行示例,请在相应的文件夹中执行以下命令:

mina1:
mvn exec:java -Pmina1

mina2: mvn exec:java -Pmina2

mina3: mvn exec:java -Pmina3

负载均衡: mvn exec:java -Ploadbalancer

如果遇到任何问题,请在Camel论坛上告诉我们
http://camel.apache.org/discussion-forums.html


Pedro Martins!


编辑

在之前的帖子中,我有两个问题: 1. 如何在Java DSL中实现这个 2. 为什么mina服务器会发送回复。

我最终会解决问题1,但是我只想声明问题2的解决方案在这里: http://camel.465427.n5.nabble.com/Load-balancing-using-Mina-example-with-Java-DSL-td5742566.html#a5742585

感谢Claus先生提供的答案和建议。


编辑

现在这两个问题都已经解决,它们都在同一个git仓库中。我希望我的代码能帮助到大家。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接