初识开源集成框架Apache Camel

2,251 阅读8分钟

什么是Camel

首先我们学习一个技术,我们首先要进入到它的官网。Home - Apache Camel image.png 可以看到官网是这样描述的: Camel是一个可以让你非常容易集成各种系统进行消费使用或者生产数据的开源的集成框架。

image.png

额,如果你学习过或者已经掌握过Camel,那么这句描述是十分准确和简洁的。否则可能还是一头雾水。我们接着看What is Camel?

image.png

Apache Camel 是一个基于已知企业集成模式(EIP)的通用开源集成框架。

什么是EIP呢?目前我们可以不用深入了解,只要知道有点类似设计模式就行。

Camel 使您能够使用各种特定于域的语言(DSL,例如 Java、XML、Groovy、Kotlin 和 YAML)定义路由和中介规则。这意味着您可以在 IDE 中智能完成路由规则,无论是在 Java 还是 XML 编辑器中。DSL就类似于SpringBoot中的配置方式,可以使用XML文件配置,也可以使用Java Config 进行配置。其中的路由则是Camel的重要概念。

Apache Camel使用uri直接与任何类型的传输或消息模型(如HTTP、Kafka、JMS、JBI、SCA、MINA或CXF)以及可插拔组件和数据格式选项一起工作。Apache Camel是一个小型库,具有最小的依赖关系,可以轻松嵌入到任何Java应用程序中。Apache Camel允许您使用相同的API,而不管使用哪种类型的传输,因此一旦学习了API,您就可以与开箱即用的所有组件进行交互。所谓的组件也是Camel的重要概念,上文提到的HTTP、Kafka、JMS、JBI、SCA、MINA或CXF都是组件,目前Apache Camel支持了超过300多个组件。

image.png

Apache Camel 提供对 Bean Binding 的支持以及与 Spring 等流行框架的无缝集成。 Camel 还为您的路线单元测试提供广泛的支持。后续我们会讲Spring Boot如何集成Apache Camel。

以下项目可以利用 Apache Camel 作为路由和调解引擎:

  • Apache ServiceMix — a popular distributed open source ESB and JBI container
  • Apache ActiveMQ — a mature, widely used open source message broker
  • Apache CXF — a smart web services suite (JAX-WS and JAX-RS)
  • Apache Karaf — a small OSGi based runtime in which applications can be deployed
  • Apache MINA — a high-performance NIO-driven networking framework

其实看了这么多其实还是一头雾水,不用害怕我前面也和大家一样。学习一样新技术前,我们不要过多纠结于前期概念的理解,结合上实践我们以后就会体会到当前的描述是有多准确和精妙。目前我们只需要记住:不要去理解要去感受。

官网介绍的最后,也知道我们会一头雾水,所以又说到

Too many buzzwords — what exactly is Camel?Okay, so the description above is technology focused. There’s a great discussion about Camel at Stack Overflow. We suggest you view the post, read the comments, and browse the suggested links for more details.

我们可以进去Stack Overflow可以看看里面对问题的解答。 image.png

我认为以更容易理解的方式来描述这一点...... 为了了解 Apache Camel 是什么,您需要了解什么是企业集成模式。 让我们从我们可能已经知道的内容开始:单例模式、工厂模式等;它们只是组织问题解决方案的方法,但它们本身并不是解决方案。当四人帮出版他们的书《设计模式》时,他们为我们其他人分析和提取了这些模式。它们节省了我们中一些人思考如何最好地构建代码的巨大精力。 就像四人帮一样,Gregor Hohpe 和 Bobby Woolf 撰写了《企业集成模式 (EIP)》一书,其中他们提出并记录了一组新模式和蓝图,以帮助我们最好地设计基于组件的大型系统,其中组件可以在同一进程或不同机器上运行。 他们基本上建议我们将系统构建为面向消息的——组件之间使用消息作为输入和输出进行通信,而绝对没有其他任何东西。它们向我们展示了一套完整的模式,我们可以从中选择并在不同的组件中实现这些模式,这些组件将共同形成整个系统。

EIP正如我们前文提到的一样,它和设计模式类似。设计模式中的单例模式、工厂模式等。它们只是解决问题的方法,它本身不是一种实际的解决方案。当四人帮出版《设计模式》时,他们为我们其他人分析和提取了这些模式。节省了我们中一些人思考如何最好构建代码的巨大精力。就像是一本内功心法一样给我们提供了强大的内力,但它并没有实际提供我们在武学招式上的进步和工作中的解决方案,还是需要我们在实际中权衡利弊,结合需求。EIP和设计模式一样,不过它们的应用场景是不同的,EIP建议我们将系统构建为面向消息的——组件之间使用消息作为输入和输出进行通信,而绝对没有其他任何东西。它们向我们展示了一套完整的模式,我们可以从中选择并在不同的组件中实现这些模式,这些组件将共同形成整个系统。

那么什么是Apache Camel? Apache Camel 为您提供 EIP 接口、基础对象、常用实现、调试工具、配置系统和许多其他帮助程序,当您想要实现遵循 EIP 的解决方案时,这些帮助程序将为您节省大量时间。 以 MVC 为例。 MVC 理论上非常简单,我们可以在没有任何框架帮助的情况下实现它。但是好的 MVC 框架为我们提供了随时可用的结构,并且在创建大型 MVC 项目时付出了额外的努力并考虑了您需要的所有其他“侧面”事物,这就是我们大多数时候使用它们的原因。 这正是 Apache Camel 对于 EIP 的作用。对于想要实施其解决方案以遵循 EIP 的人们来说,这是一个完整的生产就绪框架。

Apache Camel 对于 EIP 的作用。对于想要实施其解决方案以遵循 EIP 的人们来说,这是一个完整的生产就绪框架。我们可以轻松的使用Apache Camel实现EIP。 后续我们也会通过Apache Camel来实现相关的EIP。

至于为啥取名叫Camel即骆驼呢?我想通过前文一大段的介绍,我们可以知道Camel是一个可以从各种系统中生产或消费使用的一个开源集成框架。就好像骆驼一样作为一个交通和运输工具,从一个地方把货物运输到另一个地方。那么作为Java最重要的Spring生态,有没有一个和他对标的框架呢?答案是有的:Spring integration

第一个Camel程序

作为Camel的第一个程序,这次我们不是输出”Hello World“。而是通过一个小案例,来让你明白使用Camel的简洁和高效。当然我们也可以通过文档的GETTING STARTED来学习我们的第一个Camel应用。camel.apache.org/camel-core/…

image.png

它这里也提供了 first Camel Project。

mvn archetype:generate -B -DarchetypeGroupId=org.apache.camel.archetypes -DarchetypeArtifactId=camel-archetype-java -DarchetypeVersion=3.18.4 -Dpackage=org.apache.camel.learn -DgroupId=org.apache.camel.learn -DartifactId=first-camel-integration -Dversion=1.0.0-SNAPSHOT

只要你配置了Maven的环境变量,同时JDK11+。就可以在命令行中输入这个命令,下载这个官方提供的Maven项目。这里也对这个项目进行了一些详细的描述。大家可以有空去运行看一看。

我们这里提供的这个案例是需要做一个文件复制。将指定文件夹中的文件复制到指定的输出文件夹。

image.png

不使用Camel

如果使用Java,我相信大家也可以写出来。

package camelinaction;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class FileCopier {

    public static void main(String args[]) throws Exception {
        File inboxDirectory = new File("C:/Users/kylin/Desktop/test");
        File outboxDirectory = new File("C:/Users/kylin/Desktop/copy");
        
        outboxDirectory.mkdir();
        
        File[] files = inboxDirectory.listFiles();
        for (File source : files) {
            if (source.isFile()) {
                File dest = new File(
                        outboxDirectory.getPath() 
                        + File.separator 
                        + source.getName()); 
                copyFile(source, dest);
            }
        }
    }
    
    private static void copyFile(File source, File dest) 
        throws IOException {
        OutputStream out = new FileOutputStream(dest);
        byte[] buffer = new byte[(int) source.length()];
        FileInputStream in = new FileInputStream(source);
        in.read(buffer);
        try {
            out.write(buffer);
        } finally {
            out.close();      
            in.close();
        }
    }

}

以上的代码有30多行,而且可能让你写也不可能很快准确无误的写出来,而且还需要一定时间的调试。

使用Camel

首先要创建一个Maven项目引入Camel的依赖。

 <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-core</artifactId>
    <version>3.21.2</version>
  </dependency>

需要注意的是这个版本最低是需要JDK11+的。Downloads - Apache Camel

image.png

接着使用Camel完成上述需求只需要短短的几行~

import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;

public class FileCopierWithCamel {

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

        // add our route to the CamelContext
        context.addRoutes(new RouteBuilder() {
            public void configure() {
                from("file:C:/Users/kylin/Desktop/test?noop=true").to("file:C:/Users/kylin/Desktop/copy");
            }
        });

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

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

}
  1. 首先创建了一个CamelContext.
  2. 添加我们的路由到CamelContext.
  3. 启动这个路由并且开始工作.
  4. 停止这个CamelContext.

点击运行可以成功的看见将桌面上的test文件夹中的文件复制到了桌面上的copy文件夹中。相信通过了这个对比,你可能知道了Apache Camel是多么的简洁高效了~

到此为止对于Apache Camel的介绍和第一个Camel应用已经讲完了,之后我们继续深入浅出Camel吧~

image.png